Saltar al contenido

Ejecutar un programa Haskell en el sistema operativo Android

Te recomendamos que revises esta resolución en un ambiente controlado antes de enviarlo a producción, saludos.

Solución:

La forma de hacerlo es obtener primero un compilador Haskell que pueda apuntar a C con el NDK de Android que viene con un puerto GCC para arquitecturas ARM. JHC puede hacer esto trivialmente con un archivo de estilo inf muy pequeño que describe la plataforma (tamaño de palabra, compilador c, etc.) Lo hice con el kit de desarrollo de Wii homebrew y fue bastante fácil. Sin embargo, jhc todavía tiene algunos problemas de estabilidad con código complejo, como usar una pila de transformadores de mónadas con IO, pero jhc ha mejorado mucho en los últimos 6 meses. Solo hay una persona trabajando en JHC. Ojalá más personas pudieran ayudarlo.

La otra opción es construir un puerto “no registrado” de GHC dirigido a ndk gcc, este es un proceso mucho más complicado porque GHC no es un true compilador cruzado en este momento y necesita comprender el sistema de compilación qué partes necesita cambiar. Otra opción es NHC, que puede realizar una compilación cruzada en C, como GHC, necesita construir nhc dirigido a un compilador C, NHC no tiene muchas extensiones de Haskell como GHC.

Una vez que tenga el compilador Haskell dirigido a NDK GCC, deberá escribir enlaces al marco de código de pegamento JNI de Android NDK (agregado desde Android 2.3) o debe escribir código de pegamento JNI entre Java-C-Haskell, la primera opción es la más fácil solución y, si no recuerdo mal, podría ser compatible con versiones anteriores de Android por debajo de 2.3.

Una vez que tenga esto, debe compilar el código Haskell como biblioteca compartida o static biblioteca que se vincula al código de pegamento de java del NDK (que en sí mismo es una biblioteca compartida). Que yo sepa, no puedes 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 gcc del NDK puede generar ejecutables nativos sin problemas. Esto probablemente también elimine la opción de usar LLVM a menos que pueda hacer que el NDK JNI funcione 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 API vinculantes para las bibliotecas NDK, lo cual es una tarea enorme y la situación es peor si necesita 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 desea 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 vinculantes (sé que hay algunas, simplemente no están lo suficientemente automatizadas para mí), las posibilidades de que alguien lo haga son bastante bajas.

L01man: ¿Hay algún 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 durante bastante tiempo desde que escribí esto originalmente y desde entonces se han lanzado versiones más nuevas, por lo que no sé qué tan estable es jhc actualmente cuando se trata de la generación de código de programas Haskell más complejos. Esta es una advertencia para cualquiera que antes de considerar hacer un gran programa Haskell con JHC, debe hacer algunas pequeñas pruebas antes de continuar.

jhc tiene un manual http://repetae.net/computer/jhc/manual.html y una sección sobre cómo configurar la compilación cruzada y el archivo .ini con opciones: http://repetae.net/computer/jhc/manual .html#compilación cruzada.

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 funciones externas (FFI) de Haskell y herramientas como hs2c. También debe estar familiarizado con el uso de Android NDK 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 aplicación y está construido con las herramientas que vienen con el SDK de Android (no con el NDK), esto tiene muy poco que ver con la construcción de los archivos binarios en sí. Los paquetes de Android pueden contener bibliotecas compartidas nativas, así será su programa Haskell y las bibliotecas compartidas nativas/static Las bibliotecas se generan a través del NDK de Android.

Un idioma que me ha llamado la atención recientemente es el eta.

El compilador de Eta es una bifurcación de GHC 7.10 que tiene un backend JVM. Es posible usar los archivos JAR generados para escribir aplicaciones de Android e incluso usar su interfaz de función externa para llamar a las bibliotecas Java nativas de Android.

Brian McKenna escribió una publicación de blog sobre cómo configurar un proyecto de Android Studio para usar una biblioteca Eta.

Hay https://github.com/neurocyte/android-haskell-activity demostrando Haskell código en ejecución.

Te mostramos las reseñas y valoraciones de los usuarios

Ten en cuenta comunicar esta crónica si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *