Wie würde eine Sprache aussehen, in der präzise GC als Bibliothek implementiert werden kann?

8

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) == 0auf 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:

  1. Makros oder irgendeine Form der Metaprogrammierung, um den gesamten zusätzlichen Code zu kapseln, der zum Registrieren von GC-Wurzeln erforderlich ist.
  2. Einige Reflexionsmechanismen, mit denen Sie Strukturen oder Gewerkschaften inspizieren können. Sie müssen bestimmen, welche Mitglieder Zeiger sind.
  3. 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.

korrok
quelle
interessante Idee / "Gedankenexperiment", aber ein Teil des Schlüsselaspekts von Garbage-Collected-Sprachen ist, dass Zeigerverweise auf nicht zugewiesenen Speicher unmöglich sind, was in "den meisten" (allen?) Nicht-Garbage-Collected-Sprachen und allen nicht erzwungen werden kann Zeiger / Speicherlogik / Referenzierung wird stark von der Sprache verwaltet. Daher müsste jede Antwort diesen Schlüsselaspekt berücksichtigen. Eigentlich ist es vielleicht nicht die Antwort, die Sie wollen, aber denken Sie, dass die Implementierung von GC als bloße Bibliothek in einer Nicht-GC-Sprache nicht vorstellbar ist.
vzn

Antworten:

1

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 gibt T. Die Metaprogrammierung, von der Sie sprechen, findet also nicht statt

Was 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 unsafeBlock deklariert (der zum Implementieren von Dingen wie dem Garbage Collector verwendet wird). . Wenn Sie also einen Zeiger haben, der nicht in einen GcTyp 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 den GcTyp eingeschlossen, oder es befindet sich in Einzelbesitz und wird automatisch freigegeben.

Jeder Typ hat eine implizite dropMethode, die aufgerufen wird, wenn der Gültigkeitsbereich verlassen wird, und die die Zuordnung von Dingen aufhebt, auf die er verweist. Diese dropMethode 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 unsafeBlock 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.

jmite
quelle
1

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.

Cecilia Chen
quelle