android - programar - peta haskell en español
Ejecutando un programa Haskell en el sistema operativo Android (6)
Forenote: esta es una extensión del hilo iniciado en /r/haskell
Vamos a empezar con los hechos:
- Android es un sistema operativo impresionante
- Haskell es el mejor lenguaje de programación del planeta.
Por lo tanto, claramente, combinarlos haría que el desarrollo de Android sea mucho mejor. Básicamente, me gustaría saber cómo puedo escribir programas Haskell para el sistema operativo Android. Mi pregunta es:
¿Cómo puedo hacer que un programa Haskell se ejecute / ejecute en el sistema operativo Android?
Creo que la respuesta general debe provenir de las transformaciones de fuente-> fuente, ya que la carga de objetos compartidos especialmente compilados parece ser un poco confuso (que involucra a ghc-> cy un paso c-> java en las respuestas anteriores). Esta pregunta, por lo tanto, cae bajo el encabezado de Haskell en la JVM, que se ha tried (con un paso como una representación intermedia de Java) y se ha discussed en detalle. Podría usar frege si las bibliotecas que necesita se compilan allí. Los únicos pasos restantes serían los inicios de la API de la infraestructura de Android traducida en acciones de IO () y tal vez una envoltura para crear el archivo XML y el apk de manifiesto.
Hay https://github.com/conscell/hugs-android un puerto del intérprete de HUGS Haskell para Android.
La forma de hacerlo es obtener primero un compilador de Haskell que puede apuntar a C con el NDK de Android que viene con un puerto GCC para arquitecturas ARM. JHC puede hacer esto de manera trivial con un archivo de estilo inf muy pequeño que describe la plataforma (tamaño de palabra, compilador c, etc.) Lo he hecho con el kit de desarrollo de Wii homebrew y fue bastante fácil. Sin embargo, jhc aún tiene algunos problemas de estabilidad con código complejo, como el uso de una pila de transformadores de mónada con IO, pero jhc ha mejorado mucho en los últimos 6 meses. Solo hay una persona que trabaja en JHC. Solo deseaba que más personas pudieran ayudarlo.
La otra opción es crear un puerto "no registrado" de GHC que apunte a ndk gcc, este es un proceso mucho más complicado porque GHC no es un verdadero compilador cruzado en este momento y usted necesita entender el sistema de compilación que partes necesita cambio. Otra opción es NHC, que puede compilarse en forma cruzada con C, como el GHC que necesita para construir un nhc que apunte a un compilador de C, el NHC no tiene muchas extensiones de Haskell como el GHC.
Una vez que tenga el compilador de Haskell orientado a NDK GCC, deberá escribir enlaces en el marco de código de pegamento JNI de NDK de Android (agregado desde android 2.3) o escribir código de pegamento JNI entre Java-C-Haskell, la primera opción es más fácil Solución y si recuerdo correctamente podría ser compatible con versiones anteriores de Android por debajo de 2.3.
Una vez que tenga esto, debe crear el código de Haskell como biblioteca compartida o biblioteca estática que se vincula al código de pegamento NDK de NDK (que a su vez es una biblioteca compartida). Que yo sepa, no se pueden ejecutar oficialmente ejecutables nativos en Android. Probablemente podría hacerlo con un teléfono rooteado, por lo que supongo que esto significa que no puede distribuir ejecutables nativos en la tienda de aplicaciones, incluso cuando el puerto NDK gcc puede generar ejecutables nativos muy bien. Esto también probablemente elimina la opción de usar LLVM a menos que pueda obtener el NDK JNI trabajando con LLVM.
El mayor obstáculo no es tanto obtener un compilador Haskell para Android (que sigue siendo un gran obstáculo). El mayor problema es que alguien necesita escribir APIs vinculantes para las bibliotecas de NDK, lo cual es una tarea enorme y la situación es peor si es necesario escribir el código de la interfaz de usuario de Android porque no hay API de NDK para esta parte del SDK de Android. Si quieres hacer un código de interfaz de usuario de Android en Haskell, alguien tendrá que escribir enlaces de Haskell a Java a través de JNI / C. A menos que haya un proceso más automatizado para escribir bibliotecas de enlace (sé que hay algunas, simplemente no están lo suficientemente automatizadas para mí), entonces las posibilidades de que alguien lo haga son bastante bajas.
L01man: ¿Hay un tutorial sobre cómo hacer esto? Para la primera parte, entiendo que tengo que descargar JHC. ¿Qué tengo que escribir en el archivo inf y cómo usarlo?
Tenga en cuenta que antes de responder a esta pregunta no he usado jhc desde que escribí esto originalmente y se han lanzado versiones más nuevas desde entonces, así que no sé qué tan estable es jhc actualmente en lo que respecta a la generación de código de programas Haskell más complejos. Esta es una advertencia para cualquier persona antes de considerar realizar un programa Haskell grande con JHC, debe hacer algunas pruebas pequeñas antes de comenzar.
jhc tiene un manual http://repetae.net/computer/jhc/manual.html y una sección sobre la configuración de la compilación cruzada y el archivo .ini con opciones: http://repetae.net/computer/jhc/manual.html#crosscompilation .
L01man: La segunda parte es una alternativa a la primera. No sé cómo hacer lo que dijiste en el tercero.
Antes de comenzar, debe tener algún conocimiento de C y sentirse cómodo con el uso de la interfaz de función extranjera (FFI) de Haskell y herramientas como hs2c. También debe estar familiarizado con el uso del NDK de Android y la creación de .apk con bibliotecas compartidas. Necesitará saber esto para interactuar entre C-Haskell, Java / C-Haskell y desarrollar programas Haskell para Android que pueda distribuir / vender oficialmente en la tienda del mercado.
L01man: Entiendo que su objetivo es crear un enlace para la API de Android. Pero ... ¿la cuarta parte dice que no podemos hacer .apk con Haskell?
.apk es solo un formato de archivo de paquete de aplicaciones y está construido con las herramientas que vienen con el SDK de Android (no NDK), esto tiene muy poco que ver con la creación de los binarios. Los paquetes de Android pueden contener bibliotecas compartidas nativas, esto es lo que será su programa Haskell y las bibliotecas estáticas / compartidas nativas se generan a través del NDK de Android.
Un lenguaje que recientemente me ha llamado la atención es Eta .
El compilador de Eta es una bifurcación de GHC 7.10 que tiene un back-end JVM. Es posible usar los archivos JAR generados para escribir aplicaciones de Android e incluso usar su Interfaz de función extranjera para llamar a las bibliotecas Java nativas de Android.
Brian McKenna ha escrito una publicación en el blog sobre cómo configurar un proyecto de Android Studio para usar una biblioteca Eta .
Una vez me topé con el mismo hilo de Reddit, pero era antiguo y los comentarios estaban cerrados. Envié un mensaje al OP, pero no estoy seguro de si llegó al destinatario. Mi sugerencia aquí (puede funcionar para los androides mayores donde las actividades nativas no fueron posibles).
Yo (desarrollado en Haskell hace algún tiempo, pero actualmente cambié a Smalltalk) actualmente estoy desarrollando un puerto de Squeak VM a Android. La forma en que estoy haciendo esto es similar a lo que podría tratarse en un proyecto de haskell-on-Android: un trozo de código C que debe llamarse desde Java parte de la aplicación (básicamente, todo lo que se puede hacer en Android es maneja varios eventos; una aplicación no puede sondear los eventos en sí y no tiene ningún bucle de eventos). En mi caso, el código es generado por las herramientas de construcción de Squeak VM, en el caso de haskell en Android, esto se emitirá desde el GHC de JHC o cualquier otra interfaz utilizada. Este repo puede valer la pena mirar:
http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project
Bajo "src" está el código Java que proporciona la interceptación de eventos del usuario y su envío al código nativo (consulte la clase CogView). El código C de la máquina virtual en sí no está completamente allí (vea squeakvm.org, la rama de Cog para eso), pero uno puede tener la idea. También se puede buscar en http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm que es la interfaz C para el intérprete (incluido el manejo de eventos del usuario, algún cronometraje, etc. )
Espero que esto ayude.
Dmitry
Hay https://github.com/neurocyte/android-haskell-activity demuestra la ejecución del código Haskell
.