假设我有一个Haskell程序或库,我想让非Haskeller,可能是C程序员可以访问.我可以使用GHC将其编译为C,然后将其作为C源分发吗?
如果可以,有人可以提供一个最小的例子吗?(例如,Makefile)
是否可以使用GHC自动确定所需的编译器标志和标头,然后将其捆绑到一个文件夹中?
基本上我有兴趣能够在C和Haskell中编写部分程序,然后将其作为tarball分发,但不要求目标安装GHC和Cabal.
我有兴趣能够在C和Haskell中编写部分程序,然后将其作为tarball分发,但不要求目标安装GHC和Cabal.
你要求的是一些你不太可能找到的大量基础设施.请记住,任何Haskell程序,即使它将被编译为C,几乎肯定会依赖于大型,复杂的运行时系统来正确操作.至少,该运行时系统必须支持垃圾收集和惰性评估.所以你不仅仅是一个翻译问题.
我建议你解决这个问题作为一个软件分发问题.而不是tarball,为您喜欢的分发平台(Debian,Red Hat,InstallShield等)提供一个包.就个人而言,为了重用其他人的努力,我的目标是检查Cabal,如果需要安装Cabal,然后使用Cabal安装用户需要的其余部分.
你可以用jhc做到这一点.它是一个完整的程序优化编译器,可以编译为C.它没有GHC支持的所有花哨的扩展.
即使你可以,我也不会称之为"C源".GHC可以使用C作为其编译系统的一部分,但生成的C代码甚至不具有可读性.即使它可以被阅读和理解,修改它也没有任何意义,因为除了将更改反向移植到Haskell之外,没有办法将C黑客所做的任何修改合并到程序的未来版本中.
术语"源"表示由人编写并用于生成程序的代码.在这种情况下,这是Haskell.编译器生成的C不是"源代码",而是中间表示.
你不能用GHC到达那里.即使它通过C进行编译,GHC也依赖于操纵最终的装配来改变周围的部分,一个巨大的运行时系统和很多行李.
另一方面,如果你想要的东西得到John Meacham的JHC编译器的一些更有限的功能集的支持,你可能会更好运,但这会产生相当紧凑的C输出.