【问题标题】:Bindings and introspection for OCaml libraryOCaml 库的绑定和自省
【发布时间】:2012-10-16 16:39:38
【问题描述】:

我想编写一个 OCaml 库,供其他编程语言(如 C 甚至 python)使用。

我不确定这是否可行,我想我需要放弃一些类型安全性并将运行时检查添加到动态类型语言的接口。

可行吗?是否有工具可以实现自动生成绑定的目标?我认为像 Corba 这样的东西不适合 ocaml ABI,但我可能错了。

编辑:通过放弃运行时要求并仅使用具有 llvm 前端的语言,我想我可以将 llvm 用作常见的 ABI,但这似乎很棘手。

【问题讨论】:

    标签: binding ocaml idl


    【解决方案1】:

    OCaml 有一个到 interact with C code 的 FFI。绑定的代码必须用 C 编写,而不是 OCaml(它没有 C 值的直接表示,而 C 有 OCaml 值的表示)。我的建议是:

    1. 在 C 方面,决定 C 程序员(或 Python 程序员从您的 C 接口开始编写 Python 绑定)想要导出的最佳接口是什么
    2. 在 OCaml 端定义一个“低级层”,从 C 表示中获取您的 OCaml 值尽可能接近
    3. 编写一些 C 包装器,将这种低级 OCaml 表示转换为您的最佳 C 表示

    步骤(2)的原因是步骤(3)尽可能小。从 C 端操作 OCaml 值有点痛苦,尤其是您可能会冒着与垃圾收集器交互错误的风险,这意味着段错误——而且您没有任何类型安全性。所以你在 C 端做的工作越少越好。

    有一些项目可以为您完成一些包装工作。例如CamlIDL,我认为Swig 对OCaml 有一些支持。不过,我从未使用过这些,所以我无法发表评论。

    如果您知道要将界面转换为哪种高级语言,则可能存在不需要 C 步骤的专用桥。例如,有一些库可以直接与 Python 表示(搜索 Pycaml,不确定它们是否经过实战测试)或 Java 运行时(OCamlJava 项目)进行交互。 C 接口仍然是一个安全的选择,它允许其他人创建通向他们自己语言的桥梁。

    【讨论】:

      【解决方案2】:

      这是可行的,但你需要了解涉及的主题,比如 GC 是如何工作的。 看看这个:http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual033.html#toc148

      您需要注意存根代码中的类型,否则可以保持类型安全。

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多