Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoSerena Bianchini Modificato 9 anni fa
1
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
2
2 Semantica operazionale 4 modello di esecuzione –importanti soprattutto le strutture che compongono lo stato 4 simile alle strutture a run-time della JVM, che esegue il byte-code prodotto dal compilatore
3
3 Semantica operazionale 4 piu’ orientata all’implementazione –Per esempio le strutture dati che si usano per descrivere lo stato e le transizioni
4
4 Cosa aggiungiamo 4 le gerarchie di classi –trattiamo ereditarietà ed overriding 4 l’attributo “static” per variabili e metodi –esistono variabili e metodi propri della classe, oltre a quelli propri degli oggetti 4 i costruttori –metodi che vengono invocati al momento della creazione di una istanza di classe
5
5 In particolare 4 Espressioni per accedere ai nomi del tipo Path.I variabile Path.I(ListP) chiamata di metodo Path generico (puo’ riferirsi ad un oggetto, una classe, puo’ essere vuoto) Dobbiamo formalizzare delle regole di accesso e ricerca dei nomi abbastanza complicate
6
6 Regole di Visibilita’ dei Nomi 4 Sono quelle verificate staticamente dal compilatore (si chiamano anche regole di scoping) 4 Verifica che ogni accesso ad un nome (di variabile o metodo) sia legale, ovvero il legame tra le dichiarazioni e l’uso dei nomi 4 Sono utilizzate a tempo di esecuzione per cercare le associazioni giuste per i nomi
7
7 Regole di Visibilita’ dei Nomi 4 E’ necessario richiamare le regole di base (le vedremo per bene nella semantica di MP) 4 Sono un po’ piu’ complicate di quelle che avete visto fino ad ora (erano semplificate a scopo didattico) 4 Complicate dalla coesistenza di nomi statici e d’istanza 4 Tralasciamo i vincoli imposti dagli specificatori di accesso (public, private)
8
8 A cosa servono? 4 Stiamo scrivendo un metodo 4 Come facciamo a capire se un accesso del seguente tipo e’ legale? Path.I variabile Path.I(ListP) chiamata di metodo A quale identificatore I mi riferisco? 4 Dove vado a cercare l’associazione giusta?
9
9 Nota E’ complicato perche’ I potrebbe essere statico o d’istanza o potrebbe essere una variabile locale del metodo Dipende dal Path e dal tipo di metodo (statico o d’istanza) in esecuzione
10
10 Cosa puo’ indicare un path? Accesso diretto (path vuoto) I Riferimento ad un oggetto this.I p1.I Riferimento ad una classe BankAccount.I
11
11 Per semplicare 4 Vediamo le regole per le variabili 4 Per i metodi e’ analogo 4 Non trattiamo per ora ereditarieta’
12
12 Path Vuoto I potrebbe essere 4 una variabile locale o un parametro del metodo in esecuzione 4 una variabile che si vede dalla classe c (se il metodo e’ statico di c) 4 una variabile che si vede dall’oggetto l su cui il metodo e’ eseguito (se il metodo e’ d’istanza o e’ un costruttore)
13
13 Cosa e’ visibile da un oggetto? 4 I suoi nomi d’istanza 4 I nomi statici dichiarati nella classe a cui appartiene (perche’ sono condivise tra tutti gli oggetti)
14
14 Esempio public class BankAccount{ private double balance; private int miocodice; private static int codice; } Quali variabili sono direttamente visibili dai metodi d’istanza o dai costruttori della classe?
15
15 Costruttore public BankAccount(double initial){ balance=initial; miocodice=codice; codice++; } Riferimento diretto alla variabile d’istanza miocodice (this non e’ necessario ) si riferisce implicitamente a quella dell’oggetto creato Riferimento diretto alla variabile statica codice che e’ condivisa e visibile tra tutti gli oggetti della classe (Bankaccount non e’ necessario ) Riferimento diretto al parametro
16
16 Cosa e’ visibile da una classe? 4 I suoi nomi statici 4 Non sono visibili nomi d’istanza (sono relativi agli oggetti)
17
17 Esempio public class BankAccount{ private double balance; private int miocodice; private static int codice; } Quali variabili sono direttamente visibili dai metodi statici della classe? Solo la variabili statica codice che appartiene alla classe
18
18 Metodo statico di BankAccount public static void incr(int x){ codice=x; } Accesso diretto alla variabile statica codice che appartiene alla classe del metodo Non potremo accedere direttamente alla variabile d’istanza miocodice (non ci sono oggetti di riferimento)
19
19 Path Classe 4 Vediamo quello che si vede dalla classe 4 Per esempio dal main: BankAccount.codice=1; (accesso legale) BankAccount.balance=1; (accesso illegale)
20
20 Path Oggetto 4 Vediamo quello che si vede dall’oggetto 4 Per esempio dal main: BankAccount p1=new Bankaccount(1000); p1.codice=1; (accesso legale) p1.balance=1; (accesso legale)
21
21 Conclusione 4 La coesistenza di nomi statici e d’istanza complica il linguaggio 4 Cosa succede con l’ereditarieta’?
22
22 Se c1 è una sottoclasse di (estende) c2 le 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 di c1 (a meno di overriding) Semantica informale
23
23 Cosa cambia? 4 Da una classe sono direttamente visibili nell’ordine i propri nomi statici e quelli delle superclassi 4 Di conseguenza: dagli oggetti di una classe sono direttamente visibili nell’ordine i propri nomi statici e quelli delle superclassi
24
24 Semantica statica 4 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 4 semantica semplificata solo per programmi che supererebbero con successo l’analisi statica
25
25 Nota 4 La semantica non e’ completa 4 Tratteremo solo le regole che differiscono da quelle gia’ viste (blocchi, if, while…) 4 Inoltre non consideriamo specificatori di accesso (supponiamo che sia tutto public)
26
26 Lo stato pila di attivazioni –per la valutazione dei metodi –pila dei record di attivazione dei metodi heap –contiene gli oggetti (istanze di classi) ambiente delle classi –contiene le classi dichiarate prima dell’inizio dell’esecuzione
27
27 Ambiente delle classi 4 Cosa deve associare ad ogni classe? 4 le informazioni per accedere alla superclasse (per implementare le regole di visibilita’ dei nomi) 4 le variabili ed metodi statici (condivise da tutti gli oggetti della classe) 4 le informazioni per creare oggetti istanze della classe (quali variabili e metodi d’istanza)
28
28 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
29
29 Sintassi Class_decl := class Id extends Id { Static_var_decl_list Static_meth_decl_list Inst_var_decl_list Inst_meth_decl_list Costruttore } La sintassi del costruttore (sequenza di assegnamenti), non nome non parametri Inoltre assumiamo che ogni classe sia definita come sottoclasse di qualcosa (per default Object)
30
30 Descrizione di classe Cdescr = Id * Frame * Menv * Frame * Menv superclasse variabili statiche metodi statici variabili istanza metodi istanza E’ una quintupla:
31
31 Osservazione 4 Il frame delle variabili statiche e l’ambiente dei metodi statici appartengono alla classe (per esempio il frame contiene il valore effettivo delle variabili etc..) 4 variabili e metodi statici sono condivisi tra tutti gli oggetti istanza della classe
32
32 Osservazione 4 Il frame delle variabili d’istanza e l’ambiente dei metodi d’istanza stanno nella classe solo come “informazione” (non contengono valori, ma verranno utilizzati per creare gli oggetti) 4 variabili e metodi d’istanza sono propri degli oggetti istanza della classe, vanno mantenuti nella descrizione degli oggetti (come vedremo nello heap)
33
33 è una funzione che mantiene associazioni fra –identificatori (di variabili) –valori interi, booleani locazioni (puntatori ad oggetti) 4 è una tabella modificabile (il valore associato ad un identificatore puo’ cambiare)
34
34 Operazioni su frame 4 newframe() crea un frame vuoto l’operazione bind( , i, v) estende inserendo l’associazione tra i e v l’operazione update( , i, v) modifica in l’associazione per i (che deve esistere) l’operazione copy( ) costruisce una copia di l’operazione defined( , i) dice se contiene un’associazione per i per ottenere il valore di una variabile, si applica il frame all’Id, i
35
35 Ambiente di metodi è una funzione da identificatori di metodo a descrizioni di metodo – : Menv –Menv = Id -> Mdescr 4 cos’è una descrizione di metodo?
36
36 Descrizione di metodo 4 deve contenere le informazioni per eseguirlo – lista dei parametri formali –corpo –una informazione per implementare le regole di visibilita’ dei nomi, ovvero per sapere dove andare a cercare gli identificatori
37
37 In particolare 4 manteniamo un puntatore –alla classe (se metodo statico) –all’oggetto a cui appartiene (se metodo d’istanza) 4 Tramite il puntatore potremmo differenziare le regole di ricerca dei nomi nei due casi
38
38 Dichiarazione di metodo: sintassi Method_decl := Id (Idlist) Blocco –ignoriamo i tipi Mdescr = Idlist * Blocco * ( Loc | Id ) parametri formali corpo del metodo puntatore a oggetto nome di classe
39
39 Operazioni sugli ambienti di metodi e di class 4 cemptyenv() costruisce un ambiente di classi “vuoto” cbind(( :Cenv), (i:Id), (c:Cdescr)) estende associando ad i il valore c cdefined( , i) dice se è definita per i 4 memptyenv() costruisce un ambiente di metodi “vuoto” mbind(( :Menv), (i:Id), (m:Mdescr)) estende associando ad i il valore m mdefined( , i) dice se è definita per i instantiate(( :Menv), (l: Loc)) crea un nuovo ambiente diverso da perché tutte le descrizioni di metodi contengono l’oggetto l
40
40 La heap è una funzione da locazioni a descrizioni di istanza (oggetto) – : Heap –Heap = Loc -> Odescr 4 cos’è una descrizione di oggetto?
41
41 Descrizione di oggetto 4 deve contenere puntatore alla classe di appartenenza valore delle variabili d’istanza proprie dell’oggetto le informazioni per eseguire metodi d’istanza e costruttori(le loro descrizioni)
42
42 Descrizione di oggetti è una funzione da locazioni a descrizioni di istanza (oggetto) Odescr = Id * Frame * Menv classevariabili di istanzametodi di istanza
43
43 Osservazione I metodi d’istanza nel modello visto in precedenza erano mantenuti in modo comune a tutti gli oggetti (nella descrizione della classe) erano invocati tramite il puntatore che lega l’oggetto alla classe La modifica semplifica il problema della ricerca dei nomi dovuto alla coesistenza di variabili e metodi statici e d’istanza I metodi d’istanza stanno gia’ nell’oggetto e possono essere trattati in modo uniforme alle variabili d’istanza Il puntatore alla classe servira’ invece per accedere alle variabili ed ai metodi statici
44
44 Operazioni sulla heap 4 newheap() genera una heap vuota newloc( ) genera una nuova locazione in hbind(( :Heap), (l:Loc), (o:Odescr)) estende associando ad l il valore o
45
45 La pila di attivazioni è una pila di records di attivazione di metodi 4 Last In First Out (LIFO) 4 Ogni record di attivazione descrive uno dei metodi annidati che sono in esecuzione 4 Quello al top e’ l’unico attivo 4 Gli altri sono sospesi
46
46 Attivazione/disattivazione 4 Invocazione di metodo: viene messo al top della pila un corrispondente record di attivazione 4 Terminazione di metodo: viene tolto dal top della pila il corrispondente record di attivazione 4 in modo che il record di attivazione del metodo chiamante (metodo che e’ stato sospeso) torni al top della pila, ovvero possa riprendere l’esecuzione
47
47 Record di attivazione 4 il record di attivazione descrive il metodo in esecuzione –oggetto o classe a cui il metodo appartiene –pila di frames (blocchi annidati) che descrivono sia le variabili locali che le associazioni tra parametri formali ed attuali Record = ( Id | Loc ) * Stack(Frame) classeoggettovariabili locali
48
48 Osservazione 4 il puntatore all’oggetto o alla classe indicano se il metodo e’ d’istanza o statico rispettivamente –e’ utilizzato per andare a cercare i nomi in base alle regole di visibilita’
49
49 La pila di attivazioni è una pila di records di attivazione di metodi – : Astack –Astack = Stack (Record) 4 il record di attivazione Record = ( Id | Loc ) * Stack(Frame) classeoggettovariabili locali
50
50 Operazioni sulle pile ( di record o frame) emptystack() genera una pila vuota top(( :Stack(x)) restituisce l’elemento di tipo x in testa a pop(( :Stack(x)) modifica eliminando l’elemento in testa push(( :Stack(x),(e:x)) modifica inserendo l’elemento e in testa empty(( :Stack(x)) verifica se è vuota
51
51 Uno stato (1) 4 Ambiente delle 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
52
52 Osservazioni 4 la classe C e’ sottoclasse di A 4 Il frame delle variabili statiche contiene i valori attuali delle variabili 4 L’ambiente dei metodi statici contiene le descrizioni dei metodi (puntano a C) 4 La parte che descrive variabili e metodi d’istanza (incluso il costruttore) e’ un prototipo (valori ?), servono per creare gli oggetti
53
53 Uno stato (2) 4 Pila e heap (è in esecuzione il metodo d’istanza f4 di una istanza di C) C d e 3 f3 C () (x) () f4 puntatori al codice dei metodi stack x heap
54
54 Osservazioni 4 I valori delle variabili d’istanza dell’oggetto stanno nello heap 4 La descrizione dei metodi d’istanza sta nello heap (puntano all’oggetto stesso, quando verranno chiamati manterranno il puntatore) 4 Il costruttore e’ trattato come un metodo d’istanza
55
55 Cosa si “vede” in questo stato 4 tutti i nomi delle classi –attraverso queste, le variabili ed i metodi statici C d e 3 f3 C () (x) () f4 puntatori al codice dei metodi stack x heap
56
56 Da un oggetto sono direttamente visibili solo i propri nomi d’istanza (inclusi quelli ereditati) e la classe; tramite questa le variabili statiche sue e delle superclassi I metodi d’istanza hanno la visibilita’ dell’oggetto su cui sono eseguiti (vedi f4) Ricordiamo (visibilita’ dei nomi)
57
57 4 nomi di variabili (nell’ordine) –stack locale (per esempio x) –frame dell’oggetto a cui appartiene il metodo (per esempio la sua varibile d’istanza d) –frames (statici) della classe C e delle superclassi (per esempio la varibile statica a della classe C) 4 come vi accediamo? –Direttamente dal record di attivazione –Tramite il puntatore dal record all’oggetto nello heap –Tramite il puntatore dall’oggetto alla sua classe e poi la catena di puntatori tra classi
58
58 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
59
59 Se fosse in esecuzione un metodo statico (per esempio f1della classe C) il suo record di attivazione al top dello stack punterebbe alla classe C In questo caso potremmo vedere stack locale frames (statici) della classe C e delle superclassi Metodi statici 4 come vi accediamo? –Direttamente dal record di attivazione –Tramite il puntatore dal record alla sua classe ed la catena di puntatori alle superclassi
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.