Exécuter un programme Haskell sur le système d’exploitation Android

Note: Ceci est une extension du thread démarré sur / r / haskell

Commençons par les faits:

  • Android est un système d’exploitation impressionnant
  • Haskell est le meilleur langage de programmation de la planète

Par conséquent, il est clair que les combiner améliorerait considérablement le développement d’Android. Donc, je voudrais juste savoir comment écrire des programmes Haskell pour Android. Ma question est:

Comment puis-je obtenir un programme Haskell pour exécuter / exécuter sur le système d’exploitation Android?

Comment vous le faites en obtenant d’abord un compilateur Haskell capable de cibler C avec le NDK Android fourni avec un port GCC pour les architectures ARM. JHC peut le faire sortingvialement avec un très petit fichier inf style qui décrit la plate-forme (taille du mot, compilateur c, etc.) Je l’ai fait avec le kit de développement Wii homebrew et c’était assez facile. Cependant, jhc a toujours des problèmes de stabilité avec un code complexe, comme l’utilisation d’une stack de transformateurs monad avec IO, mais jhc s’est beaucoup amélioré au cours des 6 derniers mois. Il n’y a qu’une seule personne travaillant sur JHC. J’aurais souhaité que plus de personnes puissent l’aider.

L’autre option consiste à construire un port “non enregistré” de GHC ciblant le ndk gcc, ce processus est beaucoup plus complexe car GHC n’est pas un véritable compilateur croisé pour le moment et vous devez comprendre le système de construction. changement. Une autre option est NHC, qui peut se comstackr en C, tout comme GHC, vous devez construire nhc en ciblant un compilateur C, NHC n’a pas beaucoup d’extensions Haskell comme GHC.

Une fois que vous avez le compilateur Haskell ciblant NDK GCC, vous devez écrire des liens vers le code de colle NDK JNI Android (ajouté depuis Android 2.3) ou vous devez écrire le code de colle JNI entre Java-C-Haskell. solution et si je me souviens bien pourrait effectivement être rétrocompatible avec les versions précédentes d’Android ci-dessous 2.3.

Une fois que vous avez cela, vous devez créer du code Haskell sous forme de bibliothèque partagée ou de bibliothèque statique qui est liée au code de colle Java NDK (qui est lui-même une bibliothèque partagée). Autant que je sache, vous ne pouvez pas exécuter officiellement des exécutables natifs sur Android. Vous pourriez probablement le faire avec un téléphone rooté, donc je suppose que cela signifie que vous ne pouvez pas dissortingbuer des exécutables natifs sur l’App Store même lorsque le port NDK gcc peut générer des exécutables natifs. Cela supprime probablement aussi l’option d’utilisation de LLVM, à moins que vous ne puissiez faire fonctionner le NDK JNI avec LLVM.

Le plus gros obstacle n’est pas tant d’obtenir un compilateur Haskell pour Android (ce qui est encore un gros obstacle), mais le plus gros problème est que certains utilisateurs doivent écrire des API de liaison pour les bibliothèques NDK. besoin d’écrire le code de l’interface utilisateur Android parce qu’il n’y a pas d’API NDK pour cette partie du SDK Android. Si vous voulez faire du code d’interface utilisateur Android dans Haskell, quelqu’un devra écrire des liaisons Haskell vers Java via JNI / C. À moins qu’il y ait un processus plus automatisé pour écrire des bibliothèques de liaison (je sais qu’il y en a, elles ne sont tout simplement pas assez automatisées pour moi), les chances que quelqu’un le fasse sont plutôt faibles.

L01man: Existe-t-il un tutoriel sur la façon de procéder? Pour la première partie, je comprends que je dois télécharger JHC. Que dois-je écrire dans le fichier inf et comment l’utiliser?

Notez bien avant de répondre à cette question que je n’ai pas utilisé jhc depuis que j’ai écrit cette version et que de nouvelles versions ont été publiées depuis. Je ne sais donc pas si Jhc est stable pour générer des programmes Haskell plus complexes. Ceci est un avertissement pour quiconque avant que vous envisagiez de faire un grand programme Haskell avec JHC, vous devriez faire quelques petits tests avant de vous lancer.

jhc a un manuel http://repetae.net/computer/jhc/manual.html et une section sur la configuration de la compilation croisée et du fichier .ini avec des options: http://repetae.net/computer/jhc/manual .html # crosscompilation .

L01man: La deuxième partie est une alternative au premier. Je ne sais pas comment faire ce que vous avez dit dans le troisième.

Avant de commencer, vous devez avoir quelques connaissances sur le langage C et être à l’aise avec l’utilisation de l’interface de fonction étrangère (FFI) Haskell et des outils tels que hs2c. Vous devez également vous familiariser avec l’utilisation du NDK Android et la création de .apk avec les bibliothèques partagées. Vous devrez les connaître pour faire l’interface entre C-Haskell, Java / C-Haskell et développer des programmes Haskell pour Android que vous pouvez officiellement dissortingbuer / vendre sur le market store.

L01man: Je comprends que son objective est de créer une liaison pour l’API Android. Mais … la 4ème partie dit-elle que nous ne pouvons pas créer .apk avec Haskell?

.apk est juste un format de fichier de package d’application et est construit avec les outils fournis avec le SDK Android (pas NDK), cela a très peu à faire pour construire les binarys eux-mêmes. Les packages Android peuvent contenir des bibliothèques partagées natives, ce que sera votre programme Haskell et les bibliothèques natives partagées / statiques sont générées via le NDK Android.

Il y a https://github.com/neurocyte/android-haskell-activity démontrant le code Haskell cours d’exécution.

Je suis tombé sur le même thread Reddit, mais il était vieux et les commentaires étaient fermés. J’ai envoyé un message à l’OP, mais je ne suis pas sûr qu’il soit parvenu au destinataire. Ma suggestion ici (peut fonctionner pour les Androïdes plus âgés où les activités natives n’étaient pas possibles).

Je (développé en Haskell il y a quelque temps, mais actuellement en Smalltalk) développe actuellement un portage de Squeak VM vers Android. La façon dont je le fais est similaire à ce qui pourrait être traité dans un projet haskell-on-android: un morceau de code C qui doit être appelé depuis une partie de Java de l’application (tout ce qui peut être fait dans Android est de gérer différents événements, une application ne peut pas interroger les événements eux-mêmes et n’a pas de boucle d’événement). Dans mon cas, le code est généré par les outils de construction de Squeak VM, dans le cas de haskell sur Android, il sera produit par GHC de JHC ou par n’importe quel frontal utilisé. Ce repo peut valoir la peine de regarder:

http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/project

Sous “src”, il y a le code Java qui fournit l’interception des événements utilisateur et les envoie au code natif (voir la classe CogView). Le code C de la machine virtuelle elle-même n’est pas complètement là (voir squeakvm.org, la twig Cog pour cela), mais on peut avoir l’idée. On pourrait aussi regarder sous http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm qui est l’interface C de l’interpréteur (y compris la gestion des événements utilisateur, certaines fonctions de chronométrage, etc. )

J’espère que cela t’aides.

Dmitry

Je pense que la réponse générale devrait provenir des transformations source-> source, car le chargement d’objects partagés spécialement compilés semble être un peu compliqué (impliquant ghc-> c et une étape c-> java dans les réponses ci-dessus). Cette question fait donc partie de Haskell sur la JVM, qui a été essayée (avec une étape en tant que représentation intermédiaire Java) et discutée en détail. Vous pouvez utiliser frege si les bibliothèques dont vous avez besoin sont compilées. Les seules étapes restantes seraient les débuts de l’API du framework Android traduite en actions IO () et peut-être un wrapper pour la construction du manifeste xml et de l’apk.

Il y a https://github.com/conscell/hugs-android un port d’interprète HUGS Haskell pour Android.

Un langage qui a récemment attiré mon attention est Eta .

Le compilateur d’Eta est un fork de GHC 7.10 avec un backend JVM. Il est possible d’utiliser les fichiers JAR générés pour écrire des applications Android et même utiliser son interface de fonction étrangère pour appeler des bibliothèques Java Android natives.

Brian McKenna a écrit un article sur la façon de configurer un projet Android Studio pour utiliser une bibliothèque Eta .