hsc2hs 和 c2hs 有什么区别?
我知道什么是 hsc2hs 是一个预处理器,但它到底是做什么的?
c2hs 可以用 C 代码制作 Haskell 模块,但是我需要 hsc2hs 吗?
它们都具有相同的功能:使编写 FFI 绑定更容易。如果您选择使用 c2hs,则无需了解 hsc2hs;他们是独立的。C2hs 更强大,但也更复杂:Edward Z. Yang 在他的c2hs 教程中用一张漂亮的图表说明了这一点:
我什么时候应该使用 c2hs?有许多 Haskell 预处理器;你应该使用哪一个?描述上述层次结构的一种简短(而且有些不准确)的方法是,您越往下走,您编写的样板文件就越少,您必须阅读的文档就越多;因此,我听说 hsc2hs 应该用于小型 FFI 项目,而 c2hs 更适合大型项目。
c2hs 支持而 hsc2hs 不支持的事情:
- 根据C头文件内容自动生成国外导入
- 函数调用的半自动编组,以及
- 将指针类型和层次结构转换为 Haskell 类型。
米哈伊尔的回答很好,但还有另一面。还有一些 hsc2hs 提供而 c2hs 没有提供的东西,可能需要将两者结合使用。
值得注意的是,hsc2hs 通过生成 C 可执行文件来运行以生成 Haskell 代码,而 c2hs 则直接解析头文件。因此,hsc2hs 允许您访问#define
s 等。因此,虽然我发现 c2hs 更适合生成绑定和绑定包装器以及“深入”查看和戳入复杂的 C 结构,但它不适合访问常量和枚举,并且它只会轻微自动化 Storable 实例的样板文件。我发现 hsc2hs 与 bindings-dsl 包 [1] 一起也是必要的,特别是在我的情况下,对于预定义的常量。在一个实例中,我有一个用于大量常量的 hsc 文件,以及一个用于包装使用这些常量的函数的 chs 文件。