Perché nella maggior parte dei linguaggi di programmazione ad alto livello imperativi è obbligatorio dichiarare le variabili prima di utilizzarle, mentre in altri (mi viene in mente il BASIC, oppure il PHP per lo scripting) le variabili non devono essere dichiarate?

Il principale scopo dell’obbligo di dichiarazione delle variabili prima
del loro uso consiste nel permettere al compilatore di effettuare controlli
di correttezza del codice sorgente più approfonditi. Ad esempio
il compilatore è in grado di rilevare errori derivanti dall’aver scritto
in modo errato il nome di una stessa variabile in punti diversi del
programma.

Supponiamo che un programmatore utilizzi la variabile i1 in un punto
del programma e successivamente utilizzi erroneamente il nome il1
per riferirsi alla stessa variabile. In questo caso, se si utilizza un linguaggio di tipo
imperativo, il compilatore segnalerà
un errore perché uno dei due nomi non risulta dichiarato
fra le variabili.

Altri errori che sono più facilmente evidenziati in fase di compilazione
nei linguaggi imperativi2 sono quelli legati al tipo delle variabili ed all’uso di
variabili di tipo diverso all’interno di espressioni.

Quando si utilizzano variabili a dimensione non prefissata
(vettori, strutture, record, ecc.)
la dichiarazione ha anche il vantaggio di consentire (o facilitare) l’allocazione
della memoria necessaria alla rappresentazione della variabile da parte del compilatore.
Questo si traduce, in generale, in una maggiore efficienza del codice.

Un secondo scopo, che però riveste ormai quasi solo interesse “storico”
perché reso inutile dall’aumentata velocità dei processori,
consiste nella semplificazione della struttura dei compilatori. Linguaggi
con obbligo di dichiarazione delle variabili si prestano meglio a realizzare
compilatori ad un solo passo, e quindi più semplici e veloci.

I linguaggi non imperativi, invece, privilegiano in generale la rapidità di sviluppo del codice
e quindi non richiedono la dichiarazione delle variabili, utilizzano solitamente
tecniche di allocazione della memoria più complesse e non hanno
l’obiettivo di massimizzare l’efficienza di esecuzione dei programmi.


Note:

  1. I due nomi di variabile differiscono perché il secondo carattere è
    la cifra numerica 1 nel primo caso e la lettera l (L minuscola) nel secondo: un tipo
    di errore molto comune e non facilmente individuabile all’interno di un programma.

  2. Questi linguaggi di solito sono anche “fortemente tipizzati”, ovvero
    hanno regole più strette relativamente all’uso di variabili di tipo
    diverso all’interno delle espressioni.