Per il mio progetto di classe, devo implementare un (semplice) compilatore Scheme.non utilizzare Garbage Collector nell'implementazione Scheme/Lisp
A questo punto sto analizzando come implementare varie funzionalità.
Perché le tipiche implementazioni dello schema si preoccupano di un complicato GC? Se il codice è veramente funzionale (senza effetti collaterali), la funzione non attualmente in esecuzione non può essere conservata nella memoria allocata. Mai! (a meno che non si tratti di una perdita!)
Pertanto, perché non utilizzare solo la strategia seguono le lingue più imperative, come C
, ad esempio le allocazioni dello stack. Ogni volta che viene immesso un nuovo contesto lessicale (ad esempio (define (foo ..)
o (letrec ...
), allocare lo storage variabile sullo stack e quindi regolare semplicemente il puntatore dello stack una volta che il contesto è stato chiuso.
Poiché lo schema non ha malloc()
e consente l'allocazione solo di tipi predefiniti, un'implementazione semplice potrebbe utilizzare un pool o un allocatore di zona, quindi lo "stack" non dovrebbe mai frammentare.
Non devo implementare le chiusure, ma penso che anche quelle possano essere eseguite nello stesso modo copiando i valori associati in uno stack separato utilizzato esclusivamente per tenere traccia degli stati di chiusura.
Pensieri?
Ma il codice non è veramente funzionale, le operazioni che mutano lo stato come 'set!', 'Set-car!' E 'set-cdr!' Fanno parte di un'implementazione standard dello schema. Se il tuo (semplice) compilatore Scheme non consente queste operazioni e non devi implementare le chiusure, allora potrebbe essere possibile una semplice strategia GC –
Pensa ad un semplice esempio: una funzione restituisce una lista, che viene passata in un'altra funzione che crea una nuova lista di ogni secondo elemento della lista originale. Come verrà dedotta l'analisi della tua regione, quale parte degli elementi dell'elenco originale non è più richiesta al termine della seconda funzione? Non c'è assolutamente alcun modo di dedurre le regioni anche per il calcolo lambda più elementare. –
I problemi relativi all'implementazione di un compilatore di schemi "semplice" (la tua parola, non mia) sono molto, molto lontani dai problemi di implementazione del garbage collector di un runtime di Scheme. Concentrarsi innanzitutto sul compilatore "semplice". – GoZoner