hsc2hs和c2hs有什么区别?

24

什么是hsc2hs和c2hs之间的区别?

我知道hsc2hs是一个预处理器,但它具体做了什么?

c2hs可以从C代码生成Haskell模块,但我是否需要hsc2hs来完成这个操作?

2个回答

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

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

c2hs支持的hsc2hs不支持的功能:

  • 基于C头文件的内容自动生成外部导入
  • 半自动地进行函数调用的编组和解组,并
  • 将指针类型和层次结构转换为Haskell类型。

不幸的是,这两个工具都无法帮助处理C++库。 - Vagif Verdi
@Vagif:目前来看,Haskell 无法与 C++ 进行接口交互。唯一的方法是从 C++ 创建 C 兼容的绑定并进行导入。 - fuz
@Vagif @FUZxxl C++以前只是C的一个预处理器。我不确定现在的情况如何,但我想还是有一些相对简单的方法可以自动将C++代码转换成C代码。 - Dan Burton
2
@Dan 我不认为这还是真的。C++已经变得更加复杂,例如模板等。 - Joel Burget
2
@Dan:不是的。C语言不支持函数重载、模板、异常、方法等特性。但是,总是可以在C++核心上提供一个类似于C语言的接口。 - Matthieu M.

13

Mikhail 的回答很好,但还有另一方面。hsc2hs 提供了 c2hs 不具备的功能,有时需要同时使用两者。

值得注意的是,hsc2hs 通过生成一个 C 可执行文件来生成 Haskell 代码,而 c2hs 直接解析头文件。因此,hsc2hs 允许您访问 #define 等内容。虽然我发现 c2hs 更适合生成绑定和包装器以及对复杂的 C 结构进行“深入”查看和修改,但它不适合访问常量和枚举,只能自动化 Storable 实例的样板代码。在我的情况中,尤其是对于预定义常量,我发现必须与 bindings-dsl 包 [1] 一起使用 hsc2hs。例如,在一个实例中,我有一个 hsc 文件用于大量常量,一个 chs 文件用于包装使用这些常量的函数。

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


3
这仍然是正确的,但是C2HS在过去几年中的情况有所改善。例如,现在对枚举类型的支持更好了一些,您可以访问“#define”的值,有一些更好的marshalling支持、更好的外部指针支持等等。(当我需要包装C库时,我仍然倾向于编写混合C2HS和普通FFI代码,因为C2HS无法完成很多任务) - Ian Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接