Может ли язык сборки мусора компилироваться в язык без сбора мусора без включения сборщика мусора во время выполнения? - PullRequest
2 голосов
/ 25 февраля 2020

Насколько я понимаю, когда управляемый язык (например, Haxe) может и хочет компилироваться в неуправляемый язык (например, C ++), он включает некоторую форму сборщика мусора во время выполнения.

I Интересно, можно ли полностью абстрагировать управление памятью в дереве промежуточного представления / абстрактного синтаксиса, чтобы не требовался сборщик мусора и поведение по умолчанию (выделение стека продолжается до конца области, а выделение кучи - до освобождения) можно использовать?

Спасибо!

1 Ответ

3 голосов
/ 25 февраля 2020

Если я вас правильно понял, вы спрашиваете, можно ли взять язык сборки мусора и скомпилировать его в эквивалентную программу на языке без сборки мусора, не внося ошибок памяти или утечек, просто добавив free s в нужных местах (т.е. нет подсчета ссылок или иным образом отслеживания ссылок или реализации алгоритма сбора мусора в любом случае или выполнения чего-либо еще во время выполнения, что можно считать сборкой мусора).

Нет, это невозможно , Чтобы сделать что-то подобное, вы должны иметь возможность статически ответить на вопрос «Какой смысл в программе, после которого на данный объект больше не ссылаются», который является нетривиальным свойством semanti c и, таким образом, неразрешимой согласно теореме Райса.

Вы можете определить достаточно ограниченное подмножество языка (что-то вроде «только одна живая переменная может одновременно содержать сильную ссылку на объект, а все остальное должно использовать слабые ссылки»), но программирование в этом подмножестве будет настолько отличаться от программирования на языке оригинала… что в этом не будет особого смысла.


¹ И, возможно, еще важнее: маловероятно, что существующий код будет соответствовать этому подмножеству. Поэтому, если есть компилятор, который может скомпилировать мой код в эффективный собственный код, свободный от G C, но только если я полностью переписываю свой код, чтобы он соответствовал неудобному подмножеству языка, почему бы мне просто не переписать проект в русте вместо? Тем более, что взаимодействие с библиотеками, которые не записаны в подмножестве, вероятно, также будет невозможно.

...