OCaml库的绑定和内省

Enj*_*ras 4 binding ocaml idl

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

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

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

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

gas*_*che 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例如,我想痛饮有OCaml的一些支持.我从来没有用过那些,所以我不能发表评论.

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