На чистом языке, таком как Haskell, все данные неизменны, и никакие существующие структуры данных не могут быть изменены каким-либо образом. Кроме того, многие алгоритмы неизменяемых данных и шаблоны функционального программирования по своей природе генерируют большое количество мусора (например, цепочки map
создания промежуточных списков).
Какие стратегии и методы используют сборщики мусора перед лицом чистоты, что иначе они бы не сделали? Что работает очень хорошо в GC нечистого языка, который не в чистом контексте? Какие еще новые проблемы создают чистые языки для GC?
Ответы:
Текущая реализация ghc использует стратегию, которая работает только потому, что язык является чисто функциональным, а данные неизменяемыми: поскольку ни одна переменная не может быть изменена для ссылки на что-то более новое, объекты содержат ссылки только на более старые объекты, поэтому он запускает сборщик мусора поколений ; поскольку объект, на который ссылается более высокое поколение, не может быть удален до тех пор, пока это поколение не станет GCd, он охотно продвигает объекты в более высокие поколения; и поскольку ничто не изменит ссылок во время их очистки GC, он может работать параллельно.
Вот статья с более подробной информацией .
источник
На самом деле это не совсем так. Чистые языки используют нестрогую (ленивую) оценку, поэтому оценка потенциально всех подвыражений откладывается. Неоцененные выражения обычно выделяются в виде кучи как «thunk». При необходимости выражение вычисляется , и преобразователь является мутированным в полученное значение.
Единственное, о чем я могу думать, это черные дыры . Я не помню, чтобы видел что-то новое со стороны GC в исследовательских работах на Haskell.
GC пишет барьер. Нечистые языки, как правило, гораздо чаще пишут указатели в кучу, поэтому их барьеры записи более сильно оптимизируются.
Другие алгоритмы GC, такие как mark-region, гораздо более жизнеспособны в контексте нечистых языков, потому что они могут иметь гораздо более низкие скорости выделения, чем чистые языки.
Чистые языки очень редки, поэтому гораздо меньше данных о том, как чистые программы используют память, и, следовательно, вы начинаете в худшем положении, когда пытаетесь написать GC для чистого языка.
источник