Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoOliviero Pucci Modificato 9 anni fa
1
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
2 Regole di transizione 4 regole che ci dicono come viene modificato uno stato per effetto dell’esecuzione di un certo costrutto del linguaggio 4 diverse relazioni di transizione, in corrispondenza dei diversi tipi di costrutti del linguaggio –espressioni, comandi, dichiarazioni ecc.
3
3 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
4
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
5 Ereditarietà 4 se c1 è una sottoclasse (estende) c2 –variabili e metodi statici di c2 (e delle sue superclassi) sono visibili direttamente da c1 –variabili e metodi di istanza di c2 (e delle sue superclassi) diventano anche variabili e metodi di istanza degli oggetti di c1 4 a meno di overriding
6
6 Overriding 4 se c1 è una sottoclasse (estende) c2 –un metodo di istanza di c2 (e delle sue superclassi) può essere ridefinito (stesso nome e tipi) in c1 –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
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 –in tutti e due i casi, l’inizializzazione può riguardare anche le superclassi 4 per semplicità, decidiamo di non avere inizializzazioni nelle dichiarazioni di variabile all’interno di classi 4 per questo ci aspettiamo che esista sempre un costruttore –eseguito quando si crea un’istanza
8
8 Il costruttore 4 i costruttori sono usati per la vera inizializzazione delle 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
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 Class_decl * Cenv cdecl Cenv
10
10 Dichiarazione di classe Cenv = Id -> Cdescr Cdescr = Id * Frame * Menv * Frame* Menv Class_decl * Cenv cdecl Cenv (b) = (_,_,_, , ) (b) = (_, c1, _) vdecl 1 vdecl 2 mdecl 1 mdecl 2 ________________________________________________ cdecl cbind( , a, (b, 1, 1, 2, mbind( 2, a, ([], c1 c, a))))
11
11 Commenti (b) = (_,_,_, , ) (b) = (_,c1,_) vdecl 1 vdecl 2 mdecl 1 mdecl 2 ________________________________________________ cdecl cbind( , a, (b, 1, 1, 2, mbind( 2, a, ([], c1 c, a)))) 4 il frame delle variabili di istanza viene costruito a partire da una copia di quello della superclasse –i frames sono strutture modificabili –è necessario costruire la copia 4 l’ambiente dei metodi di istanza viene costruito a partire da quello della superclasse –gli ambienti di metodi sono funzioni –l’eventuale overriding è realizzato automaticamente da mbind 4 il costruttore è ottenuto componendo (sintatticamente) il corpo del costruttore della superclasse con quello “nuovo”
12
12 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 Method_decl * Id * Menv mdecl Menv
13
13 Dichiarazione di metodo Menv = Id -> Mdescr Mdescr = Idlist * Blocco * ( Loc | Id ) Method_decl * Id * Menv mdecl Menv mdecl mbind( , m, (idlist, blocco, c)) 4 come già osservato, l’eventuale overriding è realizzato automaticamente da mbind
14
14 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 Var_decl * Frame vdecl Frame
15
15 Dichiarazione di variabile Frame = Id -> Val Val = (Bool | Int | Loc) Var_decl * Frame vdecl Frame 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 –bind 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
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.