Ambiente (programmazione)Un ambiente, in informatica e nell'ambito della programmazione, è definito come l'insieme di tutte le associazioni tra identificatori e posizioni di memoria. Più formalmente, l'ambiente è una funzione che associa il dominio semantico degli identificatori ( Env = Id DVal
Si noti che, poiché le posizioni di memoria contengono dei valori, esiste un'ulteriore funzione, detta store, che lega il dominio delle posizioni di memoria ( Store = Loc SVal
L'associazione tra identificatore e valore associato, come ad esempio in una variabile, necessita dell'applicazione in sequenza delle due funzioni:
dove
i: identificatore
ρ: ambiente
l: posizione
σ: store
v: valore
In definitiva, si può dire che gli identificatori fanno riferimento, tramite l'ambiente, a una posizione e a questa viene associato un valore, che può variare dinamicamente, attraverso lo store. Struttura dell'ambienteLa definizione formale di ambiente introduce due situazioni particolari a cui gli identificatori possono sottostare:
Generalmente, le dichiarazioni possono modificare ambiente e store, mentre i comandi modificano solo lo store. Una dichiarazione infatti introduce un nuovo legame tra un identificatore ed una posizione, ed eventualmente modifica lo store associando un valore alla posizione; un comando può modificare il contenuto delle posizioni, ma non l'associazione tra identificatore e posizione (tranne in pochi linguaggi che ne consentono la manipolazione diretta). Per semplicità è possibile immaginare l'ambiente come l'insieme di tutti i nomi visibili in un certo momento durante l'esecuzione di un programma; informalmente, quindi, possono far parte dell'ambiente le variabili, le procedure, le costanti, le classi. L'elemento significativo per la gestione dell'ambiente è il sottoprogramma, o blocco, che ne rappresenta quindi l'unità basilare di gestione. L'ambiente visibile (attivo) all'interno di un sottoprogramma è strutturato nel modo seguente:
Per semplicità, facciamo riferimento ai soli linguaggi imperativi, ricordando che per i linguaggi funzionali possono essere fatte considerazioni analoghe. Possiamo immaginare una struttura a blocchi come segue: begin // inizio programma <dichiarazioni> <comandi> begin // inizio blocco 1 <dichiarazioni> <comandi> end // fine blocco 1 <comandi> begin // inizio blocco 2 <dichiarazioni> <comandi> begin // inizio sottoblocco 2.1 <dichiarazioni> <comandi> end // fine sottoblocco 2.1 end // fine blocco 2 end // fine programma Ogni sottoblocco può quindi avere delle proprie dichiarazioni (di variabili, funzioni, classi, ecc) nonché dei comandi che sono ovviamente dipendenti dal linguaggio impiegato. Si noti che non tutti i linguaggi di programmazione supportano questi tre tipi di ambiente (ad esempio il Prolog non possiede un ambiente non locale). Ambiente globaleInsieme di associazioni che vengono create nella parte più esterna del programma, e che normalmente sono visibili all'interno di ogni sottoprogramma o sottoblocco. In alcuni linguaggi possono essere visibili automaticamente, all'interno dei sottoblocchi, solo le associazioni tra identificatori e nomi di procedura o funzione, ma non tra identificatori e posizioni, a meno che ciò non venga esplicitamente richiesto (come accade, ad esempio, nelle funzioni in PHP). Ambiente localeInsieme di associazioni che vengono create (o attivate) quando si entra in un sottoprogramma. Ad esempio, in Perl: my $x=3; # dichiarazioni per l'ambiente globale my $y=$x; { # inizio sottoblocco my $z="foo"; # dichiarazioni per l'ambiente locale my $x=777; $y="$y$z$x"; } print "y vale $y, x vale $x\n"; print (defined($z) ? "z vale $z\n" : "z non esiste\n"); OUTPUT> y vale 3foo777, x vale 3 OUTPUT> z non esiste Nell'esempio, si noti che la seconda definizione di Ambiente non localeInsieme di associazioni che devono essere ricavate da altri sottoprogrammi seguendo le regole di scoping messe a disposizione dal linguaggio. Si supponga che un sottoprogramma P contenga un riferimento al nome x che non è locale per P e non è globale. Tale riferimento dovrà essere quindi risolto nell'ambiente di qualche altro sottoprogramma. Vi saranno quindi due diverse possibilità:
Per maggior chiarezza si veda l'esempio seguente, scritto in uno pseudolinguaggio: 01: Procedure B 02: var x:... // definita in B 03: Procedure P 04: <utilizzo x> 05: endProc P 06: beginBlock A 07: Procedure Q 08: var x:... // definita in Q, dentro il blocco A 09: Call P 10: endProc Q 11: Call Q 12: endBlock A 13: endProc B
L'ambiente nei linguaggi interpretatiIl concetto formale di ambiente spesso viene semplificato, nelle sue caratteristiche, quando si fa uso di un linguaggio interpretato. Ricadono in questa categoria, ad esempio, JavaScript, PHP, Perl, ma anche i più noti interpreti di comandi di un qualsiasi sistema operativo. Normalmente non è obbligatorio dichiarare anticipatamente, ad esempio, le variabili che verranno usate nel corpo del programma, in quanto l'interprete si fa carico di allocare la memoria e di creare le opportune associazioni nell'ambiente ogni qual volta una nuova variabile viene utilizzata.
Voci correlate |