Semantica Operazionale di un frammento di Java le

  • Slides: 14
Download presentation
Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole

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 1

Regole di transizione 4 diverse relazioni di transizione, in corrispondenza dei diversi tipi di

Regole di transizione 4 diverse relazioni di transizione, in corrispondenza dei diversi tipi di costrutti del linguaggio – espressioni, comandi, dichiarazioni ecc. r 0 r 1 rk 2

Dichiarazione di classe Class_decl : = class Id extends Id { Static_var_decl_list Static_meth_decl_list Inst_var_decl_list

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 } 4 assunzioni – c’è sempre extends • ogni classe estende la classe Object – le dichiarazioni di variabili e metodi statici sono “raggruppate” – esiste sempre il costruttore 3

Semantica informale delle classi 4 variabili e metodi statici appartengono alla classe 4 variabili

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 4

Ereditarietà 4 se cdown è una sottoclasse (estende) cup – variabili e metodi statici

Ereditarietà 4 se cdown è una sottoclasse (estende) cup – variabili e metodi statici di cup (e delle superclassi) sono visibili direttamente da cdown – variabili e metodi di istanza di cup (e delle superclassi) diventano anhe variabili e metodi di istanza degli oggetti di cdown – Tipo degli oggetti di cup è anche tipo degli oggetti di cdown 4 a meno di overriding 5

Overriding 4 se cdown è una sottoclasse (estende) cup – un metodo di istanza

Overriding 4 se cdown è una sottoclasse (estende) cup – un metodo di istanza di cup (e delle superclassi) può essere ridefinito (stesso nome e tipi) in cdown – 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 6

Inizializzazioni 4 Java permette di inizializzare (al valore di una espressione) sia le variabili

Inizializzazioni 4 Java permette di inizializzare (al valore di una espressione) sia le variabili statiche 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) 4 per semplicità, decidiamo di non avere inizializzazioni nelle dichiarazioni di variabile all’interno di classi 4 Le inizializzazioni possono essere affidate al(i) costruttore(i) – eseguito quando si crea un’istanza 7

Il costruttore 4 i costruttori sono usati per la creazione di un oggetto: –

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 c 1, c 2, …, cn Object, – all’atto della creazione di una istanza di c – si eseguono (nell’ordine) i costruttori di cn, …, c 2, c 1, c 8

Dichiarazione di classe Class_decl : = class Id extends Id { Static_var_decl_list Static_meth_decl_list Inst_var_decl_list

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 = Id * Frame * Menv * Frame* Menv 4 la relazione di transizione Class_decl * Cenv cdecl Cenv 9

Dichiarazione di classe Cenv = Id -> Cdescr = Id * Frame * Menv

Dichiarazione di classe Cenv = Id -> Cdescr = Id * Frame * Menv * Frame* Menv Class_decl * Cenv cdecl Cenv r(b) = (_, _, _, jb, mb) mb(b) = (_, cb, _) <svdl, newframe()> vdecl j <ivdl, copy(jb)> vdecl ja <smdl, a, memptyenv()> mdecl m <imdl, a, mb> mdecl ma ________________________ <class a extends b {svdl smdl ivdl imdl c}, r> cdecl cbind(r, a, (b, j, m , ja, mbind(ma, a, ([], cb c, a)))) 10

Dichiarazioni di metodi Method_decl : = Id (Idlist) Blocco 4 guardiamo solo la dichiarazione

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 = Idlist * Blocco * ( Loc | Id ) 4 la relazione di transizione Method_decl * Id * Menv mdecl Menv 11

Dichiarazione di metodo Method_decl : = Id (Idlist) Blocco <m (idlist) blocco, c, m>

Dichiarazione di metodo Method_decl : = Id (Idlist) Blocco <m (idlist) blocco, c, m> mdecl mbind(m, m, (idlist, blocco, c)) 4 come già osservato, l’eventuale overriding è realizzato automaticamente da mbind 12

Dichiarazioni di variabili Var_decl : = Type Id; 4 come già osservato, le dichiarazioni

Dichiarazioni di variabili Var_decl : = Type Id; 4 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 = (Bool | Int | Loc) 4 la relazione di transizione Var_decl * Frame vdecl Frame 13

Dichiarazione di variabile Frame = Id -> Val = (Bool | Int | Loc)

Dichiarazione di variabile Frame = Id -> Val = (Bool | Int | Loc) Var_decl * Frame vdecl Frame <t id , j> vdecl bind(j, id, default(t)) 4 come già osservato, non ci deve essere overriding – id non deve essere definito in j 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 14