Semantica Operazionale di un frammento di Java lo

  • Slides: 42
Download presentation
Semantica Operazionale di un frammento di Java: lo stato 1

Semantica Operazionale di un frammento di Java: lo stato 1

Lo stato ü ci interessa capire la struttura dello stato ü per esempio le

Lo stato ü ci interessa capire la struttura dello stato ü per esempio le strutture dati che si usano per descrivere lo stato e le transizioni 4 simile alle strutture a run-time della JVM, che esegue il byte-code prodotto dal compilatore – non vedremo le regole di transizione formali, vedremo quello che e’ diverso rispetto ai linguaggi imperativi, tipo C 2

In particolare ü le classi e gli oggetti ü variabili e metodi statici ü

In particolare ü le classi e gli oggetti ü variabili e metodi statici ü variabili e metodi d’istanza ü la ricerca dei nomi, identificatori di variabile e metodi (complicate non esiste un ambiente globale) 3

Semplificando 4 nella formalizzazione cercheremo di capire alcuni aspetti legati alla semantica statica –

Semplificando 4 nella formalizzazione cercheremo di capire alcuni aspetti legati alla semantica statica – in particolare, quelli che darebbero origine a messaggi di errore durante la compilazione 4 Non consideriamo gli specificatori di accesso (supponiamo che sia tutto public) 4

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 5

Ambiente delle classi r 4 Quali informazioni dobbiamo memorizzare? 4 le variabili statiche dichiarate

Ambiente delle classi r 4 Quali informazioni dobbiamo memorizzare? 4 le variabili statiche dichiarate nella classe, con il relativo valore 4 i metodi statici dichiarati nella classe 4 sono condivise da tutti gli oggetti della classe 4 il valore delle variabili statiche verra’ eventualmente modificato durante l’esecuzione del programma 6

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

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

Sintassi Class_decl : = class 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 il costruttore si tratta come un metodo d’istanza 8

Descrizione di classe Cdescr = Frame * Menv variabili istanza variabili statiche metodi istanza

Descrizione di classe Cdescr = Frame * Menv variabili istanza variabili statiche metodi istanza metodi statici 9

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 4 viene creato prima dell’esecuzione del programma 10

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

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

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? 12

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 del metodo 13

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

Dichiarazione di metodo: sintassi Method_decl : = Id (Idlist) Blocco – ignorando i tipi Mdescr = Idlist * Blocco parametri formali corpo del metodo 14

public class A { public static int x; public int y; public static void

public class A { public static int x; public int y; public static void set (int i) C_set public A metodo 1 (A o) C_1 {y=x+1; } } public class B { public static int x; public int z; public int y; public void metodo 2 (int i) C_2 {z=3; y=z+1; z=5; } } public class Princ { public static void main() C_m} 15

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

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

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

Descrizione di oggetto 4 deve contenere § il 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) 17

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 18

Al momento della new 4 creo una locazione nuova nello heap 4 nella descrizione

Al momento della new 4 creo una locazione nuova nello heap 4 nella descrizione dell’oggetto metto – il nome della classe – viene creato del frame delle variabili di istanza (dalla dichiarazione classe – viene creato l’ambiente dei metodi di istanza (dalla dichiarazione classe) 4 Valuto il costruttore come un metodo d’istanza sull’oggetto 19

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 20

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 21

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 22

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’ 4 il puntatore e’ fondamentale per gestire la semantica differente di metodi statici e metodi d’istanza 23

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 24

A cosa servono queste informazioni? • dobbiamo implemenatre le regole di visibilita’ e ricerca

A cosa servono queste informazioni? • dobbiamo implemenatre le regole di visibilita’ e ricerca dei nomi ---nomi di variabili (per modificarle o leggerne il valore – nomi di metodi (per eseguire le chiamte di metodo) • dove si cercano? Ambiente delle classi, oggetti, record si attivazione sulla pila? • non esiste una informazione globale 25

Ricordiamo che. . . 4 Espressioni per accedere ai nomi del tipo Path. I

Ricordiamo che. . . 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) 26

Ricerca dei nomi • Dobbiamo capire le regole di accesso e ricerca dei nomi

Ricerca dei nomi • Dobbiamo capire le regole di accesso e ricerca dei nomi • la semantica formale di espressioni e comandie’ poi la solita. . . • esempio, assegnamento o valutazione del valore di una espressione this. x=10; y=this. x+1; 27

Path Id ACCESSO AL NOME Id variabile Le regole per l’accesso al valore di

Path Id ACCESSO AL NOME Id variabile Le regole per l’accesso al valore di una variabile sono complicate, la ricerca dipende da §il metodo correntemente in esecuzione §La classe a cui appartiene il metodo (se statico) §L’oggetto a cui appartiene il metodo (se d’istanza) §Dal significato di Path 28

Per valutare Path Id q. Dobbiamo valutare Path a partire dal metodo corrente q.

Per valutare Path Id q. Dobbiamo valutare Path a partire dal metodo corrente q. Puo’ indicare § Ide (una classe) • Loc (un oggetto) • metodo corrente (se il path e’ vuoto) indicato da q. Dobbiamo cercare il valore di Id a partire dal risultato indicato dal path 29

Risoluzione di nomi di variabile 4 il riferimento ad un identificatore può in generale

Risoluzione di nomi di variabile 4 il riferimento ad un identificatore può in generale essere risolto – nella pila di frames sulla testa dello stack delle attivazioni – nei frames delle variabili di istanza di un oggetto – nei frames di variabili statiche di una classe 4 il modo di effettuare la ricerca dipende da dove essa inizia – un metodo (quello correntemente attivo) – un oggetto – una classe 30

Da una Classe: nell’ordine 4 se il path indica una classe 4 si cerca

Da una Classe: nell’ordine 4 se il path indica una classe 4 si cerca nelle sue variabili statiche (ambiente delle classi) 4 non sono visibili nomi d’istanza 31

Da un oggetto: nell’ordine 4 Variabili d’istanza (nella descrizione dell’oggetto nella heap) 4 Altrimenti

Da un oggetto: nell’ordine 4 Variabili d’istanza (nella descrizione dell’oggetto nella heap) 4 Altrimenti si passa alla classe tramite il puntatatore 32

Dal metodo corrente (path vuoto): nell’ordine ü Stack locale (nel record d’attivazione al top

Dal metodo corrente (path vuoto): nell’ordine ü Stack locale (nel record d’attivazione al top della pila) ü Altrimenti si passa alla classe o all’oggetto a cui il metodo appartiene tramite il puntatore nel record di attivazione • in questo modo da un metodo statico si ha la visibilita’ della classe in cui e’ dichiarato • in questo modo da un metodo d’istanza si ha la visibilita’ dell’oggetto su cui e’ eseguito 33

Invocazione di metodi Path Id (Expr_list) 4 Ricercare la descrizione del metodo associata Path

Invocazione di metodi Path Id (Expr_list) 4 Ricercare la descrizione del metodo associata Path Id (simile alla ricerca dei nomi di variabili) 4 Creare il record di attivazione da mettere al top della pila 4 Valutare il corpo del metodo 4 Rimuovere il record di attivazione 34

Ricerca dei nomi: metodi 4 Simile alla ricerca dei nomi di variabili 4 Unica

Ricerca dei nomi: metodi 4 Simile alla ricerca dei nomi di variabili 4 Unica differenza: non si cerca nello stack dei frames locali (non ci sono dichiarazioni di metodi annidate) 4 I metodi stanno nelle classi (se statici) o negli oggetti (se d’istanza) 4 La ricerca inizia dal risultato della valutazione del path 35

Invocazione di metodi: commenti 4 dopo avere trovato la descrizione del metodo 4 si

Invocazione di metodi: commenti 4 dopo avere trovato la descrizione del metodo 4 si valuta il parametro attuale 4 si crea un nuovo stack di frames, il cui unico frame contiene l’associazione tra parametro formale e valore del parametro attuale 4 si pusha sulla pila il record che contiene la classe o l’oggetto associato al metodo e la pila di frames 4 si valuta il corpo del metodo 4 Quando termina si elimina il record di attivazione 36

public class A { public static int x; public int y; public static void

public class A { public static int x; public int y; public static void set (int i){ x=x+i; } public A metodo 1 (A o) {o. y=y+x+1; y=y+1; return o; } {y=x+1; } } 37

public class B { public static int x; public int z; public int y;

public class B { public static int x; public int z; public int y; public void metodo 2 (int i) { int z=this. z; this. z=y+3+z; } {z=3; y=z+1; z=5; } } 38

public class Princ { public static void main(){ A. set(3); A p 1=new A();

public class Princ { public static void main(){ A. set(3); A p 1=new A(); A p 2=new A(); p 1=p 1. metodo 1(p 2); B p 3=new B(); B. x=4; p 3. metodo 2(6); } 39

Il naming 4 naming – tutti gli usi di nomi all’interno dei metodi (inclusi

Il naming 4 naming – tutti gli usi di nomi all’interno dei metodi (inclusi quelli usati nei paths) • variabili locali, variabili di istanza, variabili statiche, metodi di istanza, metodi statici sono staticamente controllati per verificarne l’esistenza in accordo con le regole di visibilità • quelle che abbiamo “implementato” nei vari meccanismi di naming 4 le regole di visibilità tengono anche conto degli attributi private, public, protected 4 il meccanismo dei packages (con esportazioni ed importazioni) – serve per raggruppare insiemi di classi introduce ulteriori restrizioni 40

public class A { private static int x; private int y; public static void

public class A { private static int x; private int y; public static void set (int i){ x=y+i; } public A metodo 1 (A o) {o. y=y+x+1; y=y+1; return o; } {y=x+1; } } 41

public class B { public static int x; public int z; public int y;

public class B { public static int x; public int z; public int y; public void metodo 2 (int i) { int z=this. z + A. x; B w=new B(); w. y=z; w. x=3; } {z=3; y=z+1; z=5; } } 42