In einer reinen Sprache wie Haskell sind alle Daten unveränderlich und vorhandene Datenstrukturen können in keiner Weise geändert werden. Darüber hinaus erzeugen viele Algorithmen für unveränderliche Daten und funktionale Programmiermuster von Natur aus große Mengen an Müll ( map
z. B. Ketten zur Erstellung von Zwischenlisten).
Welche Strategien und Techniken setzen Müllsammler angesichts der Reinheit ein, die sie sonst nicht anwenden würden? Was funktioniert sehr gut in der GC einer unreinen Sprache, die sich nicht in einem reinen Kontext befindet? Welche anderen neuen Probleme bereiten reine Sprachen für GCs?
Antworten:
Die aktuelle Implementierung von ghc verwendet eine Strategie, die nur funktioniert, weil die Sprache rein funktional und die Daten unveränderlich sind: Da keine Variable jemals geändert werden kann, um auf etwas Neueres zu verweisen, enthalten Objekte nur Verweise auf ältere Objekte, sodass ein generativer Garbage Collector ausgeführt wird ; Da ein Objekt, auf das von einer höheren Generation verwiesen wird, erst gelöscht werden kann, wenn diese Generation GCd ist, werden Objekte eifrig zu höheren Generationen befördert. und da nichts die Referenzen verändert, während der GC sie fegt, kann er parallel laufen.
Hier ist ein Artikel mit mehr Details .
quelle
Eigentlich stimmt das nicht generell. Reine Sprachen verwenden eine nicht strenge (faule) Auswertung, sodass die Auswertung potenziell aller Unterausdrücke zurückgestellt wird. Nicht bewertete Ausdrücke werden im Allgemeinen als "Thunk" bezeichnet. Bei Bedarf wird der Ausdruck ausgewertet und der Thunk zum resultierenden Wert mutiert .
Das einzige, woran ich denken kann, sind Schwarze Löcher . Ich kann mich nicht erinnern, in den Forschungsberichten von Haskell etwas Neues auf der GC-Seite gesehen zu haben.
Die GC-Schreibsperre. Unreine Sprachen neigen dazu, viel mehr Zeiger in den Haufen zu schreiben, sodass ihre Schreibbarrieren tendenziell stärker optimiert werden.
Andere GC-Algorithmen wie Mark-Region sind im Kontext von unreinen Sprachen viel praktikabler, da sie viel niedrigere Zuweisungsraten als reine Sprachen haben können.
Reine Sprachen sind sehr selten, daher gibt es viel weniger Daten darüber, wie reine Programme den Speicher nutzen, und Sie befinden sich in einer schlechten Ausgangslage, wenn Sie versuchen, einen GC für eine reine Sprache zu schreiben.
quelle