2009-05-06 6 views
5

Ist es für eine nicht interpretierte Sprache möglich, einen Garbage Collector zu haben? Bei interpretierten Sprachen führt der Interpreter das Programm Zeile für Zeile aus, sodass der Interpreter eine Laufzeit mit einem GC bereitstellen kann. Aber ist es möglich, einen Müllsammler für eine andere Sprache zu haben, ohne den GC in Ihrem Code selbst zu erstellen?Kann eine nicht interpretierte Sprache einen Garbage Collector haben?

+5

Ich frage mich, ob Sie eine falsche Dichotomie zwischen "interpretiert" und "nativ" annehmen. Java und C# zum Beispiel sind weder "interpretiert" noch "nativ" - sie laufen (im Wesentlichen) in einer VM, aber von einer IL. –

+0

Kannst du bitte mehr erklären:? – Geek

+0

Für diese Unterhaltung, sehen Sie sich die Kommentare zu meiner Antwort an. –

Antwort

0

Ja.

C++ mit einer Smart-Pointer-Implementierung wird Müll sammeln, wie die Smart-Pointer-Referenz zählt auf Null gehen.

Sie haben Garbage Collection. Du hast es nicht selbst gebaut.

+1

Ich denke, dass die Frage zum Aufspüren von Garbage Collection ist, und refcount ist kein Ersatz. –

+1

Das ist keine Müllsammlung. Verbinden Sie mehrere Objekte so, dass sie einen Zyklus haben, und sie werden niemals zerstört, wenn Sie den Zyklus nicht manuell unterbrechen. – sharptooth

+0

@sharptooth: nehmen Sie es mit dem Rest der Welt, nicht ich: http://www.codeproject.com/KB/cpp/automatic_gc_using_sp.aspx –

11

Die Garbage Collection erfordert nur, dass die Zeigervariablen mit einem speziellen Weg markiert werden, damit die Laufzeit sie identifizieren und für die Garbage Collection verwenden kann. Es hat nichts mit der Interpretation/Kompilierung zu tun, sondern erfordert eine spezielle Laufzeit und speichert zusätzliche Daten für jede Variable.

+0

Gut interpretierte Sprachen geben Ihnen eine Laufzeit. Zumindest ist es für den Interpreter einfacher, als Run-Time zu arbeiten und einen Müllsammler zu betreiben. Jede native Sprache wird das Betriebssystem als Laufzeit haben? Und daher kein GC? – Geek

+1

GC und Interpretation sind nicht miteinander verwandt. Ja, es ist möglicherweise einfacher für eine interpretierte Sprache, eine Speicherbereinigung zu haben, aber nicht interpretierte Sprachen können dies auch tun. Betriebssysteme haben normalerweise keine eingebettete Unterstützung für die Speicherbereinigung, aber viele Sprachlaufzeiten haben sie. – sharptooth

+2

Und sogar ohne die Zeigervariablen in einer speziellen Weise zu markieren, können Sie so genannte konservative GC haben, die alle Speicherinhalte als potenzielle Zeiger behandelt. Siehe Boehms GC in der anderen Antwort. –

6

Nun, .NET-Sprachen (die an IL - C#, VB.NET, MC++, etc. emittieren) werden nicht interpretiert (besonders wenn Sie NGEN verwenden) - und hat volle Garbage Collection.

Ebenso Java.

+0

Java ist mein Freund interpretiert. Auch wenn es mit HotSpot ist. – Geek

+0

Nein - es ist vielleicht nicht "nativ", aber das macht es nicht "interpretiert" - zumindest nicht unter der normalen Definition. –

+0

Ich dontget Ihre Antwort "zumindest nicht unter der normalen Definition"? Es wird interpretiert. ?? – Geek

0

Objective-C 2 verfügt jetzt über eine Speicherbereinigung, und für C++ sind auch Speicherbereinigungsbibliotheken verfügbar.

Ich denke, es ist möglich, solange es die Sprache erlaubt es Ihnen, Objekte zu überprüfen, so dass Sie den Objektbaum durchlaufen können.

+1

Können Sie bitte erklären, wie es funktioniert. Das ist, als würde man einen GC-Thread mit deinem Programm verbinden, nicht wahr? – Geek

+1

Getrennter Thread hat nichts mit GC zu tun - das ist einfach so, wie Java es tut.Die meisten C++ (und Objective-C) behandeln es zum Löschzeitpunkt, wenn der Ref-Zähler auf Null geht. –

+1

Objective-C 2 hat echte Müllabfuhr; Die Laufzeit durchläuft den Objektbaum. Refcounts werden ignoriert, wenn die Garbage Collection aktiviert ist. Ich glaube, es ist Teil der Event-Schleife, aber ich bin mir nicht sicher. –

2

Das neue C++ 0x enthält Funktionen, die die Implementierung der Garbage Collection erleichtern. Siehe zum Beispiel interview.

3

Haskell hat Garbage Collection, ob es sich um native Code kompiliert oder interpretiert.