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