我不是 GC 方面的专家,但我总是认为 GC 需要VM才能工作,对吗?
如果我是对的,那么本机代码如何获得 GC?
不,您不需要 VM 来进行垃圾收集。所以这让我们没有问题要回答:-)
一般来说,要进行 GC,您只需要跟踪程序状态的各种细节。特别是您需要知道实时值(程序关心的对象)的位置。
Ocaml 维护两个不同的堆;一个用于 Ocaml 数据,一个用于 malloc'ed C 数据。如果您从 C FFI 函数返回值(通常是抽象类型,由指向 C 堆的智能指针表示)这些值将由 ocaml 垃圾收集器跟踪。当 GC 注意到数据不可达时,它将通过智能指针调用相关的终结函数。因此,可以让 C 接口在创建对象时运行 malloc,并在垃圾回收时释放。