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 Cosa aggiungiamo 4 le gerarchie di classi –ereditarietà ed overriding 4 l’attributo “static” per variabili e metodi –esistono variabili e metodi propri della classe 4 i costruttori –metodi che vengono invocati al momento della creazione di una istanza di classe
3 Semantica statica 4 Trascuriamo tutti gli aspetti legati alla semantica statica 4 Proprietà statiche importanti verranno descritte in modo informale 4 Semantica (semplificata) solo per programmi che supererebbero con successo l’analisi statica
4 Lo stato ambiente delle classi –contiene le classi dichiarate prima dell’inizio dell’esecuzione 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)
5 Ambiente delle classi è una funzione da identificatori di classe a descrizioni di classe – : Cenv –Cenv = Id -> Cdescr 4 cos’è una descrizione di classe? 4 vediamo prima la sintassi (semplificata) che usiamo per le dichiarazioni di classe IdCdesr … …
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 statiche metodi statici variabili istanza metodi istanza + costruttore IdFrameMenvFrameMenv
7 Il frame 4 è una tabella (estendibile e mutabile) che mantiene associazioni fra –identificatori (di variabili) –valori interi, booleani locazioni (puntatori ad oggetti) newframe()-- bind( , i, v)-- estende inserendo l’associazione tra i e v update( , i, v)-- modifica in l’associazione per i (che deve esistere) copy( )-- costruisce una copia di defined( , i)-- true se contiene un’associazione per i (i)-- applicazione:valore di i in Idvalori … …
8 Ambiente di metodi è una funzione da identificatori di metodo a descrizioni di metodo – : Menv –Menv = Id -> Mdescr 4 cos’è una descrizione di metodo? 4 vediamo prima la sintassi (semplificata) che usiamo per le dichiarazioni di metodo IdMdescr …
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 metodopuntatore a oggettonome di classe IdlistbodyLoc/Id
10 Operazioni sugli ambienti (metodi e class) cemptyenv() / memptyenv() un ambiente “vuoto” cbind( :Cenv, i:Id, c:Cdescr)/ mbind( :Menv,i:Id,m:Mdescr) estende con i e c/m cdefined( , i)/mdefined( , i) true se è definita su i instantiate( :Menv,l:Loc) crea un nuovo ambiente diverso da perché le descrizioni di tutti i metodi hanno l come componente loc applicazione: i i
11 La memoria heap è una funzione da locazioni a descrizioni di istanza (oggetto) – : Heap –Heap = Loc -> Odescr 4 cos’è una descrizione di oggetto? Odescr = Id * Frame * Menv classevariabili di istanzametodi di istanza Loc IdFrameMenv
12 Operazioni sulla heap newheap() newloc( )-- genera una nuova locazione in hbind( :Heap,l:Loc,o:Odescr)-- estende con l e o 4 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
13 La pila di attivazioni è una pila di records di attivazione di metodi – : Astack –Astack = Stack (Record) 4 il record di attivazione –oggetto o classe a cui il metodo appartiene –pila di frames (blocchi annidati) Record = ( Id | Loc ) * Stack(Frame) classeoggetto Attuali + Variabili locali IdStack(Frame)
14 Operazioni sulle pile (record, frame) emptystack() top( :Stack(x))-- restituisce l’elemento in testa a pop( :Stack(x))-- rimuove l’elemento in testa push( :Stack(x),e:x)-- inserisce e in testa empty(( :Stack(x))-- verifica se è vuota
15 Le strutture dello stato (riepilogo 1) 4 Ambiente delle classi Cenv = Id -> Cdescr Cdescr = Id * Frame * Menv * Frame* Menv –cemptyenv() –cbind(( :Cenv), (i:Id), (c:Cdescr)) –cdefined(( :Cenv),(i:Id)) 4 Heap Heap = Loc -> Odescr Odescr = Id * Frame * Menv –newheap() –newloc (( :Heap)) –hbind(( :Heap), (l:Loc), (o:Odescr))
16 Le strutture dello stato (riepilogo 2) 4 Pila delle attivazioni Astack = Stack (Record) Record = ( Id | Loc ) * Stack(Frame) –operazioni delle pile
17 Le strutture (ausiliarie) dello stato (riepilogo 3) 4 Ambiente dei metodi Menv = Id -> Mdescr Mdescr = Idlist * Blocco * ( Loc | Id ) –memptyenv() –mbind(( :Menv), (i:Id), (m:Mdescr)) –mdefined (( :Menv), (i:Id)) –instantiate(( :Menv), (l: Loc)) 4 Frames Frame = Id -> Val Val = (Bool | Int | Loc) –newframe() –copy(( :Frame)) –bind(( :Frame), (i:Id), (v:Val)) –update(( :Frame), (i:Id), (v:Val)) –defined(( :Frame), (i:Id))
18 Uno stato (1) 4 parte statica (classi) Object A B C A A a b c 23 5 d e ? ? 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
19 Uno stato (2) 4 parte dinamica (pila e heap) –è in esecuzione il metodo f4 di una istanza di C C d e 3 f3 C () (x) () f4 puntatori al codice dei metodi stack x heap
20 Cosa si “vede” in questo stato 4 tutti i nomi delle classi –attraverso queste, le variabili ed i metodi statici Object A B C A A a b c 23 5 d e ? ? 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
21 Cosa si “vede” in questo stato 4 nomi di variabili (nell’ordine) –stack locale –frame dell’oggetto a cui appartiene il metodo –frames (statici) lungo la catena di sottoclassi C d e 3 f3 C () (x) () f4 puntatori al codice dei metodi stack x heap
22 Cosa si “vede” in questo stato 4 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 d e 3 f3 C () (x) () f4 puntatori al codice dei metodi stack x heap