hsc2hs和c2hs之间的区别?

时间:2011-05-15 14:36:54

标签: haskell ffi hsc2hs c2hs

hsc2hs和c2hs有什么区别?

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

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

2 个答案:

答案 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没有的东西,可能需要同时使用它们。

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

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