Angenommen, Sie haben eine Programmiersprache mit manueller Speicherverwaltung. Welche Funktionen muss diese Sprache haben, um eine präzise Speicherbereinigung als Bibliothek und nicht als grundlegendes Sprachkonstrukt implementieren zu können?
Mit einem präzisen GC meine ich einen, bei dem nur Zeiger auf den Heap durchlaufen werden, um festzustellen, welche Variablen aktiv sind oder nicht.
Einige zusätzliche Überlegungen:
- C und C ++ haben den Böhm-Garbage-Collector, aber ich zähle das nicht, da es kein präziser GC ist. Der Boehm-Kollektor geht davon aus, dass alles auf dem Stapel, was ein Zeiger sein könnte, der ausschließlich auf den Anforderungen an die Speicherausrichtung basiert, ein Zeiger ist. Zum Beispiel jede Ganzzahl
k
, die(k % 4) == 0
auf Bitebene wie ein Zeiger aussieht, da Zeiger 4-Byte-ausgerichtet sein müssen. - Elster transformiert vorhandenen C-Code, um einen präzisen Garbage Collector zu verwenden. Der generierte C-Code enthält viele Stubs für die Speicherbereinigung, dh für die Registrierung von Stapelzeigern im Heap beim Collector. Ich zähle das nicht, weil von niemandem erwartet werden kann, dass er Code auf diese Weise schreibt. Es ist eher ein Kompilierungsziel für andere Sprachen.
Ich stelle mir vor, dass eine solche Sprache Folgendes haben müsste:
- Makros oder irgendeine Form der Metaprogrammierung, um den gesamten zusätzlichen Code zu kapseln, der zum Registrieren von GC-Wurzeln erforderlich ist.
- Einige Reflexionsmechanismen, mit denen Sie Strukturen oder Gewerkschaften inspizieren können. Sie müssen bestimmen, welche Mitglieder Zeiger sind.
- Einige Reflexionsmechanismen, mit denen Sie das Stapelrahmenlayout untersuchen können. Das klingt viel schwieriger als 2.
Ich hoffe, das ist nicht zu vage oder meinungsbasiert, aber ich habe mich eine Weile darüber gewundert.
Antworten:
Ich glaube, dass dies in einer Sprache wie Rust möglich oder zumindest fast möglich ist, wenn auch vielleicht nicht unbedingt in dem Sinne, wie Sie denken.
Rust hat tatsächlich eine GC-Bibliothek , obwohl ich nicht sagen kann, wie genau sie ist. Die Idee ist jedoch, dass es einen bestimmten Typ
Gc<T>
für durch Müll gesammelte Zeiger auf Werte vom Typ gibtT
. Die Metaprogrammierung, von der Sie sprechen, findet also nicht stattWas dies möglich macht, ist das Besitzsystem von Rust: Aufgrund der affinen linearen Typisierung hat jeder Speicherort höchstens einen Zeiger darauf, es sei denn, er wird mit einem
unsafe
Block deklariert (der zum Implementieren von Dingen wie dem Garbage Collector verwendet wird). . Wenn Sie also einen Zeiger haben, der nicht in einenGc
Typ eingeschlossen ist, wird er freigegeben, sobald er den Gültigkeitsbereich verlässt. Es ist also nicht möglich, etwas als Zeiger zu betrachten, der es nicht ist: Entweder ist es in denGc
Typ eingeschlossen, oder es befindet sich in Einzelbesitz und wird automatisch freigegeben.Jeder Typ hat eine implizite
drop
Methode, die aufgerufen wird, wenn der Gültigkeitsbereich verlassen wird, und die die Zuordnung von Dingen aufhebt, auf die er verweist. Diesedrop
Methode weiß, was ein Zeiger ist und was nicht, was auch bei der Präzision hilft.Die Sprache ist stark statisch typisiert, und wenn Sie sich nicht speziell in einem
unsafe
Block befinden, können Sie keine Dinge in andere Typen umwandeln, sodass statisch bekannt ist, welchen Typ ein bestimmter Speicherblock hat.Dies ist kein Drop-In-Transformator, mit dem Sie Nicht-GC-Code als gesammelten Müll behandeln können. Der Programmierer gibt speziell an, welche Werte erfasst werden. Aber angesichts dessen denke ich, dass es das Potenzial hat, Ihre Kriterien zu erfüllen.
quelle
Ich denke, es ist möglich, einen Garbage Collector in C ++ zu implementieren, ohne die Sprache selbst zu ändern. Um den Garbage Collector verwenden zu können, muss der Programmierer jedoch daran gehindert werden, beliebige Sprachkonstrukte zu verwenden. Insbesondere müssen alle Speicherzuweisungsanforderungen über die vom Garbage Collector angegebenen Zuordnungs-APIs erfolgen, und der gesamte Zugriff muss über Referenzen erfolgen, die vom Garbage Collector verwaltet werden.
quelle