errors
Failed to load YAML frontmatter: Tried to load unspecified class: Time

Variabili

L’ambiente (in uno specifico blocco) può essere suddiviso in: – ambiente locale: associazioni create all’ingresso nel blocco - variabili locali - parametri formali – ambiente non locale : associazioni ereditate da altri blocchi – ambiente globale: quella parte di ambiente non locale relativo alle associazioni comuni a tutti i blocchi - dichiarazioni esplicite di variabili globali - dichiarazioni del blocco più esterno - associazioni esportate da moduli ecc.

Operazioni sugli oggetti denotabili

• Creazione • Accesso • Modifica (se l’oggetto è modificabile) • Distruzione

Creazione e distruzione di un oggetto non coincidono con creazione e distruzione dei legami per esso Alcuni eventi fondamentali

  1. Creazione di un oggetto
  2. Creazione di un legame per l’oggetto
  3. Riferimento all’oggetto, tramite il legame
  4. Disattivazione di un legame
  5. Riattivazione di un legame
  6. Distruzione di un legame
  7. Distruzione di un oggetto Il tempo tra 1 e 7 è la vita (o il tempo di vita: lifetime) dell’oggetto Il tempo tra 2 e 6 è la vita dell’associazione

Nota: La vita di un oggetto non coincide con la vita dei legami per quell’oggetto • Vita dell’oggetto più lunga di quella del legame:(variabile passata ad una proc per riferimento)

procedure P (var X:integer); begin… end;
…
var A:integer;
…
P(A);
  • area di mem allocata dinamicamente
int *X, *Y;
…
X = (int *) malloc (sizeof (int));
Y=X;
…
free (X);
X=null;

Scope

Una dichiarazione locale ad un blocco è visibile in quel blocco e in tutti i blocchi in esso annidati, a meno che non intervenga in tali blocchi una nuova dichiarazione dello stesso nome (che nasconde, o maschera, la precedente)

  • in presenza di procedure (cioè di blocchi che sono eseguiti in posizioni diverse dalla loro definizione) – in presenza ambiente non locale (e non globale)
{int x=10;
void foo () {
    x++;
    }
void fie (){
    int x = 0;
    foo();
    }
fie();
}

quale x incrementa foo?

un riferimento non-locale in un blocco B puo essere risolto:

  • nel blocco che include sintatticamente B (scope statico)
  • nel blocco che e eseguito immediatamente prima di B (scope dinamico)

scopeStatico

Scope dinamico

Un nome non locale e' risolto nel blocco attivato piu' di recente e non ancora disattivato. 20260219_2026-02-19_14-06-31

Scope statico: indipendenza dalla posizione 20260219_2026-02-19_14-07-26 Il corpo di foo e' parte dello scope della x piu esterna la chiamata di foo e' compresa nello scope della x piu interna foo puo essere chiamata in molti contesti diversi l'unico modo in cui foo puo essere compilata in modo univoco e' che il riferimento a x sia sempre quello piu esterno.

La chiamata di foo interna a file e quella nel main accedono alla stessa variabile: la x esterna.

Scope statico: indipendenza dai nomi locali

20260219_2026-02-19_14-11-29

la modifica del locale x in y dentro fie:

  • modifica la semantica del programma in scope dinamico
  • non ha alcun effetto in scope statico

Scope dinamico: specializzare una funzione

visualizza e' una procedura che rende a colore sol video una certa forma 20260219_2026-02-19_14-13-32

Scope statico vs dinamico

Scope statico:

  • informazione completa dal testo del programma
  • le associazioni sono note a tempo di compilazione
  • dunque: principi di indipendenza
  • concettualmente piu complesso da implementare ma piu efficiente (algol, pascal, C, java)

Scope dinamico:

  • informazione derivata dall'esecuzione – spesso causa di programmi meno ``leggibili’’ – concettualmente più semplice da implementare, ma meno efficiente – Lisp (alcune versioni), Perl

Differiscono solo in presenza congiunta di – ambiente non locale e non globale – procedure

Algol, Pascal, Ada, Java permettono di annidare blocchi di sottoprogrammi non possibile in C

Questo non vuol dire che la regola di scoping (statico o dinamico) sia indifferente in C !

Determinare l'ambiente

L'ambiente e' dunque determinato da:

  • regola di scope (dinamico o statico)
  • regole specifiche (es. dichiarare la variabile prima di assegnarla)

Gestione della memoria

Statica a pila, con heap. Implementazione delle regole di scope.

Tipi di allocazione della memoria vita di un oggetto corrisponde (in genere) con tre meccanismi di allocazione di memoria:

  • statica: memoria allocata a tempo di compilazione (es. variabili globali)
  • dinamica: memoria allocata a tempo di esecuzione (pila, heap)

Allocazione statica

Un oggetto ha un indirizzo assoluto che è mantenuto per tutta l’esecuzione del programma Solitamente sono allocati staticamente: – variabili globali – variabili locali sottoprogrammi (senza ricorsione) – costanti determinabili a tempo di compilazione – tabelle usate dal supporto a run-time

Spesso usate zone protette di memoria

Nota:E invece se devo assegnare staticamente mem a una funz quanta mem assegno?

un programma con 3 funz da 1k di mem

quanta mem alloco? 3k? 1k? Devo vedere quante chiamate alle funz ho (1 chiamata = 1k mem occupata) Se c'e ricorsione e' un casino -> non posso determinare prima quanta mem allocare quindi per permettere la ricorsione devo usare allocazione dinamica della mem. Es. FORTRAN: non ammette la ricorsione 20260219_2026-02-19_14-43-50

20260219_2026-02-19_14-40-34