Nach dem Durchsuchen mehrerer Antworten eines Stapelüberlaufs ist klar, dass einige nativ kompilierte Sprachen eine Garbage Collection haben . Aber mir ist unklar, wie genau das funktionieren würde.
Ich verstehe, wie Garbage Collection mit einer interpretierten Sprache funktionieren kann. Der Garbage Collector wird einfach neben dem Interpreter ausgeführt und löscht nicht verwendete und nicht erreichbare Objekte aus dem Speicher des Programms. Sie laufen beide zusammen.
Wie würde das mit kompilierten Sprachen funktionieren? Ich verstehe, dass, sobald der Compiler den Quellcode in den Zielcode kompiliert hat - insbesondere nativen Maschinencode -, es getan ist. Seine Arbeit ist beendet. Also, wie könnte das kompilierte Programm auch als Müll eingesammelt werden?
Arbeitet der Compiler in irgendeiner Weise mit der CPU zusammen, während das Programm zum Löschen von "Garbage" -Objekten ausgeführt wird? Oder enthält der Compiler einen minimalen Garbage Collector in der ausführbaren Datei des kompilierten Programms.
Ich glaube, meine letztere Aussage hätte aufgrund dieses Auszugs aus dieser Antwort zum Stapelüberlauf mehr Gültigkeit als die erstere :
Eine solche Programmiersprache ist Eiffel. Die meisten Eiffel-Compiler generieren aus Gründen der Portabilität C-Code. Dieser C-Code wird verwendet, um Maschinencode von einem Standard-C-Compiler zu erzeugen. Eiffel-Implementierungen bieten GC (und manchmal sogar genaue GC) für diesen kompilierten Code, und es ist keine VM erforderlich. Insbesondere hat der VisualEiffel-Compiler nativen x86-Maschinencode direkt mit vollständiger GC-Unterstützung generiert .
Die letzte Aussage scheint zu implizieren, dass der Compiler ein Programm in die endgültige ausführbare Datei einschließt, das als Garbage Collector fungiert, während das Programm ausgeführt wird.
Die Seite auf der D-Language-Website über die Garbage Collection - die nativ kompiliert wurde und optional über einen Garbage Collector verfügt - scheint auch darauf hinzudeuten, dass einige Hintergrundprogramme neben dem ursprünglichen ausführbaren Programm zur Implementierung der Garbage Collection ausgeführt werden.
D ist eine Systemprogrammiersprache mit Unterstützung für die Garbage Collection. Normalerweise ist es nicht erforderlich, Speicher explizit freizugeben. Ordnen Sie es einfach nach Bedarf zu, und der Garbage Collector gibt in regelmäßigen Abständen den gesamten nicht verwendeten Speicher in den Pool des verfügbaren Speichers zurück.
Wenn die oben genannten Verfahren wird verwendet, wie genau würde es funktionieren? Speichert der Compiler eine Kopie eines Garbage Collection-Programms und fügt sie in jede von ihm generierte ausführbare Datei ein?
Oder habe ich einen Denkfehler? Wenn ja, welche Methoden werden zur Implementierung der Garbage Collection für kompilierte Sprachen verwendet und wie genau würden sie funktionieren?
malloc()
.