在Android操作系统上运行Haskell程序

在Android操作系统上运行Haskell程序,android,haskell,executable,Android,Haskell,Executable,注:这是从上开始的线程的扩展 让我们从事实开始: Android是一个非常棒的操作系统 Haskell是地球上最好的编程语言 因此,很明显,将它们结合起来将使Android开发变得更好。所以本质上,我只想知道如何为Android操作系统编写Haskell程序。我的问题是: 如何让Haskell程序在Android操作系统上执行/运行 如何做到这一点,首先需要一个Haskell编译器,它可以使用android NDK以C为目标,android NDK附带一个用于ARM架构的GCC端口。JHC可

注:这是从上开始的线程的扩展

让我们从事实开始:

  • Android是一个非常棒的操作系统
  • Haskell是地球上最好的编程语言
因此,很明显,将它们结合起来将使Android开发变得更好。所以本质上,我只想知道如何为Android操作系统编写Haskell程序。我的问题是:

如何让Haskell程序在Android操作系统上执行/运行


如何做到这一点,首先需要一个Haskell编译器,它可以使用android NDK以C为目标,android NDK附带一个用于ARM架构的GCC端口。JHC可以用一个非常小的inf样式的文件来实现这一点,该文件描述了平台(字大小、c编译器等)。我用Wii自制开发工具包实现了这一点,非常简单。然而,jhc在复杂代码方面仍然存在一些稳定性问题,例如使用带有IO的monad transformer堆栈,但jhc在过去6个月里已经有了很大的改进。只有一个人在JHC工作,我只是希望更多的人能帮助他

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

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

一旦你有了这个,你必须将Haskell代码构建为共享库或静态库,链接到NDKJavaGlue代码中(它本身就是一个共享库)。据我所知,您不能在android上正式运行本机可执行文件。您可能可以使用根手机完成此操作,因此我假设这意味着您无法在应用商店上分发本机可执行文件,即使NDK gcc端口可以生成本机可执行文件。这也可能会终止使用LLVM的选项,除非您可以让NDKJNI与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确实有一本手册和一节关于设置交叉编译和.ini文件的选项:

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

在开始之前,您应该对C有一些了解,并熟悉使用Haskell外部函数接口(FFI)和工具,如hs2c。您还应该熟悉使用Android NDK和building.apk以及共享库。您需要了解这些,以便在C-Haskell、Java/C-Haskell之间建立接口,并为Android开发Haskell程序,以便在市场商店上正式分发/销售

L01man:我知道它的目标是为 安卓API。但是第四部分是不是说我们不能用 哈斯克尔


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

我曾经遇到过相同的Reddit线程,但它很旧,并且注释已关闭。我向OP发送了一条消息,但不确定它是否到达了收件人。我在这里的建议(可能适用于不能进行本地活动的老年机器人)

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

在“src”下面有Java代码,它提供了用户事件截取并将它们发送到本机代码(请参阅CogView类)。VM本身的C代码并不完全存在(请参见squeakvm.or)