在Appel的ML中的现代编译器实现的第13章中,本书提供了有关如何为其定义的Tiger编程语言构造垃圾收集器的建议。我的问题是关于本书描述的pointer map
,这些指针映射基本上是在每个调用站点生成的关于已分配块的当前根的信息。
在页288,它说“为每个临时实现一个带有布尔值的临时映射:它是否是一个指针?还为每个堆栈帧中的偏移量制作一个类似的映射,用于帧驻留指针变量。”
这里temp
指的是无限数量的临时数,后来将被彩色到机器寄存器中。我不明白的是:
表示临时地图的好方法是什么?这些临时值后来被着色为机器寄存器,这意味着它们指的是分配块的根,这些块可能只存在于寄存器中而不存在于堆栈中。但是这些temps的值在运行时才知道。 如何让收集者知道哪个寄存器具有潜在的根?
即使有正确的表示,让我们说某个收藏家知道在读取指针图后,在此调用网站上有ebx
和edx
的潜在根源。收集器在获取该信息时已经完成了一些计算,并且可能覆盖了ebx
和edx
中的值! 如果收集器需要首先进行一些计算以确定哪些寄存器保存根,那么收集器应该如何从寄存器中检索潜在的根?