【问题标题】:Options for wrapping a C++ library for Haskell (and other languages)为 Haskell(和其他语言)包装 C++ 库的选项
【发布时间】:2014-01-28 20:22:52
【问题描述】:

这个问题是关于设计的/是相当开放的。

我想使用来自 Haskell 的大型 C++ 库 OpenCV。 目前最接近的解决方案可能是 Arjun Comar 尝试调整 Python/Java 绑定生成器。 请参阅 hereherehere。 他的方法生成一个 C 接口,然后使用 hsc2hs 进行包装。 由于 OpenCV 在其 API 中缺乏引用透明度,以及频繁使用调用参数进行输出,为了让 Arjun 的方法完全成功,他需要为 OpenCV 定义一个新的 API,并根据现有的 API 实现它.

因此,使用interface description languages (IDL)(例如 SWIG、protobuf-with-RPC 或 Apache Thrift)来定义 API 似乎并没有太多额外的工作。 这将为 Haskell 之外的多种语言提供接口。

我的问题:

  1. 对于无服务器解决方案,还有什么比 SWIG 更好的解决方案吗? (我只想调用 C++;我宁愿不通过本地服务器。)

  2. 如果没有好的无服务器解决方案,我应该使用 protobuf-with-RPC 还是 Thrift?

    1. 相关:Thrift 的 Haskell 支持有多好? 从代码来看,它似乎需要更新(我看到对 GHC 6 的引用)。

    2. 相关:什么是好的 protobuf-with-RPC 解决方案?

【问题讨论】:

  • AlphaHeavy 有一个用于 Haskell 的 protobuf 库,非常好。我建议看看。

标签: haskell protocol-buffers swig thrift idl


【解决方案1】:
  1. 使用 Apache Thrift,您可以获得 Haskell 支持。你是对的,代码通常不是“最新的”,但你很少关心。您可以在其他抽象级别上做复杂的事情,并在消息传递级别上使事情尽可能简单。

  2. Google Protobuf 不支持 Haskell,SWIG 也不支持。使用 Protobuf,您可以获得 C++、Java、JavaScript 和 Python,据我所知,这些都是 Google 的主要语言。看看this 演示文稿。没有竞争,Thrift 和 Protobuf 是内部最好的。

在您的情况下,您似乎必须使用 Thrift,因为它支持 Haskell。

【讨论】:

  • 基于一些随机的谷歌搜索和我在代码中阅读的内容,我得到的印象是 Haskell 位在 Thrift 的 master 中不能开箱即用。不过我会试试看的。
  • 有 Haskell protobuf 库。我已经有一年左右没有使用它们了,但在 2013 年初它们起作用了。
【解决方案2】:

听起来 C++ 的外部函数接口就是你想要的:

Hackage, Github

免责声明:我没有使用它,只是听说过它的好东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2014-11-20
    • 2021-05-21
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多