【问题标题】:How to find gc roots in a stack machine?如何在堆栈机器中找到 gc 根?
【发布时间】:2013-07-02 19:49:40
【问题描述】:

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

我会很感激任何关于如何做的提示/指针

  1. 在任何时间点在堆栈中查找 gc 根(即如何识别已压入堆栈的中间值中哪些是 gc 根)。
  2. 编码此信息的常用形式(即,如何生成和编码“堆栈图”)

非常感谢! 尼古拉斯

【问题讨论】:

    标签: compiler-construction garbage-collection code-generation stack-machine gc-roots


    【解决方案1】:

    另一种选择是使用影子堆栈:您自己维护的引用堆栈。这是迄今为止最容易实现的选项。

    【讨论】:

      【解决方案2】:

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

      如果你真的想使用堆栈映射,一个简单的解决方案是生成一个堆栈映射来配合每条指令。您可以通过在编译时跟踪堆栈内容或通过对已编译指令进行第二次传递来做到这一点。然后在查找 GC 根时,对于堆栈上的每一帧,您使用当前指令附带的映射。

      【讨论】:

        猜你喜欢
        • 2020-11-23
        • 2014-09-29
        • 1970-01-01
        • 2012-07-03
        • 2021-02-28
        • 1970-01-01
        • 2010-10-31
        • 2021-01-20
        • 2016-03-13
        相关资源
        最近更新 更多