Ambiente (informatica)

In informatica, l'ambiente viene visto come l'insieme di tutte le associazioni tra identificatori e locazioni di memoria. Più formalmente, l'ambiente è una funzione che associa il dominio semantico degli identificatori (Id) a quello dei valori denotabili da identificatori (valori nominabili, NVal), quali ad esempio le locazioni di memoria, le procedure, le funzioni:

  Env = Id \rightarrow NVal
 

Si noti che, poiché le locazioni di memoria contengono dei valori, esiste un'ulteriore funzione, detta store, che lega il dominio delle locazioni di memoria (Loc, sottoinsieme di NVal) in quello dei valori memorizzabili SVal, come ad esempio un intero o un file di input o output:

  Store = Loc \rightarrow SVal
 

Ovviamente l'associazione tra identificatore e valore associato, come ad esempio in una variabile, necessita dell'applicazione in sequenza delle due funzioni:

  \mathbf{i}\rightarrow_\rho\mathbf{l}\rightarrow_\sigma\mathbf{v}
   
   dove
    
   i: identificatore
   ρ: ambiente
   l: locazione
   σ: store
   v: valore
 

In definitiva, si può dire che gli identificatori fanno riferimento, tramite l'ambiente, ad una locazione, ed a questa viene associato un valore, che può variare dinamicamente, attraverso lo store.

Indice

Struttura dell'ambiente

La definizione formale di ambiente introduce due situazioni particolari a cui gli identificatori possono sottostare:

Si noti che, 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 locazione, ed eventualmente modifica lo store associando un valore alla locazione; un comando può modificare il contenuto delle locazioni, ma non l'associazione tra identificatore e locazione (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 globale

Insieme 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 locazioni, a meno che ciò non venga esplicitamente richiesto (come accade, ad esempio, nelle funzioni in PHP).

Ambiente locale

Insieme 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
 

All'entrata nel sottoblocco viene generato un ambiente locale in cui vengono 'ricopiate' tutte le associazioni dell'ambiente globale, quindi vengono generate le associazioni di ambiente secondo quanto indicato nelle dichiarazioni.

Nell'esempio, si noti che la seconda definizione di $x è locale al sottoblocco, e quindi maschera il valore globale. Ogni uso di $x all'interno del sottoblocco pertanto farà riferimento all'ambiente locale. L'uso di $y, invece, è riferito all'ambiente globale, e ben si vede nell'output generato. Si noti che alla chiusura del sottoblocco l'ambiente locale viene distrutto, pertanto le variabili dichiarate internamente non saranno più esistenti all'esterno del blocco.

Ambiente non locale

Insieme 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 interpretati

Il 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.

See also: Ambiente (informatica), Funzione (informatica), Informatica, Interfaccia a linea di comando, Interprete (informatica), Javascript, Linguaggio di programmazione, MS-DOS, PHP, Perl