【问题标题】:Difference between hsc2hs and c2hs?hsc2hs 和 c2hs 的区别?
【发布时间】:2011-08-25 22:14:26
【问题描述】:

hsc2hs和c2hs有什么区别?

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

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

【问题讨论】:

    标签: haskell ffi hsc2hs c2hs


    【解决方案1】:

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

    When should I use c2hs?有很多 Haskell 预处理器;哪一个 你应该使用吗?一个短的(有点 不准确)的方式来表征 上面的层次是进一步向下 你去,你的样板越少 编写和更多文档 你必须阅读;我是这样听说的 建议 hsc2hs 是你应该做的 用于小型 FFI 项目,而 c2hs 更适合较大的 那些。

    c2hs 支持 hsc2hs 的东西 没有:

    • 根据C内容自动生成国外导入 头文件
    • 半自动编组函数调用和
    • 将指针类型和层次结构转换为 Haskell 类型。

    【讨论】:

    • 不幸的是,这两个工具都不能帮助 c++ 库。
    • @Vagif:截至今天,Haskell 无法与 C++ 交互。唯一的方法是从 C++ 创建与 C 兼容的绑定并导入它们。
    • @Vagif @FUZxxl C++ 曾经只是 C 的预处理器。我不确定当前状态是什么,但我想仍有办法将 C++ 代码自动转换为 C 代码以一种相当直接的方式。
    • @Dan 我不再相信这是真的。 C++ 变得更加复杂,请参阅模板等。
    • @Dan:不是。 C 不支持函数重载、模板、异常、方法……尽管在 C++ 内核上提供 C 风格的接口总是可能的。
    【解决方案2】:

    米哈伊尔的回答很好,但还有另一面。还有一些 hsc2hs 提供而 c2hs 没有的东西,可能需要将两者结合使用。

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

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

    【讨论】:

    • 这仍然是事实,但过去几年 C2HS 的情况有所改善。例如,enum 支持现在好多了,您可以访问 #defines 的值,还有更多的编组支持,对外部指针的更好支持等等。 (当我必须包装 C 库时,我仍然倾向于编写 C2HS 和纯 FFI 代码的混合体,因为有很多 C2HS 不能做的事情。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2014-10-29
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多