После просмотра нескольких ответов о переполнении стека становится ясно, что некоторые скомпилированные в нативе языки имеют сборку мусора . Но мне неясно, как именно это будет работать.
Я понимаю, как сборка мусора может работать с интерпретированным языком. Сборщик мусора будет просто работать рядом с интерпретатором и удалять неиспользуемые и недоступные объекты из памяти программы. Они оба бегут вместе.
Как это будет работать со скомпилированными языками? Насколько я понимаю, как только компилятор скомпилировал исходный код в целевой код - в частности, машинный код - это делается. Его работа закончена. Так как же скомпилированная программа может быть собрана сборщиком мусора?
Работает ли компилятор с процессором каким-то образом во время выполнения программы для удаления «мусорных» объектов? Или компилятор включает минимальный сборщик мусора в исполняемый файл скомпилированной программы.
Я полагаю, что мое последнее утверждение будет более обоснованным, чем первое из-за этой выдержки из этого ответа о переполнении стека :
Одним из таких языков программирования является Eiffel. Большинство компиляторов Eiffel генерируют C-код по причинам переносимости. Этот C-код используется для создания машинного кода стандартным C-компилятором. Реализации Eiffel предоставляют GC (и иногда даже точный GC) для этого скомпилированного кода, и нет необходимости в VM. В частности, компилятор VisualEiffel генерировал собственный машинный код x86 напрямую с полной поддержкой GC .
Последнее утверждение, кажется, подразумевает, что компилятор включает некоторую программу в конечный исполняемый файл, который действует как сборщик мусора во время работы программы.
Страница на веб-сайте языка D о сборке мусора, которая скомпилирована нативно и имеет дополнительный сборщик мусора, также, похоже, намекает на то, что некоторая фоновая программа запускается вместе с исходной исполняемой программой для реализации сборки мусора.
D - язык системного программирования с поддержкой сборки мусора. Обычно нет необходимости явно освобождать память. Просто выделите по мере необходимости, и сборщик мусора будет периодически возвращать всю неиспользованную память в пул доступной памяти.
Если метод упомянутый выше будет использоваться, как именно он будет работать? Сохраняет ли компилятор копию какой-либо программы сборки мусора и вставляет ее в каждый исполняемый файл, который он генерирует?
Или я ошибаюсь в своих мыслях? Если да, какие методы используются для реализации сборки мусора для скомпилированных языков и как именно они будут работать?
malloc()
.