Title: Elementi%20di%20semantica%20operazionale
1Elementi di semantica operazionale
2Sintassi e semantica
- un linguaggio di programmazione, come ogni
sistema formale, possiede - una sintassi
- le formule ben formate del linguaggio (o
programmi sintatticamente corretti) - una semantica
- che assegna un significato alle formule ben
formate - dando uninterpretazione ai simboli
- in termini di entità (matematiche) note
2
3Sintassi e semantica
- la teoria dei linguaggi formali fornisce i
formalismi di specifica (e le tecniche di
analisi) per trattare gli aspetti sintattici - per la semantica esistono diverse teorie
- le più importanti sono la semantica denotazionale
e la semantica operazionale - la semantica formale viene di solito definita su
una rappresentazione dei programmi in sintassi
astratta - invece che sulla reale rappresentazione
sintattica concreta
3
4Semantica operazionale
- lo stile di definizione tradizionale è quello dei
sistemi di transizione - insieme di regole che definiscono
- attraverso un insieme di relazioni di transizione
- come lo stato cambia per effetto dellesecuzione
dei vari costrutti - una tipica regola descrive la semantica di un
costrutto sintattico c eseguito nello stato s,
specificando il nuovo stato s e/o il valore
calcolato v - i domini semantici con cui rappresentiamo lo
stato ed i valori dipendono dal linguaggio di
programmazione
4
5Linguaggio Didattico
- Semplice linguaggio imperativo (frammento di C),
blocchi, puntatori, chiamata di funzione - Rivediamo linterprete presentato a
Programmazione I
6Sintassi concreta
- Programma int main() StmtList
- StmtList Stmt StmtList e
- StmtDecl Com
7Comandi
- ComIdeExp                 Assegnamento     Â
  - if (Exp) Com else Com        Condizionale      Â
  - while (Exp) Com                  Â
Iteratore         - StmtList                             Â
Blocco         - Ide(Exp)               Invocazione di
fun        - return Exp         Calcolo dei risultato di una
fun
8Espressioni
- Exp Ide Identificatore
- Costante Costante
- Exp Op Exp Operazioni Binarie
- Uop Exp Operazioni Unarie
- Ide(Exp) Chiamata di fun
- (Exp) Parentesi
9Espressioni 2
- Ide Lettera (Lettera Cifra Simbolo)
- Costante Numero Carattere
- UnOp !
- Op - ... gt lt ....
- NumeroÉ
10Puntatori
- ! si applica per semplicita ai soli
identificatori. La locazione calcolata, in questo
caso e la locazione in cui e memorizzato il
valore dellidentificatore - che si applica ad una qualunque espressione, la
calcola ottenendo un valore v che viene pero
trasformato in una locazione l. Il valore finale
calcolato e il valore v contenuto nella
locazione l.
11Dichiarazioni
- Decl
- Type Ide Exp variabile
- FunctDec funzione
- FunctDec Type Ide (Formal) StmtList
- Type int
- Formal Type Ide
12Nota
- Per semplicita si considerano funzioni che hanno
un solo parametro formale - Lestensione a piu parametri e banale
- Ricordiamo che il passaggio dei parametri e per
valore
13Semantica Operazionale
- Domini dei valori
- Componenti dello stato
- Regole di Transizione per ogni categoria
sintattica (espressioni, dichiarazioni,
comandi,programmi)
14Domini semantici lo stato
- in un qualunque linguaggio ad alto livello, lo
stato deve comprendere una componente chiamato
ambiente (environment) - per modellare lassociazione tra gli
identificatori ed i valori che questi possono
denotare (dval) - il nostro frammento è imperativo ed ha la nozione
di entità modificabile, cioè le variabili ed i
puntatori (create con le dichiarazioni e
modificate con lassegnamento) - è quindi necessario un secondo componente dello
stato, chiamato memoria (store) - per modellare lassociazione fra locazioni e
valori che possono essere memorizzati (mval)
14
15Lambiente
- Per modellare i blocchi lambiente e una pila di
Frames - La politica FIFO permette di catturare la
dichiarazione piu recente di una variabile
16Valori (memorizzabili)
- Ide identificatori
- ValInt omegaUndef
- Loc le locazioni di memoria, possono essere
rappresentati come numeri naturali. Nel seguito
useremo la notazione 0L , 1L , 2L ...ecc, per
indicare rispettivamente le locazioni di
indirizzo 0, 1, 2 ecc
17Memoria
- store Loc ---gt Val
- (si usa la metavariabile µ)
- Nota Val non contiene le locazioni. Nella
semantica data, si usano meccanismi per
trasformare locazioni in valori e viceversa. La
seconda e possibile ed anzi molto semplice
perche le locazioni sono numeri naturali
18Frame
- frame Ide ---gt Den
- (si usa la metavariabile f)
- Den Loc ? FunDecl ? Unbound. Linsieme delle
denotazioni e lunione dellinsieme Loc degli
indirizzi di memoria e dellinsieme FunDecl delle
definizioni di funzione e della denotazione
speciale Undef, che rappresenta una situazione di
errore.
19Funzioni
- FunDecl e una tripla
- Ide SList Env
- il nome del parametro formale
- il corpo della funzione
- lambiente di definizione (scoping statico)
20Operazioni sui Frames
- EmptyFrame crea il frame ovunque indefinito
- f(x)Unbound per ogni x
-
21Modifica di un frame
- fd/x(y) f(y) se x e diverso da y
- d se xy
- La definizione cosi data risulta corretta
- anche nelleventualita che un legame diverso
- da Unbound per x esista gia
- non e molto corretto solo per programmi
sintatticamente corretti -
22Ambiente
- envStack(Frames)
- (si usa la metavariabile s)
23Operazioni sulla pila
- EmptyStack crea la pila vuota
- top restituisce lelemento in testa alla pila
ovvero lultimo elemento inserito. Non modifica
la pila. - pop restituisce lelemento in testa alla pila.
Modifica la pila, eliminando lelemento in testa.
- push inserisce un elemento in testa alla pila.
24Operazioni sulla memoria
- µ Loc ---gt Val
- ValInt omegaUndef
- Verrebbe da dare operazioni analoghe a quelle del
frame....si tratta di una funzione parziale -
-
25Gestione della memoria
- allocazione di memoria linserzione di nuovi
legami nella memoria corrisponde alla allocazione
di memoria su una machina, e differisce
dallinserzione di un nuovo legame in un generico
frame - Deve esserci un meccanismo per assegnare una
nuova locazione ancora libera - Deve esserci un modo per distinguere una
locazione assegnata con valore indefinito da una
libera -
-
26Operazioni sulla Memoria
- µ(l)omega valore speciale
- µ(l)Undef indefinita
- EmptyStore crea una memoria ovunque indefinita
- µ(x)Undef per ogni x
-
-
-
27Allocazione di Memoria
- free Store---gt Loc Store
- restitituisce una nuova locazione libera e la
memoria modificata di conseguenza - free(µ) (µ,l) dove
- µ(l) µ(l) per ogni l! l
- µ(l)omega se µ(l)Undef
-
-
28Modifica di Memoria
- µv/l(l) µ(l) se l ! l
- Undef se µ(l)Undef
- v altrimenti
- loperazione di modifica non effettua
linserzione del legame per l nel caso non ne
esista alcuno ma in questo ultimo caso, lascia la
memoria invariata (da un punto di vista
matematico va bene....)
29Le funzioni di valutazione semantica
-
- per ogni dominio sintattico esiste una funzione
di valutazione semantica - E EXPR env store ? (eval store)
- C COM env store ? store
- D DEC env store ? (env store)
- P PROG env store ? store
30Implementazione in OCaml
- Vediamo i domini
- La Sintassi Astratta
- Le funzioni di valutazione semantica che
assegnano un significato ai vari costrutti, con
una definizione data sui casi della sintassi
astratta - Per semplicita nellinterprete si usano funzioni
che restituiscono una coppia (ambiente, memoria)
per ogni categoria sintattica
31Programma PicoC
- http//www.di.unipi.it/occhiuto/PicoC/
- Generatore di programmi PicoC in sintassi
astratta - Alcuni esempi di programmi PicoC in sintassi
astratta per testare linterprete
32Valori
- ValInt omegaUndef
- type value
- Val of int
- Omega
- Undef
33Valori Denotabili
- Den Loc ? FunDecl ? Unbound
- type denotation
- Loc of int
- Funct of string com sigma ref
- Unbound
- In FunDecl ce il riferimento allenv (per
trattare la ricorsione ..)
34Frame
- frame Ide ---gt Den
- (si usa la metavariabile f)
- type fi Frame of
- (string denotation) list
- Definizione molto a basso livello, una lista di
coppie (identificatore, valore)
35Ambiente
- envStack(Frames)
- type sigma Stack of fi list
- Definizione molto a basso livello, una lista di
frames
36Memoria
- µ Loc ---gt Val
- type 'a mu Mem of 'a list
- Definizione molto a basso livello, una lista
polimorfa - Si usera per memorizzare coppie (identificatore,
valore)
37Espressioni
- type aop Add Sub Mul Div And Or Ls
Gr Eq - type unop Neg Amp Star
- type aExp Num of int
- Exp of aExp aop aExp
- Bracket of aExp
- UnExp of unop aExp
- Var of string
- Apply of string aExp
38Comandi
- type com Assign of string aExp
- AssignDeRef of aExp aExp
- If of aExp com com
- While of aExp com
- Block of (stmt list)
- Return of aExp
39Dichiarazioni
- type decl
- Decl1 of espType string
- Decl2 of espType string aExp
- DeclFun of espType string espType string
com
40Programmi
- type stmt StDec of decl
- StCom of com
- type prog Prog of (stmt list)
- Un programma e una lista di statements
(dichiarazioni, comandi)
41Funzione main
- let valProg (Prog l)
- let (sigma,mu)
- valStmtL l (StackFrame,(Mem ))in
- (mu,sigma)
- Il programma e valutato nello stato iniziale, lo
stack contiene un frame vuoto e la memoria e
vuota - restituisce lo stato ottenuto
42Per valutare una lista di statements
- Funzione ricorsiva (valStmtL)
- Per ogni statement (comando o dichiarazione)
chiama la funzione di valutazione corrispondente
43Lista di Statements
- let valStmtL l (sigma, mu)
- match l with
- -gt (sigma, mu)
- ststml -gt
- (match st with
- StDec d -gt let (sigma1, mu1) valDecl d
(sigma,mu) in valStmtL stml (sigma1,mu1)
- StCom c -gt let (sigma1,mu1) valCom c
(sigma,mu) in valStmtL stml (sigma1,mu1))
44Dichiarazioni
- valDecl
- Decl (envmem)---gt (envmem)
- Funzione ricorsiva (valDecl)
- Usa valExp
- Exp (envmem)---gt (Valenvmem)
45Dichiarazioni
- Variabile senza inizializzazione
- Variabile con inizializzazione
- Funzione
46Sintassi Astratta
- type decl
- Decl1 of espType string
- Decl2 of espType string aExp
- DeclFun of espType string espType string
com
47Funzioni Ausiliarie memoria
- free Store---gt Loc Store
- restitituisce una nuova locazione libera e la
memoria modificata di conseguenza (alla nuova
locazione viene assegnato il valore omega) - type 'a mu Mem of 'a list
48Implementazione
- let free (Mem xm) let loc (length xm) in
- ((Loc loc),
- (Mem (append xm ((Loc loc),Omega) )))
- la lista e del tipo (0,v1),(1,v20)...
- la prima locazione libera e detreminata con
length
49Modifica della Memoria
- Serve una operazione
- updateMStoreLocVal---gt Store
- Modifica la memoria rimpiazzando il valore
associato alla locazione con il nuovo valore
50Implementazione
- let rec updateM (Mem m) (x,y) let def m x
foldr (or) false (map (compose (() x) (fst)) m)
and modify m (x,y) let f (x,y) b
if ((fst b)x) then (x,y) else b
in map (f(x,y)) m
in if (not(def m x)) then (Mem m) else (Mem
(modify m (x,y))) - Usa due funzioni ausiliarie def e modify per
testare se la locazione x e definita e per
modificarne il valore nella lista
51Modifica dellenv
- let rec addBind sigma (x,y) match sigma with
Stack Frame -gt - Stack Frame(x,y)
- Stack ((Frame f)fs) -gt
- Stack ((Frame (append f (x,y))) fs)
- inserisce il nuovo legame tra x ed y nellenv
sigma (ovvero nel frame al top della pila,
tramite append e una lista di coppie)
52Dichiarazione di variabile semplice
- let valDecl d (sigma,mu) match d with
Decl1 (t,i) -gt - let (l,mu1) free mu
in let sigma1 (addBind sigma (i, l))
in (sigma1, mu1) - viene modificata la memoria (l e una locazione
fresh, coniene valore indefinito) - viene modificato l\env inserendo lassociazione
(i,l)
53Dichiarazione di variabile con inizializzazione
- let valDecl d (sigma,mu) match d with
Decl2 (t,i,e) -gt - let (v,(sigma1,mu1)) (valExp e (sigma,mu))
in let (l,mu2) free mu1 in - let sigma2 (addBind sigma1 (i,l))
in let mu3 - updateM mu2 (l, v) in (sigma2, mu3)
- viene modificata la memoria (l e una locazione
fresh coniene valore indefinito) - viene modificato l env inserendo lassociazione
(i,l) - il contenuto della locazione l viene poi
aggiornato con il valore calcolato per
lespressione e
54Dichiarazione di Funzione
- DeclFun (t,i,tp,ip, c)
- stiamo dichiarando una funzione di nome
i,parametro ip, corpo c in (sigma,mu) - dovremmo modificare lenv sigma inserendo
lassociazione tra i e la sua descrizione - (ip,c,sigma1)
- chi e sigma1? vediamo la regola formale
55Problemi di Implementazione
-
- bisogna implementarlo usando un puntatore allenv
in FunDecl - Funct of string com sigma ref
- Unbound
56Dichiarazione di Funzione
- let valDecl d (sigma,mu) match d with
- DeclFun (t,i,tp,ip, c) -gtlet rec
sigma1(addBind sigma (i,
(Funct (ip,c, (ref sigma)))))
in ((update i sigma1 sigma1),mu) - in sigma1 la descrizione della funzione i
contiene un riferimento a sigma (andrebbe bene se
non fossero ricorsive - nota che viene restituito come risultato
- update i sigma1 sigma1
-
57Intuitivamente
- update i sigma1 sigma1
- cerca la descrizione di funzione di i in sigma1
- (p,c, sigma ref)
- la modifica assegnando sigma1 al posto di sigma
58Funzione Ausiliaria
- let rec updateF i f sigma match f with
- -gt f
- (j, Funct(x,c,var))fs when (ij) -gt
- var sigma f
- (_,_)fs -gt updateF i fs sigma
- let rec update i s sigma match s with
Stack Frame-gt s - Stack ((Frame fs)ss) -gt
- (updateF i fs sigma) s
59Comandi
- valCom
- Com (envmem)---gt (envmem)
- Funzione ricorsiva (valCom)
- Usa valExp
- Exp (envmem)---gt (Valenvmem)
60Comandi
- Condizionale
- While
- Assegnamento
- Blocco
- Return
61Comandi
- type com Assign of string aExp
- AssignDeRef of aExp aExp
- If of aExp com com
- While of aExp com
- Block of (stmt list)
- Return of aExp
62Funzioni Ausiliarie env
- lookup Env Ide---gt Den
- Den Loc ? FunDecl ? Unbound
- restitituisce il valore denotabile
- associato allidentificatore
- Env e uno Stack di Frames, in realta e una
lista di frames - la ricerca ricorsiva inizia dal frame al top,
e.g. dal primo elemento della lista
63Funzioni Ausiliarie frame
- look Frame Ide---gt Den
- Den Loc ? FunDecl ? Unbound
- restitituisce il valore denotabile
- associato allidentificatore
- Frame e una lista di coppie (identificatore,
valore)
64Implementazione
let rec lookUp sigma y
match sigma with Stack -gt Unbound
Stack (x xs) -gt let b (look x y)
in if (not (bUnbound)) then b else
(lookUp (Stack xs) y) let rec look fi y
match fi with Frame -gt Unbound
Frame ((i, d) xs) -gt if (iy) then d else
(look (Frame xs) y)
65Condizionale
- let valCom c (sigma,mu) match c with
- If (e,c1,c2) -gt let
- ((Val i),(sigma1,mu1)) (valExp e (sigma,mu))
in if not (i0) then valCom c1
(sigma,mu1) else valCom c2 (sigma,mu1) - viene calcolato il valore di e
- se true esegue c1, altrimenti c2
66While
- let valCom c (sigma,mu) match c with
- While (e,c) -gt let
- ((Val i),(sigma1,mu1)) (valExp e (sigma,mu))
in - if not (i0) then
- let (sigma2,mu2) (valCom c (sigma1,mu1))in
valCom (While (e,c)) (sigma2,mu2) else
(sigma1, mu1) - viene calcolato il valore di e, se false
restituisce (sigma1,mu1) - se true esegue While (e,c) nello stato
modificato da c
67Assegnamento
- let valCom c (sigma,mu) match c with
- Assign (s,e) -gt let
- (v,(sigma1,mu1)) (valExp e (sigma,mu)) and
(Loc l) (lookUp sigma s) in (sigma1, updateM
mu1 ((Loc l),v) - viene calcolato il valore v di e e la locazione l
legata alla variabile s in sigma - viene modificato lo store assegnando alla
locazione l il valore v
68Blocco
- let valCom c (sigma,mu) match c with
- Block l -gt
- let (Stack (frl),mu1)
valStmtL l - ((match sigma with Stack fl -gt
Stack (Framefl)) ,mu)
in (Stack rl, mu1) - valuta l nello stato in cui un frame vuoto
Frame - e stato messo al top della pila
- restituisce lenv da cui e stato fatto pop (le
variabili del blocco sono locali)
69Blocco regola astratta
- limplementazione delle operazioni di pop() e
push(frame) e parecchio complicata - regola astratta
70Return
- let valCom c (sigma,mu)
- match c with
- Return e -gt
- valCom (Assign ("retVal",e)) (sigma,mu))
- assegna il valore di e ad una variabile speciale
retval, valore di ritorno della funzione che e
in esecuzione
71Assegnamento Deferenziato
- let valCom c (sigma,mu) match c with
- AssignDeRef (e,ev) -gt let (v,(sigma1,mu1))
- (valExp ev (sigma,mu)) in let
(v1,(sigma2,mu2)) - (valExp e (sigma1,mu1))
in let (Loc l) (etaLoc v1) in
(sigma2, updateM mu2 ((Loc l),v)) - viene calcolato il valore v di e e il valore v1
di e - viene modificato lo store assegnando alla
locazione corrispondente a v1 il valore v
72Funzione Ausiliaria
- let niLoc x match x with
- (Loc l) -gt (Val l)
- _ -gt Undef
- let etaLoc x match x with
- (Val n) when (ngt0) -gt (Loc n)
- _ -gt Unbound
- trasformano locazioni in valori interi e viceversa
73Espressioni
- valExpr
- Expr (envmem)---gt Val (envmem)
- Funzione ricorsiva (valExpr)
74Espressioni
- costanti
- valore di una variabile
- risultato di una chiamata di funzione
- operazioni di confonto, somma tra espressioni
(binarie) - operazione unaria
75Espressioni
- type aop Add Sub Mul Div And Or Ls
Gr Eq - type unop Neg Amp Star
- type aExp Num of int
- Exp of aExp aop aExp
- Bracket of aExp
- UnExp of unop aExp
- Var of string
- Apply of string aExp
76Funzioni Ausiliarie stato
- getVal (EnvMem) Ide---gt Val
-
- deve restituire il valore associato
allidentificatore x - cercare nella pila di Frames Env la locazione l
associata ad x - restituire il valore associato ad l nella memoria
77Implementazione
- let rec getVal (sigma,mu) x
- let b(lookUp sigma x) in
- match b with
- Loc n -gt (lookM mu (Loc n))
- _ -gt Undef
- lookUp cerca nellenv (pila) la locazione n
associata ad x - lookM cerca nella memoria il valore associato ad
n
78ImplementazionelookM
- let rec lookM mu y match mu with Mem
-gt Undef - Mem (( i, v) xs) -gt
- if (iy) then v else
- (lookM (Mem xs) y)
- la memoria e una lista di coppie (i,v), cerca
ricorsivamente un identificatore uguale ad y
79Costante, Parentesi
let rec valExp e (sigma,mu) match e with
Num n -gt ((Val n),(sigma,mu)) Bracket x -gt
valExp x (sigma,mu)
80Variabile
- let rec valExp e (sigma,mu) match e with
- Var s -gt
- ((getVal (sigma,mu) s),(sigma,mu))
- restituisce il valore associato alla variabile s,
calcolato tramite getVal
81Operazioni Binarie
- let rec valExp e (sigma,mu) match e with
- Exp (x, op, y) -gt let
- (v1, (sigma1,mu1)) (valExp x (sigma,mu))
in let - (v2,(sigma2,mu2)) (valExp y (sigma,mu1))
- in...
- calcola ricorsivamente i valore v1 e v2 di x ed
y, rispettivamente - in un ordine
82Procede per casi sulloperazione
- if (isNumOp op) then
- (niNum ( (funNumOp op) (etaNum v1) (etaNum
v2)),(sigma2,mu2)) else - isNumOp restituisce true se e una operazione
numerica (somma etc..) - FunNumOp applica loperazione corrispondente a op
ai valori v1 e v2 - niNum,etaNum servono solo per convertire i valori
Val i in i e viceversa
83Funzioni ausiliarie
- let isNumOp op match op with Add -gt true
- Sub -gt true
- Div -gt true
- Mul -gt true
- _ -gt false
84Funzioni ausiliarie
- let funNumOp op match op with
- Add -gt ()
- Sub -gt (-)
- Mul -gt (fun x y -gt xy)
- Div -gt (/)
85Funzioni ausiliarie di conversione per interi
- let niNum x (Val x)
- let etaNum (Val x) x
86Procede per casi
- if (isBoolOp op) then
- (niBool( (funBoolOp op) (etaBool v1) (etaBool
v2)) ,(sigma2,mu2)) - else
- (niBool( (funRelOp op) (etaNum v1) (etaNum v2))
,(sigma2,mu2)) - se e unoperazione booleana applica la relativa
operazione ai valori booleani v1 e v2 - se e unoperazione relazionale applica la
relativa operazione ai valori booleani v1 e v2
87Funzioni ausiliarie
let isBoolOp op match op with And -gt true
Or -gt true _ -gt false
88Funzioni Ausiliarie
- let funBoolOp op match op with
- And -gt ()
- Or -gt (or)
- let funRelOp op match op with
- Ls -gt (lt)
- Gr -gt (gt)
- Eq -gt ()
89Funzioni Ausiliarie di conversione
- let niBool x if x then
- (Val 1) else (Val 0)
- let etaBool (Val x) if (x0) then false else
true
90Operazioni Unarie per casi
- let rec valExp e (sigma,mu) match e with
- UnExp (op, x) -gt (match op with
Neg -gt - let
- (v1, (sigma1,mu1)) (valExp x (sigma,mu))
in - (niBool( (funop1 op) (etaBool(v1))
),(sigma1,mu1)) - caso della negazione e analogo a quello visto
prima - calcola il valore v di x e chiama funzioni
ausiliarie
91Operazioni Unarie puntatore
- UnExp (op, x) -gt (match op with
Amp -gt ((valDen x sigma),(sigma,mu)) - deve restituire la locazione di x
- usa una funzione ausiliaria valDen
92Funzione ausiliariavalDen
- let rec valDen e sigma (match e with Var s -gt
niLoc(lookUp sigma s) - Exp (x,y,z) -gt
- UndefUnExp(x,y) -gt Undef
- Bracket x -gt Undef)
- e definita nel caso di espressione e generica,
ma e definita solo per le variabili - tramite lookup restituisce la locazione associata
ad s nellambiente sigma
93Operazioni Unarie deferenziato
- UnExp (op, x) -gt (match op with
Star -gt - let (v,(sigma,mu1)) (valExp x (sigma,mu))
in (lookM mu1 (etaLoc v),(sigma,mu1))) - calcola il valore v di x (tramite valExp)
- restuisce il valore memorizzato nella memoria
nella locazione v
94Chiamata di Funzione
- Apply(s,a) dobbiamo applicare la funzione s al
parametro attuale a nello stato (sigma,mu) - Parte I dobbiamo cercare il nome s nellambiente
sigma, restituisce un FunDecl - Funct(f,c,sigmaf)
- f e il parametro formale
- c e il corpo della funzione
- sigmaf e lambiente al momento della
dichiarazione della funzione s (scoping statico) - Parte II dobbiamo valutare il parametro a nello
stato corrente, calcolarne il valore v (per
valore) -
95Chiamata di FunzionePart II
- Dobbiamo valutare il corpo della funzione c, in
quale stato? - Lo stato di valutazione si costruisce a partire
da - (sigmaf,mu)
- Bisogna mettere sulla pila sigmaf un EmptyFrame
(push) che serve per contenere le dichiarazioni
locali - alla funzione
- Le dichirazioni locali conterranno il legame tra
il parametro formale f ed il valore del parametro
attuale v e la variabile speciale retval - Nota che per inserire un legame devono essere
modifica sia lambiente che la memoria -
96Chiamata di FunzionePart III
- Cosa restituisce?
- il valore associato alla variabile retval
- lambiente sigma al momento della chiamata (non
modificato) - la memoria modificata dallesecuzione dei comandi
-
97Chiamata di Funzione valExp
- Vediamo il codice di valExp per la funzione
- Molto complicato, perche di basso livello
- La nozione di stato (env,mem) non fornisce
operazioni chiare per fare push, pop - Inoltre lintroduzione di un nuovo legame in un
frame viene fatto a mano, operando direttamente
sulla lista che implementa il frame - Analogamente lintroduzione di un nuovo legame
nella memoria viene fatto a mano, operando
direttamente sulla lista che lo implementa -
98Chiamata di funzione
- let rec valExp e (sigma,mu) match e with
- Apply (s,a) -gt let (v,(sigma1,mu1))
- valExp a (sigma,mu) in
- (match (lookUp sigma s) with Funct
(f,c, sigmaf) -gt .... - calcola tramite valExp il valore v del parametro
attuale a - cerca tramite lookUp la FunDecl relativa ad s
99Chiamata di funzione
- (let (l,mu2)(free mu1) in let (l1,mu3) (free
mu2) in let sigmav(match (!
sigmaf) with Stack sl -gt - addBind (addBind (Stack
- (Frame sl)) (f,l)) ("retVal",l1))
- sceglie due locazioni libere in memoria l ed l1
- modifica lambiente sigmaf , facendo push di un
frame che contiene (f,l) e (retval l1)
100Chiamata di funzione
- in let (sigma2,mu4)
- valCom c (sigmav,updateM mu3 (l, v))
in ((lookM mu4 l1),(sigma,mu4))) - valuta il corpo della funzione c nellambiente
sigmav costruito in precedenza,e nella memoria
ottenuta aggiungendo il legame tra (l,v) - restituisce il valore della locazione l1 nella
memoria (il valore di retval), lambiente sigma
iniziale, e la memoria finale mu4