Semantica Operazionale di un frammento di Java intro

  • Slides: 59
Download presentation
Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella

Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | 1

Semantica operazionale 4 modello di esecuzione – importanti soprattutto le strutture che compongono lo

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 2

Semantica operazionale 4 piu’ orientata all’implementazione – Per esempio le strutture dati che si

Semantica operazionale 4 piu’ orientata all’implementazione – Per esempio le strutture dati che si usano per descrivere lo stato e le transizioni 3

Cosa aggiungiamo 4 le gerarchie di classi – trattiamo ereditarietà ed overriding 4 l’attributo

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 4

In particolare 4 Espressioni per accedere ai nomi del tipo Path. I variabile Path.

In particolare 4 Espressioni per accedere ai nomi del tipo Path. I variabile Path. I(List. P) 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 5

Regole di Visibilita’ dei Nomi 4 Sono quelle verificate staticamente dal compilatore (si chiamano

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 6

Regole di Visibilita’ dei Nomi 4 E’ necessario richiamare le regole di base (le

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) 7

A cosa servono? 4 Stiamo scrivendo un metodo 4 Come facciamo a capire se

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(List. P) chiamata di metodo 4 A quale identificatore I mi riferisco? 4 Dove vado a cercare l’associazione giusta? 8

Nota 4 E’ complicato perche’ I potrebbe essere statico o d’istanza o potrebbe essere

Nota 4 E’ complicato perche’ I potrebbe essere statico o d’istanza o potrebbe essere una variabile locale del metodo 4 Dipende dal Path e dal tipo di metodo (statico o d’istanza) in esecuzione 9

Cosa puo’ indicare un path? 4 Accesso diretto (path vuoto) I • Riferimento ad

Cosa puo’ indicare un path? 4 Accesso diretto (path vuoto) I • Riferimento ad un oggetto this. I p 1. I • Riferimento ad una classe Bank. Account. I 10

Per semplicare 4 Vediamo le regole per le variabili 4 Per i metodi e’

Per semplicare 4 Vediamo le regole per le variabili 4 Per i metodi e’ analogo 4 Non trattiamo per ora ereditarieta’ 11

Path Vuoto 4 I potrebbe essere 4 una variabile locale o un parametro del

Path Vuoto 4 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) 12

Cosa e’ visibile da un oggetto? 4 I suoi nomi d’istanza 4 I nomi

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) 13

Esempio public class Bank. Account{ private double balance; private int miocodice; private static int

Esempio public class Bank. Account{ private double balance; private int miocodice; private static int codice; } • Quali variabili sono direttamente visibili dai metodi d’istanza o dai costruttori della classe? 14

Costruttore public Bank. Account(double initial){ balance=initial; miocodice=codice; codice++; } • Riferimento diretto alla variabile

Costruttore public Bank. Account(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 15

Cosa e’ visibile da una classe? 4 I suoi nomi statici 4 Non sono

Cosa e’ visibile da una classe? 4 I suoi nomi statici 4 Non sono visibili nomi d’istanza (sono relativi agli oggetti) 16

Esempio public class Bank. Account{ private double balance; private int miocodice; private static int

Esempio public class Bank. Account{ 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 17

Metodo statico di Bank. Account public static void incr(int x){ codice=x; } • Accesso

Metodo statico di Bank. Account 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) 18

Path Classe 4 Vediamo quello che si vede dalla classe 4 Per esempio dal

Path Classe 4 Vediamo quello che si vede dalla classe 4 Per esempio dal main: Bank. Account. codice=1; (accesso legale) Bank. Account. balance=1; (accesso illegale) 19

Path Oggetto 4 Vediamo quello che si vede dall’oggetto 4 Per esempio dal main:

Path Oggetto 4 Vediamo quello che si vede dall’oggetto 4 Per esempio dal main: Bank. Account p 1=new Bankaccount(1000); p 1. codice=1; (accesso legale) p 1. balance=1; (accesso legale) 20

Conclusione 4 La coesistenza di nomi statici e d’istanza complica il linguaggio 4 Cosa

Conclusione 4 La coesistenza di nomi statici e d’istanza complica il linguaggio 4 Cosa succede con l’ereditarieta’? 21

Semantica informale Se c 1 è una sottoclasse di (estende) c 2 • le

Semantica informale Se c 1 è una sottoclasse di (estende) c 2 • le variabili e metodi statici di c 2 (e delle superclassi) sono visibili direttamente da c 1 • variabili e metodi di istanza di c 2 (e delle superclassi) diventano anche variabili e metodi di istanza di c 1 (a meno di overriding) 22

Cosa cambia? 4 Da una classe sono direttamente visibili nell’ordine i propri nomi statici

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 23

Semantica statica 4 nella formalizzazione trascuriamo tutti gli aspetti legati alla semantica statica –

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 24

Nota 4 La semantica non e’ completa 4 Tratteremo solo le regole che differiscono

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) 25

Lo stato 4 pila di attivazioni s – per la valutazione dei metodi –

Lo stato 4 pila di attivazioni s – per la valutazione dei metodi – pila dei record di attivazione dei metodi 4 heap z – contiene gli oggetti (istanze di classi) 4 ambiente delle classi r – contiene le classi dichiarate prima dell’inizio dell’esecuzione 26

Ambiente delle classi r 4 Cosa deve associare ad ogni classe? 4 le informazioni

Ambiente delle classi r 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) 27

Ambiente delle classi r 4 r è una funzione da identificatori di classe a

Ambiente delle classi r 4 r è una funzione da identificatori di classe a descrizioni di classe – r : Cenv – Cenv = Id -> Cdescr 4 cos’è una descrizione di classe? 4 vediamo prima la sintassi (semplificata) che usiamo per le dichiarazioni di classe 28

Sintassi Class_decl : = class Id extends Id { Static_var_decl_list Static_meth_decl_list Inst_var_decl_list Inst_meth_decl_list Costruttore

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 29 sottoclasse di qualcosa (per default Object)

Descrizione di classe E’ una quintupla: Cdescr = Id * Frame * Menv superclasse

Descrizione di classe E’ una quintupla: Cdescr = Id * Frame * Menv superclasse variabili istanza variabili statiche metodi istanza metodi statici 30

Osservazione 4 Il frame delle variabili statiche e l’ambiente dei metodi statici appartengono alla

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 31

Osservazione 4 Il frame delle variabili d’istanza e l’ambiente dei metodi d’istanza stanno nella

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) 32

4 è una funzione j che mantiene associazioni fra – identificatori (di variabili) –

4 è una funzione j 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) 33

Operazioni su frame 4 newframe() crea un frame vuoto 4 l’operazione bind(j, i, v)

Operazioni su frame 4 newframe() crea un frame vuoto 4 l’operazione bind(j, i, v) estende j inserendo l’associazione tra i e v 4 l’operazione update(j, i, v) modifica in j l’associazione per i (che deve esistere) 4 l’operazione copy(j) costruisce una copia di j 4 l’operazione defined(j, i) dice se j contiene un’associazione per i 4 per ottenere il valore di una variabile, si applica il frame all’Id, j(i) 34

Ambiente di metodi m 4 m è una funzione da identificatori di metodo a

Ambiente di metodi m 4 m è una funzione da identificatori di metodo a descrizioni di metodo – m : Menv – Menv = Id -> Mdescr 4 cos’è una descrizione di metodo? 35

Descrizione di metodo 4 deve contenere le informazioni per eseguirlo – lista dei parametri

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 36

In particolare 4 manteniamo un puntatore – alla classe (se metodo statico) – all’oggetto

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 37

Dichiarazione di metodo: sintassi Method_decl : = Id (Idlist) Blocco – ignoriamo i tipi

Dichiarazione di metodo: sintassi Method_decl : = Id (Idlist) Blocco – ignoriamo i tipi Mdescr = Idlist * Blocco * ( Loc | Id ) parametri formali corpo del metodo nome di classe puntatore a oggetto 38

Operazioni sugli ambienti di metodi e di class 4 cemptyenv() costruisce un ambiente di

Operazioni sugli ambienti di metodi e di class 4 cemptyenv() costruisce un ambiente di classi “vuoto” 4 cbind((r: Cenv), (i: Id), (c: Cdescr)) estende r associando ad 4 4 4 i il valore c cdefined(r, i) dice se r è definita per i memptyenv() costruisce un ambiente di metodi “vuoto” mbind((m: Menv), (i: Id), (m: Mdescr)) estende m associando ad i il valore m mdefined(m, i) dice se m è definita per i instantiate((m: Menv), (l: Loc)) crea un nuovo ambiente m 1 diverso da m perché tutte le descrizioni di metodi 39 contengono l’oggetto l

La heap z 4 z è una funzione da locazioni a descrizioni di istanza

La heap z 4 z è una funzione da locazioni a descrizioni di istanza (oggetto) – z : Heap – Heap = Loc -> Odescr 4 cos’è una descrizione di oggetto? 40

Descrizione di oggetto 4 deve contenere § puntatore alla classe di appartenenza § valore

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) 41

Descrizione di oggetti 4 z è una funzione da locazioni a descrizioni di istanza

Descrizione di oggetti 4 z è una funzione da locazioni a descrizioni di istanza (oggetto) Odescr = Id * Frame * Menv classe variabili di istanza metodi di istanza 42

Osservazione I metodi d’istanza nel modello visto in precedenza ü erano mantenuti in modo

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 43

Operazioni sulla heap 4 newheap() genera una heap vuota 4 newloc(z) genera una nuova

Operazioni sulla heap 4 newheap() genera una heap vuota 4 newloc(z) genera una nuova locazione in z 4 hbind((z: Heap), (l: Loc), (o: Odescr)) estende z associando ad l il valore o 44

La pila di attivazioni s 4 s è una pila di records di attivazione

La pila di attivazioni s 4 s è 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 45

Attivazione/disattivazione 4 Invocazione di metodo: viene messo al top della pila un corrispondente record

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 46

Record di attivazione 4 il record di attivazione descrive il metodo in esecuzione –

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) classe oggetto variabili locali 47

Osservazione 4 il puntatore all’oggetto o alla classe indicano se il metodo e’ d’istanza

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’ 48

La pila di attivazioni s 4 s è una pila di records di attivazione

La pila di attivazioni s 4 s è una pila di records di attivazione di metodi – s : Astack – Astack = Stack (Record) 4 il record di attivazione Record = ( Id | Loc ) * Stack(Frame) classe oggetto variabili locali 49

Operazioni sulle pile ( di record o frame) 4 emptystack() genera una pila vuota

Operazioni sulle pile ( di record o frame) 4 emptystack() genera una pila vuota 4 top((p: Stack(x)) restituisce l’elemento di tipo x in testa a p 4 pop((p: Stack(x)) modifica p eliminando l’elemento in testa 4 push((p: Stack(x), (e: x)) modifica p inserendo l’elemento e in testa 4 empty((p: Stack(x)) verifica se p è vuota 50

Uno stato (1) puntatore ad oggetto codice blocco f 1 codice blocco f 2

Uno stato (1) puntatore ad oggetto codice blocco f 1 codice blocco f 2 codice blocco f 3 C A a 23 f 1 (y, z) C b c 5 f 2 (w) C d ? e ? f 3 () f 4 (x) ? ? C () ? codice blocco f 4 codice blocco C B A Object 4 Ambiente delle classi 51

Osservazioni 4 la classe C e’ sottoclasse di A 4 Il frame delle variabili

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 52

Uno stato (2) x d 3 e C f 3 () f 4 (x)

Uno stato (2) x d 3 e C f 3 () f 4 (x) C () stack heap puntatori al codice dei metodi 4 Pila e heap (è in esecuzione il metodo d’istanza f 4 di una istanza di C) 53

Osservazioni 4 I valori delle variabili d’istanza dell’oggetto stanno nello heap 4 La descrizione

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 54

Cosa si “vede” in questo stato x d 3 e C f 3 ()

Cosa si “vede” in questo stato x d 3 e C f 3 () f 4 (x) C () stack heap puntatori al codice dei metodi 4 tutti i nomi delle classi – attraverso queste, le variabili ed i metodi statici 55

Ricordiamo (visibilita’ dei nomi) • Da un oggetto sono direttamente visibili solo i propri

Ricordiamo (visibilita’ dei nomi) • 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 f 4) 56

4 nomi di variabili (nell�� ’ordine) –stack locale (per esempio x) –frame dell’oggetto a

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 57

Cosa si “vede” in questo stato x d 3 e C f 3 ()

Cosa si “vede” in questo stato x d 3 e C f 3 () f 4 (x) C () stack heap 4 nomi di metodi (nell�� ’ordine) puntatori al codice dei metodi – ambiente di metodi dell’oggetto a cui appartiene il metodo • lui incluso (ricorsione) – ambienti di metodi (statici) lungo la catena di sottoclassi 58

Metodi statici • Se fosse in esecuzione un metodo statico (per esempio f 1

Metodi statici • Se fosse in esecuzione un metodo statico (per esempio f 1 della 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 4 come vi accediamo? –Direttamente dal record di attivazione –Tramite il puntatore dal record alla sua classe ed la catena di puntatori alle superclassi 59