La tua domanda è interessante in diversi modi, in quanto richiede attente distinzioni per diversi problemi. Ma la tua visione mi sembra sostanzialmente corretta. Non ho letto il tuo riferimento prima di scrivere la maggior parte di questa risposta per evitare di distorcere la mia risposta.
Innanzitutto, la tua affermazione Variables are symbolic names for memory
addresses
è quasi corretta, ma confonde il concetto e la sua normale implementazione. Una variabile è in realtà solo un contenitore che può contenere un valore che può essere modificato. Di solito, questo contenitore è implementato su un computer come un blocco di spazio di memoria, caratterizzato da un indirizzo e una dimensione poiché le variabili possono contenere oggetti che richiedono rappresentazioni con più o meno informazioni.
Ma considererò principalmente un punto di vista più astratto della semantica delle lingue, indipendentemente dalle tecniche di implementazione.
Quindi le variabili sono solo contenitori da un punto di vista astratto. Un tale contenitore non deve avere un nome. Tuttavia, le lingue spesso hanno variabili che sono nominate associando ad esso un identificatore, in modo che gli usi della variabile possano essere espressi dall'identificatore. Una variabile può effettivamente avere diversi identificatori attraverso vari meccanismi di aliasing. Una variabile può anche essere una sottoparte di una variabile più grande: un esempio è una cella di una variabile di matrice, che può essere denominata specificando la variabile di matrice e l'indice della cella, ma potrebbe anche essere associata agli identificatori tramite l'aliasing.
Sto deliberatamente usando la parola contenitore che è in qualche modo neutra, per evitare di invocare altre parole che possono essere caricate semanticamente tecnicamente. In realtà è vicino al concetto di riferimento descritto in Wikipedia , che è spesso confuso con un indirizzo di memoria. Il puntatore di parole stesso è spesso inteso come un indirizzo di memoria, ma non penso che sia significativo quando si considerano la maggior parte delle lingue di alto livello e probabilmente inappropriato nel documento di discussione a cui si fa riferimento (sebbene gli indirizzi possano essere utilizzati), poiché è inappropriato riferendosi ad un'implementazione specifica. Tuttavia, è appropriato per un linguaggio come C, che dovrebbe essere molto più vicino ai concetti di implementazione e all'architettura della macchina.
In realtà, se si osservano variabili o valori a livello di implementazione, potrebbero esserci diversi sistemi complessi di indiretta, di "puntatori a livello di macchina", ma che sono (e dovrebbero essere) invisibili all'utente, in modo che il punto di vista astratto Lo sviluppo può essere valido. Per la maggior parte dei linguaggi di programmazione, l'utente non dovrebbe preoccuparsi, o addirittura conoscere, l'implementazione, poiché l'implementazione può variare molto per un determinato linguaggio. Questo potrebbe non essere vero per alcuni linguaggi, come C, intenzionalmente vicini all'architettura della macchina, come sostituto avanzato di linguaggi di assemblaggio che sono in relazione quasi diretta con la codifica binaria esplicita, ma di livello troppo basso per un uso conveniente nella maggior parte situazioni.
Ciò che l'utente di una lingua dovrebbe sapere, e talvolta dovrebbe essere anche inferiore a quello, sono quali sono i valori e le operazioni associate, dove possono essere contenuti, come possono essere associati ai nomi, come funziona il sistema di denominazione, come può essere nuovo tipi di valori da definire, ecc.
612
L'associazione di un valore immutabile a un identificatore viene generalmente chiamata costante. I Litterali sono costanti in questo senso.
I "contenitori di valori" possono anche essere considerati come valori e la loro associazione con un identificatore è una variabile nel solito senso "ingenuo" che si sta utilizzando. Quindi potresti dire che una variabile è una "costante contenitore".
Ora potresti chiederti quale sia la differenza tra l'associazione di un identificatore a un valore (dichiarazione costante) o l'assegnazione di un valore a una variabile, ovvero la memorizzazione del valore nel contenitore definito come costante del contenitore. In sostanza, la dichiarazione può essere vista come un'operazione che definisce una notazione, che associa un identificatore che è un'entità sintattica a un valore che è un'entità semantica. L'assegnazione è un'operazione puramente semantica che modifica uno stato, ovvero modifica il valore di un contenitore. In un certo senso, la dichiarazione è un meta concetto senza alcun effetto semantico, oltre a fornire un meccanismo di denominazione (cioè sintattico) per le entità semantiche.
In realtà, le assegnazioni sono operazioni semantiche che si verificano in modo dinamico durante l'esecuzione del programma, mentre le dichiarazioni hanno una natura più sintattica e di solito devono essere interpretate nel testo del programma, indipendentemente dall'esecuzione. Questo è il motivo per cui l'ambito statico (ovvero l'ambito testuale) è di solito il modo naturale di comprendere il significato degli identificatori.
Dopotutto, posso dire che un valore di puntatore è solo un altro nome per un contenitore e una variabile di puntatore è una variabile di contenitore, cioè un contenitore (costante) che può contenere un altro contenitore (con possibili limitazioni sul gioco contenitore imposto da alcuni tipo di sistema).
Per quanto riguarda il codice, dichiari [pointers] might indicate the entry point
to a section of code and can be used to call that code
. In realtà questo non è del tutto vero. Una sezione di codice è spesso insignificante da sola (dal punto di vista di alto livello o di implementazione). Da un punto di vista di alto livello, il codice di solito contiene identificatori e devi interpretarli nel contesto statico in cui sono stati dichiarati. Ma in realtà esiste una possibile duplicazione dello stesso contesto statico, dovuta essenzialmente alla ricorsione che è un fenomeno dinamico (runtime) e il codice può essere eseguito solo in un'istanza dinamica appropriata del contesto statico. Questo è un po 'complesso, ma la conseguenza è che il concetto corretto è quello di una chiusura che associa un pezzo di codice e un ambiente in cui gli identificatori devono essere interpretati. La chiusura è il giusto concetto semantico, cioè è un valore semantico correttamente definibile. Quindi puoi avere costanti di chiusura, variabili di chiusura,
Una funzione è una chiusura, di solito con alcuni parametri per definire o inizializzare alcune delle sue entità (costanti e variabili).
Salto molte variazioni sull'uso di questi meccanismi.
Le chiusure possono essere utilizzate per definire strutture OO in linguaggi imperativi o funzionali. In realtà, i primi lavori sullo stile OO (probabilmente prima del nome) sono stati fatti in questo modo.
Il documento a cui fai riferimento, che ho sfogliato rapidamente, sembra essere interessante, scritto da una persona competente, ma probabilmente non è una lettura facile se non hai un'esperienza significativa con una varietà di lingue e i loro modelli computazionali sottostanti.
Ma ricorda: molte cose sono negli occhi di chi guarda, purché conservi una visione coerente. I punti di vista possono differire.
Questo risponde alla tua domanda?
PS: questa è una risposta lunga. Se ritieni che una parte di esso sia inadeguata, ti preghiamo di essere esplicito su quale sia. Grazie.