如何在堆栈机器中找到gc root?

Nic*_*lás 7 compiler-construction garbage-collection code-generation stack-machine gc-roots

我正在为一个相当标准的堆栈机器编写一个编译器.现在我想添加一个垃圾收集器.我可以看到,我可以生成某种"堆栈映射",以了解哪些变量是每个激活记录中的gc根.但是,我不知道如何处理执行期间在堆栈中推送的中间值.我正在编译的语言是Pascal式的,所以我不需要,我不想使用标签来识别来自其​​他数据类型的指针.

我会很感激有关如何的任何提示/指示

  1. 在任何时间点在堆栈中查找gc根(即,如何识别已在堆栈中推送的哪些中间值是gc根).
  2. 编码此信息的常用形式(即,如何生成和编码"堆栈映射")

非常感谢你!萨科

Rus*_*ser 2

一个简单的解决方案是显式存储每个堆栈条目的类型。那么你就不需要堆栈映射;如果类型是“引用”,则该条目是 GC 根。这种方法对于调试特别方便,因为您可以轻松显示堆栈的(类型化)内容。

如果您确实想使用堆栈映射,一个简单的解决方案是生成一个堆栈映射以配合每条指令。您可以通过在编译时跟踪堆栈内容或对已编译指令进行第二次传递来实现此目的。然后,在查找 GC 根时,对于堆栈上的每个帧,您将使用与当前指令相关的映射。