Ist eine Garbage Collection in einer Stack-basierten Sprache erforderlich?

16

Was ist für die Garbage Collection (GC) in einer Stack-basierten Sprache erforderlich? Gibt es in einer Sprache wie Forth oder RPL (auf HP- Rechnern ) eine Notwendigkeit für die Speicherbereinigung?

Ich würde denken, da die Ausgabe vom Stapel gefallen ist, gäbe es keine Notwendigkeit. Vermisse ich etwas?

Todd Moses
quelle

Antworten:

14

GC wird normalerweise auf den auf dem Heap zugewiesenen Speicher angewendet. Ich bin nicht mit Forth oder RPL vertraut, aber wenn es keinen Heap gibt und alles stattdessen auf einem globalen Stack gespeichert ist, hat GC nichts zu tun.

Mike Baranczak
quelle
2
Das typische Speicherverwendungsmuster der Forth-Programme, die ich in den frühen Tagen gelesen habe, war, dass sie wie Assembly-Programme waren, da sie vorab festgelegte statische globale Datenadressen verwendeten. Dies funktioniert, weil Forth Daten zwischen dem Stapel und bestimmten Adressen übertragen kann. Außerdem kann es Adressen berechnen. Somit wäre es möglich, eine Allokatorbibliothek basierend auf einem Heap-Konzept zu erstellen, und die Allokatorbibliothek würde eine Möglichkeit benötigen, mit der endlichen Größe des Heaps umzugehen. Wenn ein Forth-Benutzer diesen Weg beschreitet, möchte und implementiert er möglicherweise GC.
Cardiff Space Man
13

Ja, du hast Recht. Die Stapelbasiertheit ist jedoch nur ein Teil der gesamten Geschichte. Beispielsweise ist der Java-Bytecode-Interpreter ebenfalls stapelbasiert (der kompilierte Code funktioniert aus Effizienzgründen anders). Dies sagt uns, dass jede Sprache in eine Stapelsprache umgewandelt werden kann.

Entscheidend sind die Objekte außerhalb des Stacks, die die aktuelle Methodenausführung überleben können. Solange die Sprache nichts wie mallocoder hat new, gibt es keine solchen Objekte und Sie brauchen deleteweder GC noch GC.

Eine Sprache ohne dynamische Speicherzuweisung ist in ihrer Nützlichkeit ziemlich begrenzt.

maaartinus
quelle
Ich bin mir nicht sicher, ob ich mit der letzten Zeile einverstanden bin. Ist Java-Bytecode nicht nützlich?
jk.
@jk., Java-Bytecode verfügt über eine dynamische Speicherzuweisung.
Peter Taylor
1
Tatsächlich gibt es mehrere Mehrzwecksprachen, die stapelbasiert sind. Schauen Sie sich factorcode.org
Yam Marcovic
1
Eigentlich ist der Faktor Müll gesammelt
Andrea
1

Garbage Collection ist erforderlich, wenn die Sprache von Natur aus dynamische Datenstrukturen unterstützt. Dies ist fast eine Notwendigkeit, wenn Sie etwas tun möchten, das über das Niveau von C hinausgeht. Ohne dies haben Sie nur Datenstrukturen mit fester Größe und verwalten den Speicher selbst. Das ist natürlich das, was Original Forth tut, aber es ist wahrscheinlich nicht etwas, was Sie heute tun möchten, es sei denn, Sie führen nur Low-Level-Systemcodierungen durch.

trans
quelle
1

Garbage Collection wird nicht benötigt, wenn die Sprache statische Zuweisung anstelle von Stapelzuweisung verwendet. Zum Beispiel reserviert Fortran 77 mit der Option -s (statischer Speicher) den gesamten Speicher, wenn das Programm gestartet wird. Daher erfolgt zur Laufzeit keine Speicherzuweisung, um freigegeben zu werden. Während es einige Disziplin erfordert, ist es möglich, Programme zu schreiben, insbesondere Simulationen, um die statische Speicherzuweisung zu verwenden. Die statische Zuordnung beseitigt alle Speicherverluste und führt zu einer hervorragenden Cache-Leistung, da der Compiler mithilfe der statischen Analyse ermitteln kann, was in den Cache geladen werden soll.

Michael Shopsin
quelle