web-dev-qa-db-fra.com

Exécution d’un programme Haskell sous le système d’exploitation Android

Note préalable: Ceci est une extension du thread démarré le / r/haskell

Commençons par les faits:

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

Par conséquent, il est clair que leur combinaison faciliterait grandement le développement de Android). J'aimerais donc savoir comment je peux écrire des programmes Haskell pour le Android OS . Ma question est:

Comment puis-je obtenir un programme Haskell pour exécuter/exécuter sur le = Android OS?

208
Robert Massaioli

Un langage récemment porté à 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 utiliser son interface de fonction étrangère pour appeler des bibliothèques natives Android Java.

Brian McKenna a écrit un article de blog sur comment configurer un projet Android Studio afin qu'il utilise une bibliothèque Eta .

12
Robert Massaioli

Pour ce faire, commencez par vous procurer un compilateur Haskell pouvant cibler C avec les architectures Android NDK fournies avec un port GCC pour les architectures ARM. JHC peut Pour ce faire, utilisez un très petit fichier de style inf qui décrit la plate-forme (taille de Word, c-compilateur, etc.). Je l’ai déjà fait avec le kit de développement Wii homebrew et c’était assez simple. comme utiliser une pile de transformateurs monad avec IO mais jhc s’est beaucoup améliorée au cours des 6 derniers mois. Il n’ya qu’une personne travaillant sur JHC pour laquelle je souhaitais simplement que plus de personnes puissent l’aider.

L’autre option consiste à créer un port "non enregistré" de GHC ciblant le ndk gcc. Il s’agit d’un processus 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 avec quelles parties. changement. Une autre option est NHC qui peut compiler de manière croisée en C, comme GHC dont vous avez besoin pour construire nhc en ciblant un compilateur C, NHC ne possède pas beaucoup d’extensions Haskell comme GHC.

Une fois que vous avez un compilateur Haskell ciblant le GCC NDK, vous devez écrire des liaisons dans le cadre Android du code de collage JNI NDK (ajouté depuis Android 2.3)] ou vous). doit écrire le code de collage JNI entre Java-C-Haskell, la première option est la solution la plus simple et, si je me souviens bien, pourrait être rétro-compatible avec les versions précédentes de Android inférieur à 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 NDK Java (qui est lui-même une bibliothèque partagée). Vous ne pouvez pas exécuter officiellement les exécutables natifs sur Android. Vous pouvez probablement le faire avec un téléphone enraciné, donc je suppose que cela signifie que vous ne pouvez pas distribuer les exécutables natifs sur l’app store même si le port gcc de NDK peut générer des exécutables natifs très bien. supprime l'option permettant d'utiliser LLVM, à moins que vous ne puissiez utiliser l'interface JNI NDK avec LLVM.

Le plus gros problème n’est pas vraiment d’obtenir un compilateur Haskell pour Android (qui est toujours un gros obstacle)], le plus gros problème est qu’il faut écrire des API de liaison pour les bibliothèques NDK, ce qui est un problème important. tâche énorme et la situation est pire si vous avez besoin d'écrire Android code d'interface utilisateur car il n'y a pas d'API NDK pour cette partie du Android SDK. Si vous voulez à faire Android Le code de l'interface utilisateur dans Haskell, quelqu'un devra écrire les liaisons Haskell vers Java via JNI/C. Sauf s'il existe un processus plus automatisé pour l'écriture de bibliothèques de liaison. (Je sais qu'il y en a, ils ne sont tout simplement pas assez automatisés pour moi), alors les chances que quelqu'un le fasse sont plutôt faibles.

L01man: Existe-t-il un tutoriel sur la procédure à suivre? 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 assez longtemps depuis que j’ai écrit cette version et que des versions plus récentes ont été publiées depuis. Ceci est un avertissement à tous ceux qui envisagent de faire un grand programme Haskell avec JHC, vous devriez faire de petits tests avant de continuer.

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 les options suivantes: 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 la troisième.

Avant de commencer, vous devez connaître un peu le langage C et maîtriser l’utilisation de l’interface de fonction étrangère Haskell (FFI) et d’outils tels que hs2c. Vous devez également être familiarisé avec l’utilisation du Android NDK et de la création de .apk avec des bibliothèques partagées. Vous devez également connaître ces notions pour établir une interface entre C-Haskell, Java/C-Haskell et développer des programmes Haskell pour. Android que vous pouvez officiellement distribuer/vendre sur le magasin du marché.

L01man: Je comprends que son objectif est de créer une liaison pour l'API Android. Mais ... la quatrième partie indique-t-elle que nous ne pouvons pas créer .apk avec Haskell?

.apk est juste un format de fichier de paquet d'application et est construit avec les outils fournis avec le Android SDK (pas NDK), cela n'a pas grand chose à faire de construire les binaires lui-même. Android peuvent contenir des bibliothèques partagées natives, ce sera votre programme Haskell et les bibliothèques natives partagées/statiques sont générées via le Android NDK.

80
snk_kid

Il y a https://github.com/neurocyte/Android-haskell-activity démontrant que Haskell code est en cours d'exécution.

15
gliptak

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

Je (développé à Haskell il y a quelque temps, mais qui est actuellement passé à Smalltalk) développe actuellement un port de Squeak VM sur Android). Cette façon de procéder est semblable à celle qui pourrait être traitée dans un projet haskell-on-Android: un bloc de code C qui doit être appelé à partir de Java partie 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 les événements elle-même et ne possède pas de boucle d'événement.) Dans mon cas, le code est généré par les outils de construction Squeak VM, dans le cas de haskell on Android ce sera la sortie de GHC de JHC ou de tout frontal utilisé. Ce repo peut valoir la peine d’être examiné:

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

Sous "src" il y a le code Java qui permet l'interception d'événements utilisateur et leur envoi au code natif (voir la classe CogView). Le code C de VM lui-même n’est pas complètement là (voir squeakvm.org, la branche Cog), mais on peut avoir l’idée. On pourrait aussi regarder sous http://gitorious.org/~golubovsky/cogvm/ dmg-blessed/trees/master/plates-formes/Android/vm qui est l'interface C avec l'interpréteur (y compris la gestion des événements utilisateur, la comptabilisation de l'heure, etc.)

J'espère que cela t'aides.

Dmitry

9
Dmitry

Il existe https://github.com/conscell/hugs-Android un port d'interpréteur HUGS Haskell pour Android.

7
conscell

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

6
David M. Rogers