7

Я пишу компилятор для довольно стандартной машины стека. Теперь я хочу добавить сборщика мусора. Я вижу, что я мог бы генерировать какие-то «карты стека», чтобы узнать, какие переменные являются корнями gc в каждой записи активации. Однако я понятия не имею, как справляться с промежуточными значениями, вставленными в стек во время выполнения. Язык, который я компилирую, является Pascal-подобным, поэтому мне не нужен, и я не хочу использовать теги для определения указателей из других типов данных.Как найти корни gc в стековой машине?

Я был бы признателен за любые подсказки/указатели о том, как

  1. Найти Gc корни в стеке в любой момент времени (то есть, как определить, какие из промежуточных значений, которые были вытеснены в стеке gc).
  2. Обычные формы, кодирующего эту информацию (то есть, как генерировать и кодировать «стек карты»)

Большое спасибо! Nicolas

ответ

2

Простым решением является явное сохранение типа каждой записи в стеке. Тогда вам не нужна карта стека; если тип является «ссылкой», то запись является корнем GC. Этот подход особенно удобен для отладки, поскольку вы можете легко отображать (типизированное) содержимое стека.

Если вы действительно хотите использовать карты стека, простым решением является создание карты стека для каждой инструкции. Вы делаете это, отслеживая содержимое стека во время компиляции или выполняя второй проход по скомпилированным инструкциям. Затем, ища корни GC, для каждого кадра в стеке вы используете карту, которая идет с текущей инструкцией.

3

Другой вариант - использовать теневой стек: стоп ссылок, которые вы поддерживаете. Это самый простой вариант для реализации.