我正在为一个相当标准的堆栈机器编写一个编译器。现在我想添加一个垃圾收集器。我可以看到,我可以生成某种“堆栈映射”,以了解哪些变量是每个激活记录中的gc根。但是,我不知道如何处理执行期间在堆栈中推送的中间值。我正在编译的语言是类似Pascal的,所以我不需要,我也不想使用标签来识别来自其他数据类型的指针。
我很感激有关如何
的任何提示/指示非常感谢! 尼古拉斯
答案 0 :(得分:3)
另一个选择是使用影子堆栈:您自己维护的一堆引用。这是迄今为止最容易实现的选择。
答案 1 :(得分:2)
一个简单的解决方案是显式存储每个堆栈条目的类型。那你就不需要堆栈图了;如果类型是“引用”,则该条目是GC根。这种方法对于调试来说特别方便,因为您可以轻松地显示堆栈的(类型化)内容。
如果你真的想使用堆栈映射,一个简单的解决方案就是生成一个堆栈映射以与每条指令一起使用。您可以通过在编译时跟踪堆栈内容,或者通过对编译指令进行第二次传递来完成此操作。然后,当查找GC根时,对于堆栈中的每个帧,使用与当前指令一起使用的映射。