È necessaria la garbage collection in un linguaggio basato su stack?


16

Qual è la necessità di Garbage Collection (GC) in un linguaggio basato su stack? In una lingua come Forth o RPL (sui calcolatori HP ), è necessaria la raccolta dei rifiuti?

Penso che, dal momento che l'output è saltato fuori dallo stack, non ci sarebbe bisogno. Mi sto perdendo qualcosa?

Risposte:


14

Il GC viene normalmente applicato alla memoria allocata sull'heap. Non ho familiarità con Forth o RPL, ma se non c'è heap e tutto è archiviato in uno stack globale, non c'è nulla da fare per GC.


2
Il tipico modello di utilizzo della memoria dei programmi Forth che ho letto all'inizio era che erano come programmi di assemblaggio, in quanto utilizzavano indirizzi di dati globali statici predisposti. Questo funziona perché Forth ha la capacità di trasferire dati tra lo stack e indirizzi specifici. Inoltre ha la capacità di calcolare gli indirizzi. Pertanto sarebbe possibile creare una libreria di allocatori basata su un concetto di heap e la libreria di allocatori avrebbe bisogno di un modo per gestire le dimensioni finite dell'heap. Se un utente Forth seguisse questo percorso potrebbe concepibilmente desiderare e implementare GC.
cardiff space man

13

Sì hai ragione. Ma la base dello stack è solo una parte dell'intera storia. Ad esempio, anche l'interprete bytecode Java è basato su stack (il codice compilato funziona - per motivi di efficienza - in modo diverso). Questo ci dice che qualsiasi lingua può essere trasformata in una lingua stack.

Ciò che conta sono gli oggetti all'esterno dello stack, quelli che possono sopravvivere all'esecuzione del metodo corrente. Finché la lingua non ha nulla di simile malloco new, non ci sono tali oggetti e non è necessario deletené GC.

Un linguaggio privo di allocazione dinamica della memoria è piuttosto limitato nella sua utilità.


non sono sicuro di essere d'accordo con l'ultima riga, java bytecode non è utile?
jk.

@jk., bytecode java ha allocazione dinamica della memoria.
Peter Taylor,

1
In realtà, ci sono diversi linguaggi per scopi generali che sono basati su stack. Dai
Yam Marcovic,

1
In realtà il fattore è la raccolta dei rifiuti
Andrea,

1

La garbage collection è necessaria se la lingua supporterà intrinsecamente le strutture di dati dinamici. Il che è quasi una necessità se vuoi fare qualcosa oltre il livello di C. Senza di esso sei bloccato solo con strutture dati di dimensioni fisse e gestisci la memoria da solo. Questo è ciò che fa ovviamente Forth originale, ma probabilmente non è qualcosa che vorresti fare oggi a meno che tu non stia facendo solo codifica di sistemi di basso livello.


1

La garbage collection non è necessaria se la lingua utilizza allocazione statica anziché allocazione di stack. Ad esempio Fortran 77 con l' opzione -s (memoria statica) alloca tutta la memoria all'avvio del programma, pertanto non viene liberata alcuna allocazione di memoria in fase di esecuzione. Mentre ci vuole un po 'di disciplina, è possibile scrivere programmi, in particolare simulazioni per utilizzare l'allocazione di memoria statica. L'allocazione statica rimuove eventuali perdite di memoria e porta a prestazioni della cache eccezionali poiché il compilatore può utilizzare l'analisi statica per determinare cosa caricare nella cache.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.