假设您正在将一种函数式语言编译为可移植的 C,并且还假设由于各种原因您想要精确而不是保守的垃圾收集。垃圾收集器没有可移植的方式(在一般情况下可能根本没有办法)来确定 C 堆栈上什么是指针,什么不是指针。在我看来,这个问题有两种解决方案:
阴影堆栈。让每个 C 函数维护有关什么是指针和不是指针的簿记信息。这是例如 LLVM 推荐的方法。
利用您正在编译函数式语言这一事实,这意味着主线代码没有副作用。当分配器检测到内存不足时,它不会调用垃圾收集器本身,而是通过 longjmp 中止当前操作返回到调用垃圾收集器的主循环(在可能包含指针的变量集已知的上下文中)提前)然后重新开始操作。
在我看来,如果您正在处理适用于第二种方法的纯函数式语言,它必须比第一种方法更有效,并且更容易与手写 C 混合。
有没有我忽略的问题?对这项技术的现有讨论或实现有任何参考吗?