24

hsc2hs 和 c2hs 有什么区别?

我知道什么是 hsc2hs 是一个预处理器,但它到底是做什么的?

c2hs 可以用 C 代码制作 Haskell 模块,但是我需要 hsc2hs 吗?

4

2 回答 2

25

它们都具有相同的功能:使编写 FFI 绑定更容易。如果您选择使用 c2hs,则无需了解 hsc2hs;他们是独立的。C2hs 更强大,但也更复杂:Edward Z. Yang 在他的c2hs 教程中用一张漂亮的图表说明了这一点:

我什么时候应该使用 c2hs?有许多 Haskell 预处理器;你应该使用哪一个?描述上述层次结构的一种简短(而且有些不准确)的方法是,您越往下走,您编写的样板文件就越少,您必须阅读的文档就越多;因此,我听说 hsc2hs 应该用于小型 FFI 项目,而 c2hs 更适合大型项目。

c2hs 支持而 hsc2hs 不支持的事情:

  • 根据C头文件内容自动生成国外导入
  • 函数调用的半自动编组,以及
  • 将指针类型和层次结构转换为 Haskell 类型。
于 2011-05-15T16:12:40.070 回答
13

米哈伊尔的回答很好,但还有另一面。还有一些 hsc2hs 提供而 c2hs 没有提供的东西,可能需要将两者结合使用。

值得注意的是,hsc2​​hs 通过生成 C 可执行文件来运行以生成 Haskell 代码,而 c2hs 则直接解析头文件。因此,hsc2​​hs 允许您访问#defines 等。因此,虽然我发现 c2hs 更适合生成绑定和绑定包装器以及“深入”查看和戳入复杂的 C 结构,但它不适合访问常量和枚举,并且它只会轻微自动化 Storable 实例的样板文件。我发现 hsc2hs 与 bindings-dsl 包 [1] 一起也是必要的,特别是在我的情况下,对于预定义的常量。在一个实例中,我有一个用于大量常量的 hsc 文件,以及一个用于包装使用这些常量的函数的 chs 文件。

[1] http://hackage.haskell.org/package/bindings-DSL

于 2011-05-16T14:09:56.523 回答