Языки программирования и теория компиляции 9: Garbage Collectors
Garbage Collectors (GC) — это теория компиляции, которая занимается автоматическим освобождением неиспользуемой памяти во время выполнения программы. Основная идея GC в определённой точке выполнения программы заключается в том, чтобы найти всю достижимую память (от живых переменных, видимых в этой точке). Вся память, которая не достижима, может быть использована для выделения (является свободной). Принцип работы GC заключается в том, чтобы отметить все используемые объекты кучи, следуя по spanning-деревьям от всех ссылок, расположенных на стеке или в регистрах. Затем GC либо поддерживает свободные списки свободных фрагментов в пространстве кучи, либо уплотняет используемые блоки кучи в пространстве кучи для уменьшения фрагментации, либо просто копирует все используемые объекты в новую кучу. Существуют две основные формы GC: консервативная и точная. Консервативная GC часто не требует специальной поддержки от языка или компилятора: она может работать с нетипизированными языками программирования (например, C/C++) и не требует специальной информации от компилятора. Точная GC требует возможности идентифицировать все указатели в программе во время выполнения (для этого в большинстве случаев исходный язык должен быть типизированным). Для идентификации указателей во время выполнения необходима поддержка компилятора, чтобы находить все места, где во время выполнения находятся живые переменные указателя, включая стек процессора и регистры
Garbage Collectors (GC) — это теория компиляции, которая занимается автоматическим освобождением неиспользуемой памяти во время выполнения программы. Основная идея GC в определённой точке выполнения программы заключается в том, чтобы найти всю достижимую память (от живых переменных, видимых в этой точке). Вся память, которая не достижима, может быть использована для выделения (является свободной). Принцип работы GC заключается в том, чтобы отметить все используемые объекты кучи, следуя по spanning-деревьям от всех ссылок, расположенных на стеке или в регистрах. Затем GC либо поддерживает свободные списки свободных фрагментов в пространстве кучи, либо уплотняет используемые блоки кучи в пространстве кучи для уменьшения фрагментации, либо просто копирует все используемые объекты в новую кучу. Существуют две основные формы GC: консервативная и точная. Консервативная GC часто не требует специальной поддержки от языка или компилятора: она может работать с нетипизированными языками программирования (например, C/C++) и не требует специальной информации от компилятора. Точная GC требует возможности идентифицировать все указатели в программе во время выполнения (для этого в большинстве случаев исходный язык должен быть типизированным). Для идентификации указателей во время выполнения необходима поддержка компилятора, чтобы находить все места, где во время выполнения находятся живые переменные указателя, включая стек процессора и регистры
