218 votes

Exécution d’un programme de Haskell sur l’OS Android

Note préliminaire: Ce programme est une extension de la discussion a commencé sur /r/haskell

Commençons par les faits:

  • Android est l'un impressionnant Système d'Exploitation
  • Haskell est le meilleur langage de programmation sur la planète

Donc, clairement, en les combinant serait de faire du développement Android que beaucoup mieux. Donc en gros je voudrais juste savoir comment je peux écrire des programmes Haskell pour le système d'exploitation Android. Ma question est:

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

P. S. Ignorer les blagues ci-dessus parce que c'est une question honnête et je voudrais vraiment voir cela se produire.

80voto

snk_kid Points 2234

La façon dont vous le faire est de commencer par obtenir un compilateur Haskell qui peut cibler C avec l'android NDK qui est livré avec un port de GCC pour les architectures ARM. JHC peut carrément le faire avec une très faible inf fichier de style qui décrit la plate-forme (taille de mot, compilateur c, etc) je l'ai fait avec la Wii homebrew dev kit et il était assez facile. Cependant jhc a encore quelques problèmes de stabilité avec le code complexe comme l'utilisation d'une monade transformateur pile avec IO, mais jhc a été l'amélioration de beaucoup au cours des 6 derniers mois. Il y a une seule personne à travailler sur JHC j'ai juste souhaité que plus de gens pourraient l'aider.

L'autre option est de construire un "non" port de GHC ciblant le ndk gcc, c'est beaucoup plus le processus parce que GHC n'est pas un vrai cross-compilateur pour le moment et vous avez besoin de comprendre le système de compilation de ce que les pièces que vous avez besoin de changer. Une autre option est NHC qui peuvent cross-compiler en C, comme GHC vous avez besoin pour construire nhc, le ciblage d'un compilateur C, NHC n'a pas beaucoup de Haskell des extensions comme GHC.

Une fois que vous avez compilateur Haskell ciblage NDK GCC, vous aurez besoin d'écrire des fixations, soit le android NDK JNI colle le code-cadre (ajouté depuis android 2.3) ou vous devez écrire JNI colle le code entre Java-C-Haskell, la première option est la solution facile, et si je me souviens bien, en fait, pourrait être compatible avec les versions antérieures d'Android 2.3 ci-dessous.

Une fois que vous avez cela, vous devez générer du code Haskell en tant que bibliothèque partagée ou statique de la bibliothèque qui obtient dans le cadre de la NDK java colle le code (qui est une bibliothèque partagée). Pour autant que je suis conscient que vous ne pouvez pas officiellement exécuter des exécutables natifs sur android. Vous pourriez probablement faire avec un téléphone enracinée, donc je suppose que cela signifie que vous ne pouvez pas distribuer des exécutables natifs sur l'app store, même lorsque le NDK gcc port peut générer des exécutables natifs très bien. Ce aussi probablement tue l'option pour l'utilisation de LLVM, sauf si vous pouvez obtenir le NDK JNI de travail avec LLVM.

L'obstacle le plus important n'est pas tant d'obtenir un compilateur Haskell pour android (qui est toujours un grand obstacle) le plus gros problème est que certains on a besoin d'écrire de liaison Api pour NDK bibliothèques qui est une énorme tâche et la situation est pire si vous avez besoin d'écrire android code de l'INTERFACE utilisateur, car il n'y a pas NDK Api pour cette partie du SDK android. Si vous voulez faire l'INTERFACE utilisateur android code Haskell quelqu'un va devoir écrire Haskell pour les liaisons de Java via JNI/C. Sauf s'il y a une plus grande automatisation du processus de rédaction de liaison des bibliothèques (je sais il y en a, ils sont tout simplement pas automatisé assez pour moi) alors les chances de quelqu'un de le faire sont très faibles.

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

Veuillez noter avant de me répondre à cette question, je n'ai pas utilisé jhc pour très peu de temps depuis l'origine, j'avais écrit ceci, et les versions plus récentes ont été publiées depuis donc je ne sais pas comment la stabilité de l'jhc est actuellement quand il s'agit de la génération de code plus complexe Haskell programmes. C'est un avertissement à quiconque avant d'envisager de faire un grand Haskell programme avec JHC, vous devriez faire quelques petits tests avant de vous rendre en plein sur.

jhc dispose d'un manuel de http://repetae.net/computer/jhc/manual.html et une section sur la mise en place de cross-compilation et .fichier ini avec les 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 vous avez dit dans le la troisième.

Avant de commencer vous devez avoir quelques connaissances en C et être à l'aise avec l'utilisation de la Haskell étrangères interface de la fonction (FFI) et des outils tels que hs2c. Vous devez également être familiarisé avec l'utilisation de l'Android NDK et de la construction .apk avec les bibliothèques partagées. Vous aurez besoin de connaître ces à l'interface entre le C-Haskell, Java/C-Haskell et de développer Haskell programmes pour Android que vous pouvez officiellement distribuer/vendre sur le marché.

L01man: je comprends que son but est de créer une liaison pour le L'API Android. Mais... la 4ème partie dit que nous ne pouvons pas faire .apk avec Haskell?

.apk est juste un package d'application du format de fichier et est construit avec les outils fournis avec le SDK Android (pas NDK), cela a très peu à faire la construction de la binaires de lui-même. Android un colis peut contenir natif bibliothèques partagées, ce que votre Haskell programme et de la maternelle, partagé, les bibliothèques statiques sont générés via l'Android NDK.

16voto

gliptak Points 1322

Il n’y a https://github.com/neurocyte/android-haskell-activity démontrant `` code qui s’exécute.

9voto

Dmitry Points 121

Une fois, j'ai tombé sur le même thread Reddit, mais il était vieux, et les commentaires ont été fermés. J'ai envoyé un message à l'OP, mais je ne suis pas sûr de savoir si il atteint le destinataire. Ma suggestion ici (peut fonctionner pour les plus âgés des Androïdes où les activités ne sont pas possibles).

J' (développé en Haskell il y a quelques temps, mais actuellement passé à Smalltalk) suis en train de développer un port de Bruit machine virtuelle pour Android. La façon dont je le fais, c'est semblable à ce qui pourrait être traitée dans un haskell-sur-android projet: un morceau de code C qui doit être appelée à partir de Java le cadre de l'application (en gros tout ce qui peut être fait dans Android est de gérer les différents événements; une application ne peut pas sondage pour l'événement lui-même et n'a pas de boucle d'événement). Dans mon cas, le code est généré par le Bruit de la VM outils de construction, dans le cas de haskell sur android, ce sera la sortie de GHC de JHC ou que ce soit avant la fin utilisé. Ce repo peut être intéressant de regarder:

http://gitorious.org/~golubovsky/cogvm/dmg-béni/arbres/master/plates-formes/android/projet

En vertu de l' "src" il y a le code Java qui fournit pour les événements de l'utilisateur de l'interception et de les envoyer à du code natif (voir la CogView classe). Le code C de la machine virtuelle elle-même n'est pas complètement là (voir squeakvm.org la Cog de la branche pour ça), mais on peut se faire une idée. On peut aussi regarder sous http://gitorious.org/~golubovsky/cogvm/dmg-béni/arbres/master/plates-formes/android/vm qui est le C frontend pour l'interprète (y compris les événements de l'utilisateur de la manipulation, certains de chronométrage, etc.)

Espérons que cette aide.

Dmitry

9voto

conscell Points 61

Il n’y a https://github.com/conscell/hugs-android un interpréteur Haskell de port de câlins à Android.

6voto

David M. Rogers Points 101

Je pense que la réponse générale devraient provenir de la source->source de transformations, depuis le chargement spécialement compilé objets partagés semble être un peu de bidouille (impliquant ghc->c et c->java étape dans les réponses ci-dessus). Cette question tombe donc sous le titre de Haskell sur la JVM, qui a été essayé (avec une étape en tant que Java représentation intermédiaire) et discuté longuement. Vous pouvez utiliser frege si les bibliothèques que vous avez besoin de compiler. La seule étapes restantes seraient les débuts de l'Android cadre de l'API traduit en IO() des actions et peut-être un wrapper pour la construction du manifeste xml et apk.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X