1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini, Elementi di Semantica Operazionale, appunti di Fondamenti di Programmazione
2 Regole di transizione 4 diverse relazioni di transizione, in corrispondenza dei diversi tipi di costrutti del linguaggio –espressioni, comandi, dichiarazioni ecc. kk
3 Dichiarazione di classe extends Class_decl := class Id extends Id {Static_var_decl_listStatic_meth_decl_list Inst_var_decl_list Inst_meth_decl_list Costruttore Costruttore } 4 assunzioni –c’è sempre extends ogni classe estende la classe Object –le dichiarazioni di variabili e metodi statici sono “raggruppate” –esiste sempre il costruttore
4 Semantica informale delle classi 4 variabili e metodi statici appartengono alla classe 4 variabili e metodi di istanza appartengono agli oggetti (istanze della classe) 4 una classe definisce un tipo (nome della classe) –gli oggetti della classe hanno quel tipo 4 relazioni di sottoclasse ed ereditarietà –gerarchia di tipi, realizzata con extends –la radice della gerarchia è la classe predefinita Object
5 Ereditarietà 4 se c down è una sottoclasse (estende) c up –variabili e metodi statici di c up (e delle sue superclassi) sono visibili direttamente da c down –variabili e metodi di istanza di c up (e delle sue superclassi) diventano anhe variabili e metodi di istanza degli oggetti di c down –Tipo degli oggetti di c up è anche tipo degli oggetti di c down 4 a meno di overriding
6 Overriding 4 se c down è una sottoclasse (estende) c up –un metodo di istanza di c up (e delle sue superclassi) può essere ridefinito (stesso nome e tipi) in c down –l’idea è quella di definire un metodo più specializzato, che rimpiazza quello definito in una delle superclassi 4 l’overriding non “dovrebbe” essere possibile per le variabili e per i metodi statici –ma questo non è sempre garantito dal compilatore –comportamenti complessi e poco prevedibili –assumeremo che non si verifichi mai
7 Inizializzazioni 4 Java permette di inizializzare (al valore di una espressione) sia le variabili statiche che quelle di istanza in una dichiarazione –le inizializzazioni delle variabili statiche vengono effettuate la prima volta che si usa una classe –le inizializzazioni delle variabili di istanza vengono effettuate all’atto della creazione di una istanza (oggetto) non avere inizializzazioni 4 per semplicità, decidiamo di non avere inizializzazioni nelle dichiarazioni di variabile all’interno di classi possono essere affidate 4 Le inizializzazioni possono essere affidate al(i) costruttore(i) –eseguito quando si crea un’istanza
8 Il costruttore 4 i costruttori sono usati per la creazione di un oggetto: –Inizializzazione dello stato (variabili di istanza) 4 anche per i costruttori esiste un meccanismo di ereditarietà 4 se c è una classe che ha come superclassi (nell’ordine) le classi c1, c2,…, cn Object, –all’atto della creazione di una istanza di c –si eseguono (nell’ordine) i costruttori di cn,…,c2,c1,c
9 Dichiarazione di classe Class_decl := class Id extends Id { Static_var_decl_list Static_meth_decl_list Inst_var_decl_list Inst_meth_decl_list Costruttore } Cenv = Id -> Cdescr Cdescr = Id * Frame * Menv * Frame* Menv 4 la relazione di transizione cdecl Class_decl * Cenv cdecl Cenv
10 Dichiarazione di classe Cenv = Id -> Cdescr Cdescr = Id * Frame * Menv * Frame* Menv Class_decl * Cenv cdecl Cenv (b) = (_,_,_, b, b ) b (b) = (_, c b, _) vdecl vdecl a mdecl mdecl a ________________________________________________ cdecl cdecl cbind( , a, (b, , , a, mbind( a, a, ([], c b c, a)))) cbind( , a, (b, , , a, mbind( a, a, ([], c b c, a))))
11 Dichiarazioni di metodi Method_decl := Id (Idlist) Blocco 4 guardiamo solo la dichiarazione singola –per una lista di dichiarazioni, si ripete a partire dal risultato precedente Menv = Id -> Mdescr Mdescr = Idlist * Blocco * ( Loc | Id ) 4 la relazione di transizione mdecl Method_decl * Id * Menv mdecl Menv
12 Dichiarazione di metodo Method_decl := Id (Idlist) Blocco mdecl mbind( , m, (idlist, blocco, c)) mdecl mbind( , m, (idlist, blocco, c)) 4 come già osservato, l’eventuale overriding è realizzato automaticamente da mbind
13 Dichiarazioni di variabili Var_decl := Type Id; come già osservato, le dichiarazioni non hanno inizializzazione 4 guardiamo solo la dichiarazione singola –per una lista di dichiarazioni, si ripete a partire dal risultato precedente Frame = Id -> Val Val = (Bool | Int | Loc) 4 la relazione di transizione vdecl Var_decl * Frame vdecl Frame
14 Dichiarazione di variabile Frame = Id -> Val Val = (Bool | Int | Loc) Var_decl * Frame vdecl Frame vdecl bind( , id, default(t)) vdecl bind( , id, default(t)) 4 come già osservato, non ci deve essere overriding –id non deve essere definito in 4 in realtà un Frame è una struttura modificabile –update modifica l’argomento 4 la funzione default genera un valore di tipo t –0 se t è intero –null se t è il tipo di un oggetto