AN FI 98-99 Funzioni Run Time Le funzioni a tempo di esecuzione Record di attivazione

Preview:

Citation preview

AN FI 98-99 Funzioni Run Time

Le funzioni a tempo di esecuzione

Record di attivazione

AN FI 98-99 Funzioni Run Time

Invocazione di una funzione P(<args>)

creazione di una nuova attivazione (istanza) del servitore P

allocazione di memoria per gli argomenti e le variabili locali

trasferimento degli argomenti trasferimento del controllo esecuzione del codice della

funzione

AN FI 98-99 Funzioni Run Time

Il modello di valutazione applicativo

valutazione del nome della funzione (determinazione del codice da applicare);

determinazione degli argomenti da sostituire ai parametri formali;– avviene valutando le espressioni

specificate al momento della invocazione applicazione del codice agli

argomenti.

AN FI 98-99 Funzioni Run Time

Esempio

public double try(double a, double b){return ( a==0 ) ? 1 : b;

}

Cliente:

double x =1.0; double y = 2.0; try( x,y )

AN FI 98-99 Funzioni Run Time

Valutazione

Lega a al valore 1

Lega b al valore 2

return (a == 0) ? 1 : b; //con a=1, b=2

________________________Risultato: 2

AN FI 98-99 Funzioni Run Time

Valutazione: un nuovo caso

double x = 0.0;try( x,1/x )

Il corpo della funzione non viene eseguito in quanto la valutazione di 1/x porta ad overflow.

_______________________Risultato: Run-Time Error

AN FI 98-99 Funzioni Run Time

Meccanismi di trasferimento degli argomenti

Data la chiamata f(X), X viene trasferito a f per valore o copia (by value): si

trasferisce il valore di X

Oppure (in altri linguaggi) per indirizzo (by reference): si trasferisce

l’indirizzo di X– per valore-risultato (by value-result): si

copia il valore di X alla chiamata e alla terminazione della funzione

AN FI 98-99 Funzioni Run Time

L’environment

La definizione di una funzione introduce un nuovo binding nell’environment di definizione della funzione (in C il global environment).

Al momento dell’invocazione, si crea un nuovo environment – composto da un frame che contiene i

binding dei parametri e degli identificatori dichiarati localmente alla funzione

AN FI 98-99 Funzioni Run Time

Organizzazione della memoria

Area codice e Area dati.

L’area dati e' a sua volta differenziata in tre parti: – un' area dati globali, – uno stack – uno heap.

AN FI 98-99 Funzioni Run Time

Heap

Lo heap e’ l’area di memoria destinata alle variabili dinamiche.

AN FI 98-99 Funzioni Run Time

Stack

Lo stack (pila) contiene la rappresentazione a frame dell'environment corrente di esecuzione.

Il frame relativo all’attivazione di una funzione e’ rappresentati da una struttura di dati detta record di attivazione.

AN FI 98-99 Funzioni Run Time

Record di attivazione

Viene creato al momento della invocazione di una funzione e distrutto (deallocato) al temine della esecuzione della funzione stessa. – Poiche' le funzioni terminano in modo

LIFO la zona di memoria riservata ai RA puo' essere gestita in modo efficiente attraverso una struttura a pila

AN FI 98-99 Funzioni Run Time

Record di attivazione

SL RTA DL

area PARAMETRI

area VAR LOCALI

area di lavoro

STACK area

all' areacodice

SL

RTA

DL

area PARAMETRI

area VAR LOCALI

area di lavoro

STACK area

all' areacodice

Rappresentazione compatta

AN FI 98-99 Funzioni Run Time

Esempio: fattoriale

Impostazione sintatticamente ricorsiva cheda’ luogo a un processo computazionale ricorsivo

int fact( int n ){return(n==0) ? 1 : n*fact(n-1);}

Cliente: fact( 3 )

AN FI 98-99 Funzioni Run Time

Record di attivazione

fact(3)n3 n*fact(n-1);

2fact(2) n*fact(n-1);

1fact(1) n*fact(n-1);

n

n

0fact(0) -> 1n

RADL

AN FI 98-99 Funzioni Run Time

fact(3)

SL RTA DL

all' istruzione che moltiplicail risultato di fact(n-1) per n

SL RTA DL

2

STACK area

SL RTA DL

SL RTA DL

RA difact(3)

fact(2)

RA difact(1)

RA difact(0)

3

1

0

n

n

n

n

area datiglobale

RTA ->

RA di

fact(3) 3 * fact(2)fact(2) 2 * fact(1)fact(1) 1 * fact(0)fact(0) =1

AN FI 98-99 Funzioni Run Time

Fact1

int fact1( int n, int v, int k ){return

(n==k)?V:fact1(n,v*(k+1),k+1);

}

n

vk

RADL

vk

AN FI 98-99 Funzioni Run Time

fact1(3,1,0)fact(3,1,0) fact(3,1*1,1)fact(3,1,1) fact(3,1*2,2)fact(3,2,2) fact(3,2*3,3)fact(3,6,3) =6

SL | RTA | DL310

SL | RTA | DL311

SL | RTA | DL322

SL | RTA | DL363

AN FI 98-99 Funzioni Run Time

Definizioni

AN FI 98-99 Funzioni Run Time

Ambiente lessicale e dinamico

L'ambiente lessicale e' l'ambiente in cui compare la definizione della funzione.

L'ambiente dinamico e' l'ambiente presente al momento di una particolare attivazione della funzione.

AN FI 98-99 Funzioni Run Time

Chiusura lessicale

L’oggetto computazionale che correla una espressione con l’environment da usare nella sua valutazione prende il nome di chiusura

e in particolare di chiusura lessicale nel caso in cui l’ambiente sia quello di definizione della espressione

AN FI 98-99 Funzioni Run Time

Tempo di vita delle variabili

e' il periodo di tempo per cui un'area di memoria e' allocata ad una variabile. – In caso di allocazione statica, il tempo di

vita e' di norma quello del programma.– In caso di allocazione dinamica, il tempo

di vita della variabile puo' dipendere dal tempo di vita dell'unita' di programma (blocco) in cui e' avvenuta la allocazione.

AN FI 98-99 Funzioni Run Time

Categorie di variabili variabili statiche:

create prima della esecuzione che vivono per tutto il tempo di vita del programma;

variabili semistatiche: e' nota staticamente l'occupazione complessiva di memoria.

Verranno create dinamicamente;

variabili semidinamiche: create all'atto della attivazione del blocco in cui sono dichiarate

e la cui occupazione di memoria e' nota solo al momento della creazione;

variabili dinamiche: l’ occupazione complessiva di memoria cambia durante la

esecuzione del programma.

AN FI 98-99 Funzioni Run Time

Modello di valutazione normale

la determinazione degli argomenti avviene con sostituzioni testuali dei valori attuali ai parametri

AN FI 98-99 Funzioni Run Time

Valutazioneint x = 0;

try( x,1/x )

lega a alla chiusura x/envCaller

lega b alla chiusura y/envCalleressendo envCaller l’ambiente al momento della chiamata

return (eval(x,envCaller) == 0) ? 1 : eval(y, envCaller)

________________________Risultato: 1

Recommended