Semantica Operazionale di un
frammento di Java: lo stato
estensione (con piccole varianti) di quella in
Barbuti, Mancarella, Turini,
Elementi di Semantica Operazionale,
appunti di Fondamenti di Programmazione
1
Cosa aggiungiamo
 le gerarchie di classi
– ereditarietà ed overriding
 l’attributo “static” per variabili e metodi
– esistono variabili e metodi propri della classe
 i costruttori
– metodi che vengono invocati al momento della
creazione di una istanza di classe
2
Semantica statica
 Trascuriamo tutti gli aspetti legati alla semantica
statica
 Proprietà statiche importanti verranno descritte in
modo informale
 Semantica (semplificata) solo per programmi che
supererebbero con successo l’analisi statica
3
Lo stato
r
s
z
 ambiente delle classi r
– contiene le classi dichiarate prima dell’inizio
dell’esecuzione
 pila di attivazioni s
– per la valutazione dei metodi
– simile alla pila dei record di attivazione nei linguaggi
tradizionali
 heap z
– contiene gli oggetti (istanze di classi)
4
Ambiente delle classi r
 r è una funzione da identificatori di classe a descrizioni di
classe
– r : Cenv
– Cenv = Id -> Cdescr
 cos’è una descrizione di classe?
Id
Cdesr
…
…
 vediamo prima la sintassi (semplificata) che usiamo per le
dichiarazioni di classe
5
Dichiarazione di classe: sintassi
Class_decl := class Id extends Id {
Static_var_decl_list
Static_meth_decl_list
Inst_var_decl_list
Inst_meth_decl_list
Costruttore
}
Cdescr = Id * Frame * Menv * Frame * Menv
superclasse
variabili istanza
variabili statiche
metodi statici
Id
metodi istanza
+ costruttore
Frame Menv Frame Menv
6
Il frame j
 è una tabella (estendibile e mutabile) che mantiene
associazioni fra
– identificatori (di variabili)
– valori
• interi, booleani
• locazioni (puntatori ad oggetti)






Id
valori
…
…
newframe()-bind(j, i, v)-- estende j inserendo l’associazione tra i e v
update(j, i, v)-- modifica in j l’associazione per i (che deve esistere)
copy(j)-- costruisce una copia di j
defined(j, i)-- true se j contiene un’associazione per i
j(i)-- applicazione:valore di i in j
7
Ambiente di metodi m
 m è una funzione da identificatori di metodo a descrizioni
di metodo
– m : Menv
– Menv = Id -> Mdescr
Id
Mdescr
…
 cos’è una descrizione di metodo?
 vediamo prima la sintassi (semplificata) che usiamo per le
dichiarazioni di metodo
8
Dichiarazione di metodo: sintassi
Method_decl := Id (Idlist) Blocco
– ignoriamo i tipi
– quando il metodo verrà invocato, dovrà sapere la classe
o l’oggetto a cui appartiene
Mdescr = Idlist * Blocco * ( Loc | Id )
parametri formali
corpo del metodo
puntatore a oggetto
Idlist
nome di classe
body
Loc/Id
9
Operazioni sugli ambienti (metodi e
class) r, m
 cemptyenv() / memptyenv() un ambiente “vuoto”
 cbind(r:Cenv, i:Id, c:Cdescr)/
mbind(m:Menv,i:Id,m:Mdescr) estende r/m con i e c/m
 cdefined(r, i)/mdefined(m, i) true se r/m è definita su i
 instantiate(m:Menv,l:Loc) crea un nuovo ambiente m1
diverso da m perché le descrizioni di tutti i metodi hanno l
come componente loc
 applicazione: r(i)/m(i)
10
La memoria heap z
 z è una funzione da locazioni a descrizioni di
istanza (oggetto)
– z : Heap
– Heap = Loc -> Odescr
Loc
Id
Frame
Menv
 cos’è una descrizione di oggetto?
Odescr = Id * Frame * Menv
classe
variabili di istanza
metodi di istanza
11
Operazioni sulla heap
 newheap()
 newloc(z)-- genera una nuova locazione in z
 hbind(z:Heap,l:Loc,o:Odescr)-- estende z con l e o
 un oggetto viene creato con l’espressione new Id
– genera il valore o:Odescr a partire dalla classe Id
– l = newloc(z)
– hbind(z:Heap,l:Loc,o:Odescr)
– restituisce l
12
La pila di attivazioni s
 s è una pila di records di attivazione di metodi
– s : Astack
– Astack = Stack (Record)
Id
Stack(Frame)
 il record di attivazione
– oggetto o classe a cui il metodo appartiene
– pila di frames (blocchi annidati)
Record = ( Id | Loc ) * Stack(Frame)
classe
oggetto
Attuali + Variabili
locali
13
Operazioni sulle pile (record, frame)
 emptystack()
 top(p:Stack(x))-- restituisce l’elemento in testa a p
 pop(p:Stack(x))-- rimuove l’elemento in testa
 push(p:Stack(x),e:x)-- inserisce e in testa
 empty((p:Stack(x))-- verifica se p è vuota
14
Le strutture dello stato (riepilogo 1)
 Ambiente delle classi
Cenv = Id -> Cdescr
Cdescr = Id * Frame * Menv * Frame* Menv
– cemptyenv()
– cbind((r:Cenv), (i:Id), (c:Cdescr))
– cdefined((r:Cenv),(i:Id))
 Heap
Heap = Loc -> Odescr
Odescr = Id * Frame * Menv
– newheap()
– newloc ((z:Heap))
– hbind((z:Heap), (l:Loc), (o:Odescr))
15
Le strutture dello stato (riepilogo 2)
 Pila delle attivazioni
Astack = Stack (Record)
Record = ( Id | Loc ) * Stack(Frame)
– operazioni delle pile
16
Le strutture (ausiliarie) dello stato
(riepilogo 3)
 Ambiente dei metodi
Menv = Id -> Mdescr
Mdescr = Idlist * Blocco * ( Loc | Id )
– memptyenv()
– mbind((m:Menv), (i:Id), (m:Mdescr))
– mdefined ((m:Menv), (i:Id))
– instantiate((m:Menv), (l: Loc))
 Frames
Frame = Id -> Val
Val = (Bool | Int | Loc)
– newframe()
– copy((j:Frame))
– bind((j:Frame) , (i:Id), (v:Val))
– update((j:Frame) , (i:Id), (v:Val))
– defined((j:Frame), (i:Id))
17
Uno stato (1)
puntatore ad oggetto
codice blocco f1
codice blocco f2
codice blocco f3
C
A
a 23
f1 (y,z)
C
b
c 5
f2 (w)
C
d ?
e ?
f3 ()
f4 (x)
?
?
C ()
?
codice blocco f4
codice blocco C
B
A
Object
 parte statica (classi)
18
Uno stato (2)
x
d 3
e
C
f3 ()
f4 (x)
C ()
stack
heap
puntatori al codice dei metodi
 parte dinamica (pila e heap)
– è in esecuzione il metodo f4 di una istanza di C
19
Cosa si “vede” in questo stato
puntatore ad oggetto
codice blocco f1
codice blocco f2
codice blocco f3
C
A
a 23
f1 (y,z)
C
b
c 5
f2 (w)
C
d ?
e ?
f3 ()
f4 (x)
?
?
C ()
?
codice blocco f4
codice blocco C
B
A
Object
 tutti i nomi delle classi
– attraverso queste, le variabili ed i metodi statici
20
Cosa si “vede” in questo stato
x
d 3
e
C
f3 ()
f4 (x)
C ()
stack
heap
 nomi di variabili (nell’ordine)
puntatori al codice dei metodi
– stack locale
– frame dell’oggetto a cui appartiene il metodo
– frames (statici) lungo la catena di sottoclassi
21
Cosa si “vede” in questo stato
x
d 3
e
C
f3 ()
f4 (x)
C ()
stack
heap
 nomi di metodi (nell’ordine)
puntatori al codice dei metodi
– ambiente di metodi dell’oggetto a cui appartiene il metodo
• lui incluso (ricorsione)
– ambienti di metodi (statici) lungo la catena di sottoclassi
22
Scarica

copia dei lucidi presentati