Exécution d'un programme Haskell sur le système d'exploitation Android

216

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

Commençons par les faits:

  • Android est un système d'exploitation génial
  • Haskell est le meilleur langage de programmation de la planète

Par conséquent, il est clair que les combiner améliorerait le développement Android. Donc, essentiellement, je voudrais simplement savoir comment écrire des programmes Haskell pour le système d'exploitation Android. Ma question est:

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

Robert Massaioli
la source

Réponses:

81

Pour ce faire, vous obtenez d'abord un compilateur Haskell qui peut cibler C avec le NDK Android qui est livré avec un port GCC pour les architectures ARM. JHC peut le faire trivialement avec un très petit fichier de style inf qui décrit la plate-forme (taille des mots, compilateur c, etc.) Je l'ai fait avec le kit de développement homebrew Wii et c'était assez facile. Cependant, jhc a encore quelques problèmes de stabilité avec du code complexe comme l'utilisation d'une pile de transformateurs monade avec IO, mais jhc s'est beaucoup amélioré au cours des 6 derniers mois. Il n'y a qu'une seule personne qui travaille sur JHC. J'aurais juste souhaité que plus de personnes puissent l'aider.

L'autre option est de construire un port "non enregistré" de GHC ciblant le gcc ndk, c'est un processus beaucoup plus complexe car GHC n'est pas un vrai cross-compilateur pour le moment et vous devez comprendre le système de construction de quelles pièces vous avez besoin changement. Une autre option est NHC qui peut effectuer une compilation croisée en C, comme GHC dont vous avez besoin pour construire nhc ciblant un compilateur C, NHC n'a pas beaucoup d'extensions Haskell comme GHC.

Une fois que le compilateur Haskell cible NDK GCC, vous devrez écrire des liaisons vers le framework de code de colle NDK JNI Android (ajouté depuis Android 2.3) ou vous devez écrire du code de colle JNI entre Java-C-Haskell, la première option est la plus simple. et si je me souviens bien, il 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 en tant que bibliothèque partagée ou bibliothèque statique qui est liée au code de colle Java NDK (qui est lui-même une bibliothèque partagée). Pour autant que je sache, vous ne pouvez pas exécuter officiellement les 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 distribuer d'exécutables natifs sur l'App Store même lorsque le port gcc NDK peut générer très bien des exécutables natifs. Cela tue également probablement l'option d'utilisation de LLVM, sauf si vous pouvez faire fonctionner le NDK JNI avec LLVM.

Le plus grand obstacle n'est pas tant d'obtenir un compilateur Haskell pour Android (qui est toujours un gros obstacle), le plus gros problème est que quelqu'un a besoin d'écrire des API de liaison pour les bibliothèques NDK, ce qui est une tâche énorme et la situation est pire si vous besoin d'écrire le code de l'interface utilisateur Android car 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 à Java via JNI / C. À moins qu'il n'y ait un processus plus automatisé pour écrire des bibliothèques de liaisons (je sais qu'il y en a, elles ne sont tout simplement pas assez automatisées pour moi), alors les chances que quelqu'un le fasse sont assez 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?

Veuillez noter avant de répondre à cette question que je n'ai pas utilisé jhc depuis un certain temps depuis que j'ai écrit ceci et que des versions plus récentes ont été publiées depuis, donc je ne sais pas à quel point jhc est stable en ce qui concerne la génération de code de programmes Haskell plus complexes. C'est un avertissement à quiconque avant d'envisager 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 à la première. Je ne sais pas comment faire ce que tu as dit dans le troisième.

Avant de commencer, vous devez avoir une certaine connaissance de 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 être familiarisé avec l'utilisation du NDK Android et la création de .apk avec des bibliothèques partagées. Vous devrez les connaître pour interfacer entre C-Haskell, Java / C-Haskell et développer des programmes Haskell pour Android que vous pouvez officiellement distribuer / vendre sur la boutique du marché.

L01man: Je comprends que son objectif est de créer une liaison pour l'API Android. Mais ... est-ce que la 4ème partie dit que nous ne pouvons pas faire de .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 à voir avec la construction des binaires eux-mêmes. Les packages Android peuvent contenir des bibliothèques natives partagées, c'est ce que sera votre programme Haskell et les bibliothèques natives partagées / statiques sont générées via Android NDK.

snk_kid
la source
Je ne suis en aucun cas un expert Android. Mais aujourd'hui, je suis tombé sur cette nouvelle classe appelée NativeACtivity depuis l'API niveau 9 developer.android.com/reference/android/app/NativeActivity.html . Ils disent qu'il peut être utilisé pour implémenter des activités uniquement en code natif. Je me demande dans quelle mesure cela est pertinent / utile pour notre objectif? Cela n'implique-t-il pas la nécessité d'une interaction entre Haskell et Java?
Phil
@Po The NativeActivity fait partie du framework de code de colle NDK Android (Android 2.3) dont j'ai parlé. Il vous permettra d'écrire tout votre code en C / C ++ mais vous n'aurez pas d'exécutable natif, vous aurez une bibliothèque partagée qui sera appelée depuis Java. Si vous avez écrit des liaisons Haskell à NativeActivity, vous n'auriez pas besoin d'écrire des liaisons entre Java et Haskell, mais comme je l'ai mentionné, les API NDK sont un sous-ensemble des API Java complètes, il n'y a pas d'API natives pour l'interface utilisateur Android standard, par exemple, vous auriez pour écrire le vôtre dans OpenGL (ES) ou pour écrire des liaisons JNI-Haskell.
snk_kid
Existe-t-il un tutoriel sur la façon de procéder?
L01man
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? La deuxième partie est une alternative à la première. Je ne sais pas comment faire ce que tu as dit dans le troisième. Je comprends que son objectif est de créer une liaison pour l'API Android. Mais ... la 4ème partie dit-elle que nous ne pouvons pas faire de .apk avec Haskell?
L01man
@ L01man J'ai répondu à votre question dans la réponse principale en raison de la limite de caractères dans les commentaires.
snk_kid
17

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

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

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

Robert Massaioli
la source
16

Il y a https://github.com/neurocyte/android-haskell-activity démontrant l' Haskellexécution du code.

gliptak
la source
4
Fils d'un ... quelqu'un l'a fait! Gloire.
Robert Massaioli
Je vais y regarder de plus près bientôt. Si cela semble légitime, je vais changer la réponse marquée à celle-ci.
Robert Massaioli
Robert, cela semble légitime. Mais neurocyte ne semble pas offrir d'instructions détaillées sur la construction. Lire github.com/neurocyte/android-haskell-activity/issues/1
gliptak
9

Une fois, je suis tombé sur le même fil Reddit, mais il était ancien et les commentaires étaient fermés. J'ai envoyé un message au PO, mais je ne sais pas s'il a atteint le destinataire. Ma suggestion ici (peut fonctionner pour les androïdes plus anciens où les activités natives n'étaient pas possibles).

Je (développé à Haskell il y a quelque temps, mais actuellement en Smalltalk) développe actuellement un port de Squeak VM pour Android. La façon dont je fais cela est similaire à ce qui pourrait être traité dans un projet haskell-on-android: un morceau de code C qui doit être appelé à partir de la partie Java de l'application (essentiellement tout ce qui peut être fait dans Android est de gérer divers événements; une application ne peut pas interroger elle-même les événements et n'a pas de boucle d'événements). Dans mon cas, le code est généré par les outils de construction Squeak VM, dans le cas de haskell sur Android, cela sera généré par GHC of JHC ou tout autre frontal utilisé. Ce repo peut être intéressant à regarder:

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

Sous "src", il y a le code Java qui permet d'intercepter les événements utilisateur et de les envoyer au code natif (voir la classe CogView). Le code C de la VM elle-même n'est pas complètement là (voir squeakvm.org, la branche Cog pour ça), mais on peut avoir l'idée. On peut également 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, un certain chronométrage, etc. )

J'espère que cela t'aides.

Dmitry

Dmitry
la source
6

Je pense que la réponse générale devrait provenir des transformations source-> source, car le chargement d'objets 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 relève donc du titre de Haskell sur la JVM, qui a été essayé (avec une étape comme représentation intermédiaire Java) et longuement discuté . Vous pouvez utiliser frege si les bibliothèques dont vous avez besoin s'y compilent. Les seules étapes restantes seraient les débuts de l'API Android Framework traduits en actions IO () et peut-être un wrapper pour la construction du manifeste xml et apk.

David M. Rogers
la source
1
En fait, il existe une application Android vitrine écrite en Java et Frege, les détails sont ici groups.google.com/forum/#!topic/frege-programming-language/…
Ingo