Утечки памяти и висячие указатели являются основными проблемами ручного управления памятью. Вы удаляете родительский узел в связанном списке, забывая сначала удалить все его дочерние узлы - и ваша память просачивается. Вы удаляете цепочку объектов в правильном порядке - но вдруг ваша программа падает, так как вы забыли о втором владельце этого ресурса, который теперь пытается разыменовать нулевой указатель.
Чтобы избежать этих проблем, большинство современных языков программирования высокого уровня реализуют автоматическое управление памятью. Вы размещаете объекты вручную, однако не беспокоитесь об их освобождении: специальная программа, сборщик мусора, знает, как правильно автоматически их освобождать, и требует повторного использования в будущем.
В курсе "Основы сборщиков мусора" мы изучаем все различные методы и алгоритмы, связанные с автоматическим управлением памятью, которые используются сегодня на практике.
Для кого этот курс?
Прежде всего, для инженеров компилятора.
При реализации вашего языка программирования очень велика вероятность того, что вам потребуется реализовать сборщик мусора. В большинстве современных языков программирования высокого уровня модуль сборщика мусора (или несколько модулей GC, как в Java) сегодня является в значительной степени требованием.
Что если я не использую языки программирования каждый день?
Если вы не являетесь инженером компилятора, тогда этот курс может быть для вас интересным. Реализация сборщика мусора или менеджера памяти в целом - довольно сложная инженерная задача. Это простой трюк: вы берете какой-то сложный проект (например, сборщик мусора, компилятор, интерпретатор и т. д.), И при его создании вы изучаете все различные структуры данных и алгоритмы.
Нужен ли мне C или C ++ для этого курса?
На самом деле, нет! Конечно, C и C ++, вероятно, являются лучшими языками для необработанных манипуляций с памятью и хорошо подходят здесь, однако в ходе курса мы изучаем общие алгоритмы проектирования и сосредотачиваемся в основном на теоретических аспектах сборщиков мусора и распределителей памяти. Это означает, что вы можете реализовать их на любом языке. Например, вы можете выделить ArrayBuffer в JavaScript для виртуальной кучи или аналогично bytearray в Python, Rust и т. д.
Большинство алгоритмов в курсе описаны в общем псевдокоде, поэтому вы можете перенести их на любой язык.