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