在Android OS上运行Haskell程序

时间:2011-03-01 08:05:59

标签: android haskell executable

前言:这是在/r/haskell

上开始的主题的扩展

让我们从事实开始:

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

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

  

如何让Haskell程序在Android OS上执行/运行?

6 个答案:

答案 0 :(得分:80)

你是如何做的首先得到一个Haskell编译器,该编译器可以使用android NDK来定位C,后者附带了ARM架构的GCC端口。 JHC可以通过一个非常小的inf样式文件来执行此操作,该文件描述了我使用Wii自制开发工具包完成此操作的平台(字大小,c编译器等)并且它非常简单。然而,jhc仍然存在一些复杂代码的稳定性问题,例如使用带有IO的monad变换器堆栈,但jhc在过去的6个月中已经有了很大的改进。只有一个人在JHC工作,我只是希望有更多的人可以帮助他。

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

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

一旦你有了这个,你必须将Haskell代码构建为共享库或静态库,它们被链接到NDK java glue代码(它本身就是一个共享库)。据我所知,你无法在android上正式运行本机可执行文件。您可以使用root电话执行此操作,因此我认为这意味着您无法在应用商店中分发本机可执行文件,即使NDK gcc端口可以正常生成本机可执行文件也是如此。这也可能会杀死使用LLVM的选项,除非您可以让NDK JNI使用LLVM。

最大的障碍不是为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程序之前,这是对任何人的警告,您应该在完成之前进行一些小测试。

jhc有一个手册http://repetae.net/computer/jhc/manual.html和一个关于设置交叉编译和.ini文件的部分,其中包含选项:http://repetae.net/computer/jhc/manual.html#crosscompilation

  

L01man:第二部分是第一部分的替代品。我不知道怎么做你说的话   第三

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

  

L01man:据我所知,它的目标是创建一个绑定   Android API。但是......第四部分说我们不能制作.apk   Haskell的?

.apk只是一个应用包文件格式,使用Android SDK(而不是NDK)附带的工具构建,这几乎没有什么可以构建二进制文件本身。 Android软件包可以包含本机共享库,这就是您的Haskell程序,以及通过Android NDK生成本机共享/静态库。

答案 1 :(得分:14)

https://github.com/neurocyte/android-haskell-activity代码正在运行Haskell代码。

答案 2 :(得分:10)

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

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

Brian McKenna撰写了一篇关于how to configure an Android Studio project to use an Eta library的博客文章。

答案 3 :(得分:9)

我曾遇到过相同的Reddit帖子,但它已经过时了,评论已经关闭。我向OP发了一条消息,但我不确定它是否已经到达收件人。我的建议(可能适用于那些不可能进行原生活动的老式机器人。)

我(不久前在Haskell开发,但目前已切换到Smalltalk)我正在开发一个Squeak VM到Android的端口。我这样做的方式与haskell-on-android项目中可能处理的方式类似:需要从应用程序的Java部分调用的一块C代码(基本上所有可以在Android中完成的都是处理各种事件;应用程序不能轮询事件本身,也没有任何事件循环)。在我的例子中,代码是由Squeak VM构建工具生成的,对于android上的haskell,这将从JHC的GHC或任何前端使用输出。这个回购可能值得一看:

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

在“src”下面有Java代码,它提供用户事件拦截并将它们发送到本机代码(请参阅CogView类)。 VM本身的C代码并不完全存在(请参阅squeakvm.org,Cog分支),但有人可能会得到这个想法。也可以在http://gitorious.org/~golubovsky/cogvm/dmg-blessed/trees/master/platforms/android/vm下查看解释器的C前端(包括用户事件处理,一些计时等)。

希望这有帮助。

梅德

答案 4 :(得分:7)

安装了https://github.com/conscell/hugs-android HUGS Haskell解释器的端口。

答案 5 :(得分:6)

我认为一般的答案应该来自source->源代码转换,因为加载特殊编译的共享对象似乎有点像kludge(在答案中涉及ghc-> c和c-> java步骤以上)。因此,这个问题属于JVM上Haskell的标题,它已经tried(作为Java中间表示的一步)和discussed的长度。如果您需要在那里编译库,可以使用frege。剩下的唯一步骤是将Android框架API转换为IO()动作的开头,也许是构建清单xml和apk的包装器。