2012-10-26 27 views
4

我想写一个OCaml库,它将被其他编程语言(如C或Python)使用。OCaml库的绑定和反省

我不知道它甚至是可行的,我想我需要放弃一些类型安全,并添加运行时检查到动态类型语言的接口。

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

编辑:通过删除运行时要求,并使用只有语言有一个llvm前端,我可以使用llvm作为一个普通的ABI我猜,但它似乎棘手。

回答

9

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

  1. 在C面,决定什么是最好的接口导出C程序员想(或Python程序员在编写从C接口开始Python绑定)
  2. 定义一个“低-level层”上OCaml的一侧,得到您的OCaml的价值尽可能接近从C表示
  3. 编写C包装从这种低级OCaml中表示转换成您的最佳S表示

步骤(2)的理由是让步骤(3)尽可能小。从C端操纵OCaml值有点痛苦,尤其是你有可能与垃圾收集器的交互错误,这意味着段错误 - 再加上你没有得到任何类型的安全。所以你在C方面做的工作越少越好。

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

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