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
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
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
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
Lo stato pila di attivazioni s heap z ambiente delle classi r 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
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
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
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
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
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 nome di classe corpo del metodo puntatore a oggetto
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
La heap z Odescr = Id * Frame * Menv 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
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
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
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
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))
Le strutture dello stato (riepilogo 2) Pila delle attivazioni Astack = Stack (Record) Record = ( Id | Loc ) * Stack(Frame) operazioni delle pile
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))
Uno stato (1) parte statica (classi) puntatore ad oggetto codice blocco f1 codice blocco f2 codice blocco f3 codice blocco f4 a 23 f3 C () ? (x) f4 f1 f2 (y,z) (w) C d ? A A C b e ? codice blocco C c 5 B A Object parte statica (classi)
Uno stato (2) parte dinamica (pila e heap) f3 C () (x) d e 3 C f4 x stack heap puntatori al codice dei metodi parte dinamica (pila e heap) è in esecuzione il metodo f4 di una istanza di C
Cosa si “vede” in questo stato f3 C () (x) d e 3 C f4 x stack heap puntatori al codice dei metodi tutti i nomi delle classi attraverso queste, le variabili ed i metodi statici
Cosa si “vede” in questo stato f3 C () (x) d e 3 C f4 x stack heap nomi di variabili (nell’ordine) stack locale frame dell’oggetto a cui appartiene il metodo frames (statici) lungo la catena di sottoclassi puntatori al codice dei metodi
Cosa si “vede” in questo stato f3 C () (x) d e 3 C f4 x stack heap 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 puntatori al codice dei metodi