Lo scopo di una variabile descrive dove nel testo di un programma la variabile può essere usata, mentre l’estensione (o durata) descrive quando nell’esecuzione di un programma una variabile ha un valore (significativo). L’ambito di una variabile è in realtà una proprietà del nome della variabile, e l’estensione è una proprietà della variabile stessa. Questi non dovrebbero essere confusi con il contesto (chiamato anche ambiente), che è una proprietà del programma, e varia a seconda del punto del codice sorgente o dell’esecuzione – vedi ambito: una panoramica. Inoltre, la durata dell’oggetto può coincidere con la durata della variabile, ma in molti casi non è legata alla durata della variabile.
Lo scopo di un nome di variabile influenza la sua estensione.
Lo scopo è una parte importante della risoluzione del nome di una variabile. La maggior parte dei linguaggi definisce un ambito specifico per ogni variabile (così come qualsiasi altra entità nominata), che può differire all’interno di un dato programma. L’ambito di una variabile è la porzione di codice del programma per cui il nome della variabile ha un significato e per cui la variabile è detta “visibile”. L’ingresso in questo ambito inizia tipicamente la vita di una variabile (quando entra nel contesto) e l’uscita da questo ambito tipicamente termina la sua vita (quando esce dal contesto). Per esempio, una variabile con “ambito lessicale” è significativa solo all’interno di una certa funzione/subroutine, o più finemente all’interno di un blocco di espressioni/istruzioni (di conseguenza con ambito di funzione o di blocco); questa è una risoluzione statica, eseguibile al parse-time o al compile-time. In alternativa, una variabile con scope dinamico viene risolta a run-time, sulla base di uno stack di binding globale che dipende dal flusso di controllo specifico. Le variabili accessibili solo all’interno di una certa funzione sono chiamate “variabili locali”. Una “variabile globale”, o una con portata indefinita, può essere riferita a qualsiasi punto del programma.
L’estensione, invece, è un aspetto runtime (dinamico) di una variabile. Ogni binding di una variabile a un valore può avere la propria estensione in fase di esecuzione. L’estensione del binding è la porzione di tempo di esecuzione del programma durante la quale la variabile continua a riferirsi allo stesso valore o posizione di memoria. Un programma in esecuzione può entrare ed uscire da una data estensione molte volte, come nel caso di una chiusura.
A meno che il linguaggio di programmazione non sia dotato di garbage collection, una variabile la cui estensione supera permanentemente il suo scopo può provocare una perdita di memoria, per cui la memoria allocata per la variabile non può mai essere liberata poiché la variabile che sarebbe stata usata come riferimento per la disallocazione non è più accessibile. Tuttavia, può essere ammissibile che il binding di una variabile si estenda oltre il suo ambito, come accade nelle chiusure Lisp e nelle variabili locali statiche C; quando l’esecuzione passa di nuovo nell’ambito della variabile, la variabile può essere nuovamente utilizzata. Una variabile il cui ambito inizia prima della sua estensione è detta non inizializzata e spesso ha un valore indefinito e arbitrario se vi si accede (vedi puntatore selvaggio), poiché non le è ancora stato dato esplicitamente un valore particolare. Una variabile la cui estensione termina prima del suo ambito può diventare un dangling pointer ed essere considerata ancora una volta non inizializzata poiché il suo valore è stato distrutto. Le variabili descritte dai due casi precedenti possono essere dette fuori estensione o non vincolate. In molti linguaggi, è un errore cercare di usare il valore di una variabile quando è fuori portata. In altri linguaggi, farlo può dare risultati imprevedibili. Una tale variabile può, tuttavia, essere assegnata ad un nuovo valore, che le dà una nuova estensione.
Per l’efficienza dello spazio, uno spazio di memoria necessario per una variabile può essere allocato solo quando la variabile viene utilizzata per la prima volta e liberato quando non è più necessario. Una variabile è necessaria solo quando è nello scope, quindi iniziare la vita di ogni variabile quando entra nello scope può dare spazio a variabili inutilizzate. Per evitare di sprecare tale spazio, i compilatori spesso avvertono i programmatori se una variabile è dichiarata ma non utilizzata.
È considerata una buona pratica di programmazione rendere lo scopo delle variabili il più stretto possibile in modo che parti diverse di un programma non interagiscano accidentalmente l’una con l’altra modificando le variabili dell’altra. Facendo così si previene anche l’azione a distanza. Tecniche comuni per fare ciò sono di avere diverse sezioni di un programma che usano diversi spazi dei nomi, o di rendere le singole variabili “private” attraverso lo scoping dinamico delle variabili o lo scoping lessicale delle variabili.
Molti linguaggi di programmazione impiegano un valore riservato (spesso chiamato null o nil) per indicare una variabile non valida o non inizializzata.
Si tratta di un valore riservato.