W czystym języku, takim jak Haskell, wszystkie dane są niezmienne i nie można w żaden sposób zmieniać istniejących struktur danych
W rzeczywistości nie jest to ogólnie prawdą. Czyste języki używają nie ścisłej (leniwej) oceny, więc ocena potencjalnie wszystkich podwyrażeń jest odraczana. Nieocenione wyrażenia są na ogół przypisywane do sterty jako „thunk”. W razie potrzeby wyrażenie jest oceniane, a kolec jest mutowany w wynikową wartość.
Jakie strategie i techniki stosują śmieciarze w obliczu czystości, których inaczej by nie zrobili?
Jedyne, co mogę wymyślić, to czarne dziury . Nie przypominam sobie, aby widziałem coś nowego po stronie GC w pracach naukowych Haskell.
Co działa bardzo dobrze w GC języka nieczystego, który nie działa w czystym kontekście?
Bariera zapisu GC. Zanieczyszczone języki mają tendencję do pisania wskaźników na stosie o wiele częściej, więc ich bariery zapisu są bardziej zoptymalizowane.
Inne algorytmy GC, takie jak region znacznika, są znacznie bardziej opłacalne w kontekście nieczystych języków, ponieważ mogą mieć znacznie niższe wskaźniki alokacji niż języki czyste.
Jakie inne nowe problemy stwarzają czyste języki dla GC?
Czyste języki są bardzo rzadkie, więc jest o wiele mniej danych o tym, jak czyste programy wykorzystują pamięć, dlatego zaczynasz w gorszej sytuacji, gdy próbujesz napisać GC dla czystego języka.