在Android OS上运行一个Haskell程序

前言:这是在/ r / haskell上启动的线程的扩展

让我们从事实开始:

  • Android是一个很棒的操作系统
  • Haskell是这个星球上最好的编程语言

因此,显然,将它们结合起来会使Android的开发变得更好。 所以基本上我只想知道如何编写Android操作系统的Haskell程序。 我的问题是:

我怎样才能得到一个Haskell程序在Android操作系统上执行/运行?

PS忽略上面的笑话,因为这是一个诚实的问题,我真的希望看到这种情况发生。

你是怎么做到的,首先得到一个Haskell编译器,它可以将Android的NDK与ARM体系结构的GCC端口一起提供。 JHC可以用一个非常小的inf样式文件来描述平台(字的大小,C编译器等),我已经用Wii自制开发工具包做了这个,这很容易。 然而jhc在复杂的代码中仍然存在一些稳定性问题,比如在IO中使用monadvariables栈,但是jhc在过去的6个月里一直在改进。 JHC只有一个人在工作,我只是希望有更多的人能帮助他。

另一个select是build立一个针对ndk gcc的GHC的“未注册”端口,这是一个更为复杂的过程,因为GHC目前不是一个真正的交叉编译器,您需要了解构build系统需要哪些部分更改。 另一个选项是可以交叉编译为C的NHC,就像GHC一样,你需要构build针对C编译器的nhc,NHC没有像GHC那样的许多Haskell扩展。

一旦你有了针对NDK GCC的Haskell编译器,你将需要编写绑定到android NDK JNI胶合代码框架(自android 2.3以后添加),或者你必须在Java-C-Haskell之间编写JNI胶合代码,前者更容易解决scheme,如果我没有记错的话,可能实际上是向后兼容2.3以下的Android的以前的版本。

一旦你有了这个,你必须build立Haskell代码作为共享库或静态库链接到NDK Java胶水代码(它本身是一个共享库)。 据我所知,你不能在Android上正式运行本机可执行文件。 你也许可以用root电话来做,因此我认为这意味着即使NDK gcc端口可以生成本地可执行文件,也不能在应用程序存储区分发本地可执行文件。 这也可能会杀死使用LLVM的选项,除非您可以使用LLVM来获得NDK JNI。

最大的障碍不在于获得一个用于android的Haskell编译器(这仍然是一个很大的障碍),最大的问题是有些人需要为NDK库编写绑定API,这是一项艰巨的任务,如果你需要编写android UI代码,因为android SDK的这个部分没有NDK API。 如果你想在Haskell中执行android UI代码,那么有人必须通过JNI / C编写Haskell与Java的绑定。 除非有一个更自动化的过程来编写绑定库(我知道有一些,他们只是没有足够的自动化),那么一些人做这件事的机会是非常低的。

L01man:有没有关于如何做到这一点的教程? 对于第一部分,我知道我必须下载JHC。 我有什么要写在inf文件和如何使用它?

请注意,在我回答这个问题之前,我还没有使用jhc很长一段时间,因为我最初写这个和更新的版本已经发布了,所以我不知道jhc目前是多么稳定的代码生成更复杂的Haskell程序。 在你考虑用JHC制作一个大的Haskell程序之前,这是对任何人的警告,你应该在做完之前做一些小的testing。

jhc确实有一个手册http://repetae.net/computer/jhc/manual.html和一个关于设置交叉编译和;.ini文件的选项部分: http ://repetae.net/computer/jhc/manual .html#交叉编译 。

L01man:第二部分是第一部分的替代。 我不知道如何去做你第三次说的话。

在开始之前,您应该对C有一些了解,并熟悉使用Haskell外部函数接口(FFI)和hs2c等工具。 您还应该熟悉使用Android NDK并使用共享库构build.apk。 你将需要知道这些接口之间的C-Haskell,Java / C-Haskell之间的接口,并开发Android的Haskell程序,你可以在市场上正式分销/销售。

L01man:我知道它的目标是为Android API创build一个绑定。 但是……第四部分是否说我们不能用Haskell制作.apk?

.apk只是一个应用程序包文件格式,并且是使用Android SDK(而不是NDK)附带的工具构build的,所以构build二进制文件本身就很less。 Android包可以包含本地共享库,这是你的Haskell程序将会和本地共享/静态库通过Android NDK生成。

我曾经遇到过同样的Reddit线程,但是它已经老了,评论被closures了。 我给OP发了一条消息,但是不知道是否到达收件人。 我的build议(可能适用于本地活动不可能的旧版Android)。

我(前段时间在Haskell开发的,但现在转向Smalltalk)目前正在开发一个Squeak VM的端口到Android。 我这样做的方式类似于android上的haskell项目中可能遇到的问题:需要从应用程序的Java部分调用一个C代码块(基本上Android可以完成的所有事情是处理各种事件;应用程序不能轮询事件本身,也没有任何事件循环)。 在我的情况下,代码由Squeak VM构build工具生成,在android上的haskell的情况下,这将从JHC的GHC或任何前端使用的输出。 这个回购可能值得一看:

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

在“src”下有Java代码,它提供用户事件拦截并将它们发送给本地代码(参见CogView类)。 虚拟机本身的C代码并不完全在那里(见squeakvm.org,Cog分支),但有人可能会明白这一点。 也可以看看http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm这是解释器的C前端(包括用户事件处理,计时等)。; )

希望这可以帮助。

梅德

我认为一般的答案应该来自source-> source转换,因为加载专门编译的共享对象似乎有点混乱(在上面的回答中涉及ghc-> c和c-> java的一步)。 因此,这个问题属于JVM上Haskell的标题,已经尝试过了 (作为Java中间表示的一步),并进行了详细的讨论 。 如果你需要的库在那里编译,你可以使用frege 。 剩下的唯一步骤就是将Android框架API的开始翻译成IO()动作,也许是构build清单xml和apk的包装器。

https://github.com/conscell/hugs-android HUGS Haskell解释器的端口到Android。

最近引起我注意的语言是Eta 。

Eta的编译器是GHC 7.10的一个分支,它有一个JVM后端。 可以使用生成的JAR文件编写Android应用程序,甚至可以使用其外部函数接口来调用本地Android Java库。

Brian McKenna撰写了一篇关于如何configurationAndroid Studio项目以使用Eta库的博客文章。