Как найти корни gc в стековой машине?
Я пишу компилятор для довольно стандартной стековой машины. Теперь я хочу добавить сборщик мусора. Я вижу, что мог бы генерировать некие "стековые карты", чтобы знать, какие переменные являются корнями gc в каждой записи активации. Однако я понятия не имею, как обращаться с промежуточными значениями, помещаемыми в стек во время выполнения. Язык, который я компилирую, похож на Pascal, поэтому мне не нужно, и я не хочу использовать теги для идентификации указателей из других типов данных.
Буду признателен за любые подсказки / указатели о том, как
- Найти корни gc в стеке в любой момент времени (т. Е. Как определить, какие из промежуточных значений, которые были помещены в стек, являются корнями gc).
- Обычные формы кодирования этой информации (например, как генерировать и кодировать "стековые карты")
Большое спасибо! никола
2 ответа
Простое решение состоит в том, чтобы явно хранить тип каждой записи стека. Тогда вам не нужна карта стека; если тип - "ссылка", то запись является корнем GC. Этот подход особенно удобен для отладки, потому что вы можете легко отобразить (напечатанное) содержимое стека.
Если вы действительно хотите использовать стековые карты, простое решение - сгенерировать стековую карту для каждой инструкции. Вы делаете это, отслеживая содержимое стека во время компиляции или делая второй проход по скомпилированным инструкциям. Затем при поиске корней GC для каждого кадра в стеке используется карта, соответствующая текущей инструкции.
Другим вариантом является использование стека теней: стопка ссылок, которую вы поддерживаете сами. Это, безусловно, самый простой вариант для реализации.