OCaml库的绑定和内省

时间:2012-10-26 11:57:10

标签: binding ocaml idl

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

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

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

编辑:通过删除运行时要求并仅使用具有llvm前端的语言,我可以使用llvm作为常见的ABI,但这看起来很棘手。

2 个答案:

答案 0 :(得分:9)

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

  1. 在C方面,确定C程序员想要的最佳导出界面(或者Python程序员从C接口开始编写Python绑定)
  2. 在OCaml端定义一个“低级别图层”,从C表示中获取尽可能接近的OCaml值
  3. 编写一些C包装器,将这种低级OCaml表示转换为最佳C表示
  4. 步骤(2)的原因是使步骤(3)尽可能小。操纵来自C端的OCaml值有点痛苦,特别是你冒着与垃圾收集器的交互错误的风险,这意味着段错误 - 加上你没有任何类型安全。因此,你在C方面所做的工作越少越好。

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

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

答案 1 :(得分:1)

这是可行的,但您需要了解相关主题,例如GC的工作原理。 看看这个:http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual033.html#toc148

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