将Haskell程序作为C源代码分发

33

假设我有一个Haskell程序或库,我想让非Haskeller(如C程序员)也能使用它。 我可以使用GHC将其编译为C代码,然后将其作为C源码分发吗?

如果这是可能的,能否提供一个最小的示例?(例如,一个 Makefile)

是否可能使用GHC自动确定所需的编译器标志和头文件,然后将其捆绑到单个文件夹中?

基本上,我想能够在C和Haskell中编写程序部分,然后将其作为tarball分发,但不需要目标计算机安装GHC和Cabal。


这将会有类似于未注册版本的性能,也就是相当差。我建议你找另外一种方式。或许你可以使用 GHC 6.12 新增的共享库支持,并提供源代码和编译后的二进制文件? - ephemient
7个回答

24
我希望能够用C和Haskell编写程序部分,并将其作为tarball分发,但不要求目标设备安装GHC和Cabal。
你要求的基础设施非常多,难以找到。请记住,即使一个Haskell程序将被编译成C,也几乎肯定依赖于一个大而复杂的运行时系统才能正确运行。至少,该运行时系统必须支持垃圾回收和惰性求值。所以你不仅仅面临翻译问题。
我建议你将这个问题看作是一个软件分发问题。与其使用tarball,不如提供一个针对你喜欢的分发平台(Debian、Red Hat、InstallShield等)的软件包。个人认为为了重用其他人的工作,我会针对检查Cabal,如果需要则安装Cabal,然后使用Cabal安装用户需要的其余内容。

我会接受这个,但是我不认为Haskell的运行时必须如此庞大和复杂。但无论如何,看起来都不是一件简单的事情,所以我会把它交给你。 - Steve
15
@Steve:2005年时,GHC运行时系统的大小是Unix Version 6的四倍。此后它只会越来越大。 - Norman Ramsey
5
如果你感兴趣,这里有一个关于 GHC 运行时的完整页面,可以点击这里查看:http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts。 - Lambda Fairy
1
@Steve,截至编写时为止,它有50,000行C代码。 - user8174234
@LambdaFairy,您提供的链接已经失效了,这是新链接:https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts - Kartik

18
您可以使用jhc实现此目的。这是一个完整的程序优化编译器,可编译为C语言。它不支持GHC所支持的所有高级扩展。

GHC 还可以编译为 C--,它是 C 的子集。 - user8174234

10
即使可以,我也不会称其为"C源代码"。 GHC可以将C用作编译系统的一部分,但生成的C代码根本不可读。 即使它可以被阅读和理解,修改它也毫无意义,因为除了将更改反向移植到Haskell中之外,没有其他方法(将更改合并到您的程序未来版本中)。
术语“源代码”指由人类编写并用于生成程序的代码。 在这种情况下,就是Haskell代码。由编译器生成的C代码不是“源代码”,而是中间表示形式。

4
我完全不同意“源代码”必须是“源”的说法。 - Thomas Eding
2
@trinithis:虽然有人可能会认为真正的源头在开发者的大脑中(甚至是宇宙大爆炸、圣灵或一些漂浮的意大利面条),但将术语“源代码”用作计算机中包含信息的来源是很有用的。这将是用户输入和记录的数据。从这个意义上说,保罗·约翰逊是100%正确的。 - yairchu
13
“source”这个词的语义与我的问题无关。我想问的是是否可以分发编译Haskell生成的C文件,我不在乎它们叫什么。 - Steve

6

使用GHC是无法实现这一目标的。即使通过C编译,GHC也依赖于操作生成的汇编代码以移动段、运行时系统和大量附带信息。

另一方面,如果您需要的功能受到约翰·米查姆(John Meacham)的JHC编译器较为有限的特性集支持,则可能会有更好的运气。该编译器生成相当紧凑的C输出。


3
GHC只在注册过的构建中使用那些技巧;请参阅http://hackage.haskell.org/trac/ghc/wiki/Building/Unregisterised。 - ephemient

1
我知道这是一篇旧帖子,但我仍然想提及ajhc。Ajhc分叉了jhc,并计划添加新功能,然后将更新推回jhc。

0
假设我有一个Haskell程序或库,我想让非Haskeller(可能是C程序员)也能使用它。我可以使用GHC将其编译为C,然后将其作为C源代码分发吗?
您可以编译为C,但生成的C不可读。最好编写头文件并与之一起使用出色的C FFI。无论如何,分发生成的C似乎是愚蠢的行为。
基本上,我希望能够在C和Haskell中编写程序的部分,然后将其作为tarball分发,但不需要目标计算机安装GHC和Cabal。
我不知道任何不涉及GHC的解决方案。您至少需要分发Haskell RTS。

-1
我能使用 GHC 将其编译为 C,然后将其作为 C 源代码分发吗?
不可能,但是您可以通过使用 Haskell 的 Foreign Function Interface(FFI)轻松创建 Haskell 和 C 之间的接口。
您可以在这里找到更多示例。

1
可能有一点模糊的可能性......使用-fvia-c -keep-tmp-files -v编译,跟踪确切的gcc调用,并分发适当的RTS位......但这似乎一点也不好。 - ephemient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接