Le citate definizioni di "entità" e "oggetto" sono ambigue, dobbiamo essere più precisi. Un nome è associato a una posizione di archiviazione che a sua volta contiene un valore . Il valore è i dati. (Trovo un po 'strano dire che il valore potrebbe anche essere "codice", ma forse si riferisce a se il valore è una funzione, che è possibile.)
Scoping è il modo in cui i nomi sono associati alle posizioni di archiviazione. Un nome come x
può riferirsi a diverse posizioni di memorizzazione in diverse parti del programma, ma all'interno di un singolo ambito, lo stesso nome fa sempre riferimento alla stessa posizione di archiviazione.
function f() {
int x = 17; // one storage location
}
function g() {
string x = "Hello"; // a different storage location than the other x
}
Ma il valore di una singola posizione di memoria può cambiare all'interno di un ambito (almeno nelle lingue che supportano l'assegnazione distruttiva, che è la maggior parte delle lingue tradizionali).
function f() {
int x = 17;
x = 42; // the same storage location is assigned a new value
}
Scopo statico significa che gli ambiti possono essere determinati semplicemente osservando la struttura del codice. L'ambito dinamico indica che l'ambito dipende da quali chiamate di funzione, il che significa che l'associazione tra i nomi e la posizione di archiviazione viene determinata in fase di runtime.
La maggior parte delle lingue tradizionali supporta solo l'ambito statico. Credo che Common Lisp supporti sia l'ambito statico che dinamico, nel qual caso ogni nome è definito in modo dinamico o statico.
Il binding dinamico (noto anche come late binding) può significare cose diverse, ma in questo contesto probabilmente si riferisce al fatto se il percorso di archiviazione per un nome si trova in fase di compilazione o in fase di esecuzione.
Le variabili con ambito dinamico devono per definizione anche essere legate in ritardo, dal momento che possono fare riferimento a diverse posizioni di memoria durante l'esecuzione. Ma le variabili con scope statico possono essere o vincolate staticamente (come in C, Java) o in ritardo (come Pyton, JavaScript).
In un linguaggio funzionale puro (come Haskell) le variabili non possono cambiare il loro valore. Ciò è concettualmente più semplice poiché si può pensare a un nome come direttamente associato a un valore in un ambito. Lo stesso vale per le costanti nei linguaggi imperativi: in un linguaggio imperativo legato staticamente, il compilatore può saltare generando posizioni di memoria per le costanti e sostituisce invece tutti i riferimenti al nome della costante con il valore stesso.