7

我正在編寫一個相當標準的堆棧機器的編譯器。現在我想添加一個垃圾收集器。我可以看到我可以生成某種「堆棧映射」來知道哪些變量是每個激活記錄中的gc根。但是,我不知道如何處理在執行過程中壓入堆棧的中間值。我正在編譯的語言與Pascal相似,所以我不需要,也不想使用標記來識別來自其​​他數據類型的指針。如何在堆棧機器中找到gc根?

我希望任何提示/如何

  1. 在任何時間點查找堆棧GC根指針(即,如何識別哪些已在堆棧已經被推的中間值是GC根)。
  2. 常見的形式編碼該信息(即如何產生和編碼「疊加圖」)

非常感謝你的! Nicolas

回答

2

一個簡單的解決方案是明確存儲每個堆棧條目的類型。那麼你不需要堆棧圖;如果類型是「引用」,則該條目是GC根目錄。這種方法在調試時特別方便,因爲您可以輕鬆顯示堆棧的(鍵入的)內容。

如果你真的想使用堆棧映射,一個簡單的解決方案是生成一個堆棧映射去與每條指令。您可以通過在編譯時跟蹤堆棧內容,或者通過編譯指令第二遍來完成此操作。然後,在查找GC根時,對於堆棧中的每個幀,都使用與當前指令一起使用的映射。

3

另一種選擇是使用陰影堆棧:您維護自己的引用堆棧。這是迄今爲止最容易實現的選項。