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