我可以将 OCaml GC 与 LLVM GC 接口一起使用吗?

Can I use the OCaml GC with the LLVM GC interface?

对于我的 PHP LLVM 后端,我想试用 OCaml GC。是否可以将它与 LLVM 一起使用?特别是:

  1. OCaml GC 是否足够解耦以在编译器之外使用?
  2. LLVM GC 接口是否足够成熟,可以与 OCaml GC 一起使用?

虽然将 OCaml GC 和 Frankenstein 分离到另一个项目中似乎相对容易,但我不确定这是否真的是您在实践中想要做的事情。

OCaml 垃圾收集器是 designed with a functional programming style 的想法,这种 GC 架构可能是 PHP 等语言的责任,通常 不是 以函数式风格使用。

如果您打算这样做,那么我建议您等待几个月让 OCaml 接受多核支持 compiler/runtime,或者使用尝试为 OCaml 带来多核支持的各种项目之一时刻(其中最严重的可能是 OCamllabs 的人this project)。现在 OCaml GC 缺乏真正的多核支持,虽然这在实践中并不是什么大问题,但有些人似乎离不开它。

这不应该代表太多工作,因为 OCaml GC 已经在 LLVM 中以某种方式处理:http://llvm.org/docs/GarbageCollection.html#the-erlang-and-ocaml-gcs。这意味着为函数调用正确发出堆栈帧描述符(不是最小的,但这应该随着当前 LLVM GC 处理的发展而改进)。旧版本的 LLVM 文档告诉我们 OCaml gc 不使用写屏障,这是错误的。所以你应该小心确保生成的代码对于赋值是正确的。

对于 LLVM GC 接口,当前的接口非常受限制,不允许生成非常高效的代码,但这应该足以在等待下一个版本时进行原型设计,该版本应该包含一些重要的变化。