假设我有一个 Haskell 程序或库,我想让非 Haskell 人员(可能是 C 程序员)可以访问。我可以使用 GHC 将其编译为 C,然后将其作为 C 源代码分发吗?
如果这是可能的,有人可以提供一个最小的例子吗?(例如,一个 Makefile)
是否可以使用 GHC 自动确定需要哪些编译器标志和头文件,然后将其捆绑到一个文件夹中?
基本上我感兴趣的是能够用 C 和 Haskell 编写程序的一部分,然后将其作为 tarball 分发,但不需要目标安装 GHC 和 Cabal。
我有兴趣能够用 C 和 Haskell 编写程序的一部分,然后将其作为 tarball 分发,但不需要目标安装 GHC 和 Cabal。
您需要大量您不太可能找到的基础设施。请记住,任何 Haskell 程序,即使要编译成 C 语言,也几乎肯定要依赖一个大型、复杂的运行时系统才能正确运行。至少,运行时系统必须支持垃圾收集和惰性求值。因此,您遇到的不仅仅是翻译问题。
我建议您将此问题作为软件分发问题来解决。为您喜欢的分发平台(Debian、Red Hat、InstallShield 等)提供一个软件包,而不是一个 tarball。就个人而言,为了重用其他人的努力,我的目标是检查 Cabal,如果需要安装 Cabal,然后使用 Cabal 安装用户需要的其余内容。
你可以用jhc做到这一点。它是一个完整的程序优化编译器,可以编译成 C。虽然它没有 GHC 支持的所有花哨的扩展。
即使可以,我也不会称其为“C 源代码”。GHC 可以使用 C 作为其编译系统的一部分,但生成的 C 代码甚至没有一点可读性。即使它可以被阅读和理解,修改它也是没有意义的,因为没有办法(除了将更改反向移植到 Haskell 中)将 C 黑客所做的任何修改合并到程序的未来版本中。
术语“源”是指由人类编写并用于生成程序的代码。在这种情况下,这就是 Haskell。编译器生成的 C 不是“源代码”,它是一种中间表示。
您无法使用 GHC 到达那里。即使它通过 C 编译,GHC 也依赖于操纵生成的程序集来打乱段,一个巨大的运行时系统和大量的包袱。
另一方面,如果 John Meacham 的 JHC 编译器的功能集更有限,但它会生成相当紧凑的 C 输出,那么您可能会有更好的运气。
我知道这是一篇旧帖子,但我仍然想提一下ajhc。Ajhc 对 jhc 进行了分叉,计划添加新功能,然后将更新推送回 jhc。
假设我有一个 Haskell 程序或库,我想让非 Haskell 人员(可能是 C 程序员)可以访问。我可以使用 GHC 将其编译为 C,然后将其作为 C 源代码分发吗
您可以编译为 C,但生成的 C 不是人类可读的。您最好编写头文件并使用出色的 C FFI。无论如何,分发生成的 C 似乎是一件傻事。
基本上我感兴趣的是能够用 C 和 Haskell 编写程序的一部分,然后将其作为 tarball 分发,但不需要目标安装 GHC 和 Cabal。
我不知道任何不涉及 GHC 的解决方案。您至少必须分发 Haskell RTS。
我可以使用 GHC 将其编译为 C,然后将其作为 C 源代码分发吗?
不,这是不可能的,但您可以使用 Haskell 的外部函数接口 (FFI) 在 haskell 和 c 之间轻松创建接口。
你可以在这里有更多的例子。