L'importante nozione è quella delle chiusure e (in matematica) di variabili libere e vincolate . Ulteriori informazioni su λ-calcolo (e Schema ).
In un certo senso, le variabili globali o statiche (e anche le costanti letterali e le funzioni direttamente chiamate) in un programma C sono gli unici valori chiusi in una funzione C. Vedi anche questa risposta.
In Java, i dati all'interno degli oggetti possono essere pensati come valori chiusi. Si noti che static
data appartiene alla classe (che è un oggetto stesso), quindi Java non ha realmente dati globali (ma maggiori informazioni su Java classloaders , incluso quello primordiale della JVM ).
BTW, sia le chiusure (o le astrazioni lambda) che gli oggetti stanno mescolando i dati con il codice.
In pratica, i dati del cliente trasmessi a richiamate possono essere pensati come valori chiusi. In altre parole, una routine di callback con i dati del client è una chiusura.
Quindi potresti considerare i valori chiusi all'interno delle chiusure come in qualche modo "globali" - al codice dei valori di chiusura.
Al contrario, non è necessario alcun segmento "dati" globali o variabili globali una volta che le chiusure sono prima classe e hai funzioni anonime (ovvero l'astrazione lambda).
Leggi assolutamente SICP , Lisp In Small Pieces , Pragmatica del linguaggio di programmazione . In seguito potresti leggere anche il Libro del drago e il manuale GC .
(Consiglio vivamente di prendere alcune settimane per leggere tutti questi primi tre libri prima di codificare la VM)
Quindi chiudi chiusure di prima classe nella tua VM. Guarda anche Lua e amp; Neko & Guile & Parrot & Ocaml VM (almeno per ispirazione) e SECD macchina.
Una volta che hai delle chiusure di prima classe, vuoi veramente avere un garbage collector .