2009-05-06 11 views
5

È possibile che una lingua non interpretata abbia un Garbage Collector. Le lingue interpretate prevedono che l'Interpretatore esegua il Programma riga per riga, in modo che l'Interpretatore possa anche fornire un runtime con un GC. Ma è possibile avere un Garbage Collector per qualsiasi altra lingua senza costruire il GC nel proprio codice?Una lingua non interpretata può avere un Garbage Collector?

+5

Mi chiedo se stai assumendo una falsa dicotomia tra "interpretato" e "nativo". Java e C#, ad esempio, non sono né "interpretati" né "nativi" - vengono eseguiti (essenzialmente) in una VM, ma da un IL. –

+0

Potete per favore Spiegare di più:? – Geek

+0

Per quella conversazione, vedere i commenti sulla mia risposta. –

risposta

0

Sì.

Il C++ con un'implementazione del puntatore intelligente sarà inutile quando i conteggi dei riferimenti del puntatore intelligente si azzerano.

Si dispone di garbage collection. Non l'hai costruito da solo.

+1

Penso che la domanda riguardi il tracciamento della garbage collection e che il refcount non sia un sostituto. –

+1

Questo non è Garbage Collection. Collega diversi oggetti in modo tale che abbiano un ciclo e non vengano mai distrutti a meno che non si interrompa il ciclo manualmente. – sharptooth

+0

@sharptooth: portalo su con il resto del mondo, non con me: http://www.codeproject.com/KB/cpp/automatic_gc_using_sp.aspx –

11

La raccolta di dati inutili richiede che le variabili del puntatore siano contrassegnate in modo speciale in modo che il runtime possa identificarle e utilizzarle per la garbage collection. Non ha nulla a che fare con l'interpretazione/la compilazione, ma richiede invece un runtime speciale e la memorizzazione di dati aggiuntivi con ciascuna variabile.

+0

Ben lingue interpretate ti danno un tempo di esecuzione. In ogni caso è più facile per l'Interpretatore lavorare come Run-Time ed eseguire anche un garbage collector. Qualunque lingua nativa avrà il sistema operativo come runtime? E quindi nessun GC? – Geek

+1

GC e interpretazione non sono correlati tra loro. Sì, è potenzialmente più semplice per una lingua interpretata avere la garbage collection, ma le lingue non interpretate possono farlo anche tu. I sistemi operativi in ​​genere non hanno il supporto incorporato per la raccolta dei dati inutili, ma hanno molti runtime linguistici. – sharptooth

+2

E anche senza contrassegnare le variabili del puntatore in modo particolare, è possibile avere il cosiddetto GC conservativo che considera tutti i contenuti della memoria come potenziali puntatori. Vedi il GC di Boehm nell'altra risposta. –

6

Bene, i linguaggi .NET (che emettono in IL-C#, VB.NET, MC++, ecc.) Non vengono interpretati (specialmente se si utilizza NGEN) - e dispone della garbage collection completa.

Allo stesso modo, Java.

+0

Java è interpretato come mio amico. Anche se è con HotSpot. – Geek

+0

No - potrebbe non essere "nativo", ma questo non lo rende "interpretato" - almeno, non sotto la normale definizione. –

+0

Non apprezzo la tua risposta "almeno, non sotto la normale definizione"? È interpretato. ?? – Geek

0

Objective-C 2 ora dispone della garbage collection e ci sono anche librerie di raccolta dei rifiuti per C++.

Penso che sia possibile fintanto che esiste la lingua che consente di ispezionare gli oggetti in modo da poter attraversare l'albero degli oggetti.

+1

Puoi spiegare come funziona. È come collegare un thread GC insieme al tuo programma, vero? – Geek

+1

Il thread separato non è correlato a GC, che sembra essere il modo in cui lo fa Java.La maggior parte di C++ (e Objective-C) la gestiscono al momento dell'eliminazione quando il conteggio dei ref va a zero. –

+1

Objective-C 2 ha una vera garbage collection; il runtime attraversa l'albero degli oggetti. I conti vengono ignorati quando la garbage collection è abilitata. Credo che faccia parte del ciclo degli eventi, ma non ne sono sicuro. –

2

Il nuovo C++ 0x include funzionalità che semplificano l'implementazione della garbage collection. Vedi questo interview per esempio.

3

Haskell ha garbage collection, che si tratti di compilato in codice nativo o interpretato.