首页 文章

在Android OS上运行Haskell程序

提问于
浏览
200

前言:这是在/r/haskell上开始的线程的扩展

让我们从事实开始:

  • Android是一款非常棒的操作系统

  • Haskell是地球上最好的编程语言

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

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

6 回答

  • 78

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

    另一种选择是 Build 一个针对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创建一个绑定 . 但是......第四部分说我们不能用Haskell制作.apk吗?

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

  • 8
  • 6

    我曾经遇到过相同的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前端(包括用户事件处理,一些计时等)

    希望这可以帮助 .

    梅德

  • 7

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

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

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

  • 13

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

  • 9

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

相关问题