4

我想编写一个 OCaml 库,它将被 C 甚至 python 等其他编程语言使用。

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

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

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

4

2 回答 2

9

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

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

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

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

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

于 2012-10-26T12:16:30.817 回答
1

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

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

于 2012-10-26T12:15:31.127 回答