Binding OCaml库的绑定和内省

Binding OCaml库的绑定和内省,binding,ocaml,idl,Binding,Ocaml,Idl,我想编写一个OCaml库,它将被其他编程语言(如C语言甚至python)使用 我甚至不确定它是否可行,我想我需要删除一些类型安全性,并为动态类型语言的接口添加运行时检查 这可行吗?是否有工具可以实现自动生成绑定的目标?我认为像Corba这样的东西不适合OCAMLABI,但我可能错了 编辑:通过删除运行时要求并仅使用具有llvm前端的语言,我想我可以将llvm用作一种常见的ABI,但这似乎很棘手。这是可行的,但您需要了解相关主题,如GC如何工作。 看看这个: 您需要小心存根代码中的类型,否则您可以

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

我甚至不确定它是否可行,我想我需要删除一些类型安全性,并为动态类型语言的接口添加运行时检查

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


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

这是可行的,但您需要了解相关主题,如GC如何工作。 看看这个:

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

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

  • 在C端,决定什么是C程序员想要的最好的导出接口(或者Python程序员从C接口开始编写Python绑定)
  • 在OCaml端定义一个“低级层”,使您的OCaml值尽可能接近C表示
  • 编写一些C包装器,将此低级OCaml表示转换为最佳C表示
  • 步骤(2)的原因是使步骤(3)尽可能小。从C端操作OCaml值有点痛苦,特别是您可能会导致与垃圾收集器的交互出错,这意味着SEGFULTS——而且您没有任何类型安全性。因此,在C端所做的工作越少越好

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

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