33

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

如果这是可能的,有人可以提供一个最小的例子吗?(例如,一个 Makefile)

是否可以使用 GHC 自动确定需要哪些编译器标志和头文件,然后将其捆绑到一个文件夹中?

基本上我感兴趣的是能够用 C 和 Haskell 编写程序的一部分,然后将其作为 tarball 分发,但不需要目标安装 GHC 和 Cabal。

4

7 回答 7

23

我有兴趣能够用 C 和 Haskell 编写程序的一部分,然后将其作为 tarball 分发,但不需要目标安装 GHC 和 Cabal。

您需要大量您不太可能找到的基础设施。请记住,任何 Haskell 程序,即使要编译成 C 语言,也几乎肯定要依赖一个大型、复杂的运行时系统才能正确运行。至少,运行时系统必须支持垃圾收集和惰性求值。因此,您遇到的不仅仅是翻译问题。

我建议您将此问题作为软件分发问题来解决。为您喜欢的分发平台(Debian、Red Hat、InstallShield 等)提供一个软件包,而不是一个 tarball。就个人而言,为了重用其他人的努力,我的目标是检查 Cabal,如果需要安装 Cabal,然后使用 Cabal 安装用户需要的其余内容。

于 2010-01-04T01:50:09.340 回答
18

你可以用jhc做到这一点。它是一个完整的程序优化编译器,可以编译成 C。虽然它没有 GHC 支持的所有花哨的扩展。

于 2010-01-09T00:19:42.270 回答
10

即使可以,我也不会称其为“C 源代码”。GHC 可以使用 C 作为其编译系统的一部分,但生成的 C 代码甚至没有一点可读性。即使它可以被阅读和理解,修改它也是没有意义的,因为没有办法(除了将更改反向移植到 Haskell 中)将 C 黑客所做的任何修改合并到程序的未来版本中。

术语“源”是指由人类编写并用于生成程序的代码。在这种情况下,这就是 Haskell。编译器生成的 C 不是“源代码”,它是一种中间表示。

于 2010-01-03T10:01:22.837 回答
6

您无法使用 GHC 到达那里。即使它通过 C 编译,GHC 也依赖于操纵生成的程序集来打乱段,一个巨大的运行时系统和大量的包袱。

另一方面,如果 John Meacham 的 JHC 编译器的功能集更有限,但它会生成相当紧凑的 C 输出,那么您可能会有更好的运气。

于 2010-01-05T21:21:21.097 回答
1

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

于 2014-01-21T19:41:06.100 回答
0

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

您可以编译为 C,但生成的 C 不是人类可读的。您最好编写头文件并使用出色的 C FFI。无论如何,分发生成的 C 似乎是一件傻事。

基本上我感兴趣的是能够用 C 和 Haskell 编写程序的一部分,然后将其作为 tarball 分发,但不需要目标安装 GHC 和 Cabal。

我不知道任何不涉及 GHC 的解决方案。您至少必须分发 Haskell RTS。

于 2018-04-12T02:42:22.277 回答
-1

我可以使用 GHC 将其编译为 C,然后将其作为 C 源代码分发吗?

不,这是不可能的,但您可以使用 Haskell 的外部函数接口 (FFI) 在 haskell 和 c 之间轻松创建接口。

你可以在这里有更多的例子。

于 2010-01-03T07:48:44.937 回答