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.