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