1 semantica operazionale di un frammento di java: lo stato estensione (con piccole varianti) di...
TRANSCRIPT
1
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
2
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
3
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
4
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
5
Lo stato
pila di attivazioni – per la valutazione dei metodi
– simile alla pila dei record di attivazione nei linguaggi tradizionali
heap – contiene gli oggetti (istanze di classi)
ambiente delle classi – contiene le classi dichiarate prima dell’inizio
dell’esecuzione
6
Ambiente delle classi
è una funzione da identificatori di classe a descrizioni di classe – : Cenv
– Cenv = Id -> Cdescr
cos’è una descrizione di classe? vediamo prima la sintassi (semplificata) che
usiamo per le dichiarazioni di classe
7
Dichiarazione di classe: sintassi
Class_decl := class Id extends Id {Static_var_decl_listStatic_meth_decl_listInst_var_decl_listInst_meth_decl_listCostruttore }
Cdescr = Id * Frame * Menv * Frame * Menv
superclasse
variabili statiche
metodi statici
variabili istanza
metodi istanza
il costruttore (sequenza di assegnamenti) viene aggiunto ai metodi istanza
8
Il frame
è una tabella (estendibile e mutabile) che mantiene associazioni fra – identificatori (di variabili) – valori
• interi, booleani • locazioni (puntatori ad oggetti)
un frame :Frame viene creato vuoto (newframe()) l’operazione bind(, i, v) estende inserendo l’associazione tra i e v l’operazione update(, i, v) modifica in l’associazione per i (che deve
esistere) l’operazione defined(, i) dice se contiene un’associazione per i per ottenere il valore di una variabile, si applica il frame all’Id
9
Ambiente di metodi
è una funzione da identificatori di metodo a descrizioni di metodo – : Menv
– Menv = Id -> Mdescr
cos’è una descrizione di metodo? vediamo prima la sintassi (semplificata) che
usiamo per le dichiarazioni di metodo
10
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 metodopuntatore a oggetto
nome di classe
11
Operazioni sugli ambienti di metodi e di classi
cbind((:Cenv), (i:Id), (c:Cdescr)) estende associando ad i il valore c
cdefined(:Cenv, i:Id) dice se è definita per i mbind((:Menv), (i:Id), (m:Mdescr)) estende
associando ad i il valore m mdefined(:Menv, i:Id) dice se è definita per i instantiate((:Menv), (l:Loc)) crea un nuovo
ambiente diverso da perché tutte le descrizioni di metodi contengono l’oggetto l
12
La heap
è una funzione da locazioni a descrizioni di istanza (oggetto) – : Heap
– Heap = Loc -> Odescr
cos’è una descrizione di oggetto?
Odescr = Id * Frame * Menv
classe variabili di istanza metodi di istanza
13
Operazioni sullo heap
newheap() genera una heap vuota newloc()genera una nuova locazione in hbind((:Heap), (l:Loc), (o:Odescr)) estende
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()– hbind((:Heap), (l:Loc), (o:Odescr))
– restituisce l
14
La pila di attivazioni
è una pila di records di attivazione di metodi – : 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
15
Operazioni sulle pile (record, frame)
emptystack()genera una pila vuota top((:Stack(x)) restituisce l’elemento di tipo x in
testa a pop((:Stack(x)) modifica eliminando
l’elementoin testa push((:Stack(x),(e:x)) modifica inserendo
l’elemento e in testa empty((:Stack(x)) verifica se è vuota
16
Le strutture dello stato (riepilogo 1)
Ambiente delle classi
Cenv = Id -> CdescrCdescr = Id * Frame * Menv * Frame* Menv
– cbind((:Cenv), (i:Id), (c:Cdescr))
– cdefined((:Cenv),(i:Id)) HeapHeap = Loc -> Odescr
Odescr = Id * Frame * Menv– newheap()– newloc ((:Heap))– hbind((:Heap), (l:Loc), (o:Odescr))
17
Le strutture dello stato (riepilogo 2)
Pila delle attivazioni
Astack = Stack (Record)Record = ( Id | Loc ) * Stack(Frame)
– operazioni delle pile
18
Le strutture (ausiliarie) dello stato (riepilogo 3) Ambiente dei metodiMenv = Id -> Mdescr
Mdescr = Idlist * Blocco * ( Loc | Id )– mbind((:Menv), (i:Id), (m:Mdescr))– mdefined ((:Menv), (i:Id))– instantiate((:Menv), (l: Loc))
FramesFrame = Id -> Val
Val = (Bool | Int | Loc)– newframe()– bind((:Frame) , (i:Id), (v:Val))– update((:Frame) , (i:Id), (v:Val))– defined((:Frame), (i:Id))
19
Uno stato (1)
parte statica (classi)
Object
A
B
CAA
a
bc
23
5
de
??
f3
C
() ?(x) ?
() ?f4
f1
f2
(y,z)
(w)
C
C
codice blocco f2
codice blocco f3
codice blocco f4
codice blocco f1
codice blocco C
puntatore ad oggetto
20
Uno stato (2)
parte dinamica (pila e heap)– è in esecuzione il metodo f4 di una istanza di C
C de
3f3
C
()(x)
()f4
puntatori al codice dei metodi
stack
x
heap
21
Cosa si “vede” in questo stato
tutti i nomi delle classi– attraverso queste, le variabili ed i metodi statici
C de
3f3
C
()(x)
()f4
puntatori al codice dei metodi
stack
x
heap
22
Cosa si “vede” in questo stato
nomi di variabili (nell’ordine)– stack locale– frame dell’oggetto a cui appartiene il metodo– frames (statici) lungo la catena di sottoclassi
C de
3f3
C
()(x)
()f4
puntatori al codice dei metodi
stack
x
heap
23
Cosa si “vede” in questo stato
nomi di metodi (nell’ordine)– ambiente di metodi dell’oggetto a cui appartiene il metodo
• lui incluso (ricorsione)– ambienti di metodi (statici) lungo la catena di sottoclassi
C de
3f3
C
()(x)
()f4
puntatori al codice dei metodi
stack
x
heap