Wie unterschiedlich ist die Müllabfuhr in reinen Sprachen?

26

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 ( mapz. 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?

Jack
quelle
1
Vielleicht möchten Sie diese wiki.haskell.org/GHC/Memory_Management
Mateusz K.

Antworten:

13

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 .

Davislor
quelle
4
Eifrige Werbung beruht auf Faulheit. Durch die Aktualisierung eines Thunks in einer alten Generation kann ein Zeiger auf die neue Generation erstellt werden. Thunks werden jedoch nur einmal mutiert, sodass es ausreicht, das junge Objekt eifrig zu promoten. Andere Verweise von Alt zu Jung (z. B. von veränderlichen Arrays) werden mithilfe von "gespeicherten Mengen" verfolgt, die auch verwendet werden, wenn die eifrige Promotion fehlschlägt.
Jon Purdy
1

In einer reinen Sprache wie Haskell sind alle Daten unveränderlich und vorhandene Datenstrukturen können in keiner Weise geändert werden

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 .

Welche Strategien und Techniken setzen Müllsammler angesichts der Reinheit ein, die sie sonst nicht anwenden würden?

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.

Was funktioniert sehr gut in der GC einer unreinen Sprache, die sich nicht in einem reinen Kontext befindet?

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.

Welche anderen neuen Probleme bereiten reine Sprachen für GCs?

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.

Jon Harrop
quelle
"Bei Bedarf wird der Ausdruck ausgewertet und der Thunk in den resultierenden Wert mutiert." Dies ist ein internes Implementierungsdetail für einen Haskell-Benutzer. Es gibt keine Möglichkeit, die Mutation zu beobachten, daher handelt es sich aus Sicht des Benutzers nicht um eine Mutation.
Jack
Außerdem ist es durchaus möglich, dass eine reine Sprache streng ist - siehe Idris als Beispiel.
Jack