| errors | |
|---|---|
|
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
- Creazione di un oggetto
- Creazione di un legame per l’oggetto
- Riferimento all’oggetto, tramite il legame
- Disattivazione di un legame
- Riattivazione di un legame
- Distruzione di un legame
- 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)

Scope dinamico
Un nome non locale e' risolto nel blocco attivato piu' di recente e non ancora disattivato.

Scope statico: indipendenza dalla posizione
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

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

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

