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
Semantica operazionale
 modello di esecuzione
– importanti soprattutto le strutture che
compongono lo stato
 simile alle strutture a run-time della JVM,
che esegue il byte-code prodotto dal
compilatore
– con alcune semplificazioni legate alle
ottimizzazioni effettuate dal compilatore
2
Cosa aggiungiamo
 le gerarchie di classi
– trattiamo l’ereditarietà ed l’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
3
Semantica statica
 nella formalizzazione trascuriamo tutti gli aspetti
legati alla semantica statica
– in particolare, quelli che darebbero origine a messaggi
di errore durante la compilazione
– tipi, visibilità dei nomi, vincoli sull’overriding
 le proprietà statiche importanti verranno descritte
in modo informale
 semantica semplificata solo per programmi che
supererebbero con successo l’analisi statica
4
Lo stato
 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)
 ambiente delle classi r
– contiene le classi dichiarate prima dell’inizio
dell’esecuzione
5
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?
 vediamo prima la sintassi (semplificata) che
usiamo per le dichiarazioni di classe
6
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 istanza
metodi statici
il costruttore (sequenza di assegnamenti) viene aggiunto ai metodi istanza
7
Il frame
 è una tabella (estendibile e mutabile) che mantiene
associazioni fra
– identificatori (di variabili)
– valori
• interi, booleani
• locazioni (puntatori ad oggetti)
 un frame j:Frame viene creato vuoto (newframe())
 l’operazione bind(j, i, v) estende j inserendo l’associazione tra i e v
 l’operazione update(j, i, v) modifica in j l’associazione per i (che
deve esistere)
 l’operazione defined(j, i) dice se j contiene un’associazione per i
 per ottenere il valore di una variabile, si applica il frame all’Id
8
Ambiente di metodi m
 m è una funzione da identificatori di metodo a
descrizioni di metodo
– m : Menv
– Menv = Id -> Mdescr
 cos’è una descrizione di metodo?
 vediamo prima la sintassi (semplificata) che
usiamo per le dichiarazioni di metodo
9
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
nome di classe
puntatore a oggetto
10
Operazioni sugli ambienti di metodi
e di classi
 cbind((r:Cenv), (i:Id), (c:Cdescr)) estende r
associando ad i il valore c
 cdefined(r:Cenv, i:Id) dice se r è definita per i
 mbind((m:Menv), (i:Id), (m:Mdescr)) estende m
associando ad i il valore m
 mdefined(m :Menv, i:Id) dice se m è definita per i
 instantiate((m:Menv), (l:Loc)) crea un nuovo
ambiente m1 diverso da m perché tutte le
descrizioni di metodi contengono l’oggetto l
11
La heap z
 z è una funzione da locazioni a descrizioni di
istanza (oggetto)
– z : Heap
– Heap = Loc -> Odescr
 cos’è una descrizione di oggetto?
Odescr = Id * Frame * Menv
classe
variabili di istanza
metodi di istanza
12
Operazioni sullo heap
 newheap() genera una heap vuota
 newloc(z) genera una nuova locazione in z
 hbind((z:Heap), (l:Loc), (o:Odescr)) estende z
associando ad l il valore 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
13
La pila di attivazioni s
 s è una pila di records di attivazione di metodi
– s : Astack
– Astack = Stack (Record)
 il record di attivazione
– oggetto o classe a cui il metodo appartiene
– pila di frames (blocchi annidati)
Record = ( Id | Loc ) * Stack(Frame)
classe
oggetto
variabili locali
14
Operazioni sulle pile (record, frame)
 emptystack() genera una pila vuota
 top((p:Stack(x)) restituisce l’elemento di tipo x in
testa a p
 pop((p:Stack(x)) modifica p eliminando
l’elemento in testa
 push((p:Stack(x),(e:x)) modifica p inserendo
l’elemento e in testa
 empty((p:Stack(x)) verifica se p è vuota
15
Le strutture dello stato (riepilogo 1)
 Ambiente delle classi
Cenv = Id -> Cdescr
Cdescr = Id * Frame * Menv * Frame* Menv
– 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))
16
Le strutture dello stato (riepilogo 2)
 Pila delle attivazioni
Astack = Stack (Record)
Record = ( Id | Loc ) * Stack(Frame)
– operazioni delle pile
17
Le strutture (ausiliarie) dello stato
(riepilogo 3)
 Ambiente dei metodi
Menv = Id -> Mdescr
Mdescr = Idlist * Blocco * ( Loc | Id )
– 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()
– bind((j:Frame) , (i:Id), (v:Val))
– update((j:Frame) , (i:Id), (v:Val))
– defined((j:Frame), (i:Id))
18
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)
19
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
20
Cosa si “vede” in questo stato
x
d 3
e
C
f3 ()
f4 (x)
C ()
stack
heap
puntatori al codice dei metodi
 tutti i nomi delle classi
– attraverso queste, le variabili ed i metodi statici
21
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
22
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
23
Scarica

Semantica Operazionale di un frammento di Java