如何在OCaml和C ++之间实现互操作?

时间:2013-03-03 13:57:10

标签: c++ interop ocaml

我想在OCaml和C ++之间建立一个桥梁。例如,我想在C ++中使用一些用OCaml编写的结构。

我怎样才能做到这一点?是否有任何库,绑定?

2 个答案:

答案 0 :(得分:16)

您应该阅读语言手册的相关部分:Interfacing C with OCaml。即使本质上是痛苦的低级别,它也是非常详细的。

如果您不需要C ++和OCaml代码之间的紧密通信(例如,您接口GUI代码和计算代码,但应用程序的计算密集型内核不会跨越应用程序边界,或者至少与双方花费的时间相比,预计通信成本是可以忽略的),我建议你探索更简单的方法,其中C ++和OCaml代码在不同的进程中运行,并通过消息传递交换信息(无论采用何种格式最方便的定义:文本,s表达式,二进制格式,JSON等)。我只会尝试在相同的进程中桥接代码,如果我确定更简单的方法无法工作。

编辑:自从我去年写下这个答案后,杰里米·雅洛普出现了Ctypes图书馆;这是一种非常有前途的方法,可能比直接将C与OCaml接口简单得多。

答案 1 :(得分:4)

最简单的方法是分两步:OCaml→C,然后使用extern关键字选择C→C ++。我在我的COH*ML项目中广泛地这样做,该项目将OCaml与C ++中的Coherence库绑定。例如在OCaml中我有:

type coh_ptr  (* Pointer to a Cohml C++ object *)
external coh_getcache: string -> coh_ptr = "caml_coh_getcache"

然后在C ++中,首先是一个C函数:

extern "C" {
  value caml_coh_getcache(value cn) {
    CAMLparam1(cn);
    char* cache_name = String_val(cn);
    Cohml* c;
    try {
      c = new Cohml(cache_name);
    } catch (Exception::View ce) {
      raise_caml_exception(ce);
    }
    value v = caml_alloc_custom(&coh_custom_ops, sizeof(Cohml*), 0, 1);
    Cohml_val(v) = c;
    CAMLreturn(v);
  }
}

最后是C ++实现:

Cohml::Cohml(char* cn) {
  String::View vsCacheName = cn;
  hCache = CacheFactory::getCache(vsCacheName);
}

走另一条路的原则基本相同。