42
1 Semantica Operazionale di un frammento di Java: lo stato

1 Semantica Operazionale di un frammento di Java: lo stato

Embed Size (px)

Citation preview

Page 1: 1 Semantica Operazionale di un frammento di Java: lo stato

1

Semantica Operazionale di un frammento di Java: lo stato

Page 2: 1 Semantica Operazionale di un frammento di Java: lo stato

2

Lo stato

ci interessa capire la struttura dello stato per esempio le strutture dati che si usano per

descrivere lo stato e le transizioni 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

Page 3: 1 Semantica Operazionale di un frammento di Java: lo stato

3

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)

Page 4: 1 Semantica Operazionale di un frammento di Java: lo stato

4

Semplificando

nella formalizzazione cercheremo di capire alcuni aspetti legati alla semantica statica– in particolare, quelli che darebbero origine a

messaggi di errore durante la compilazione

Non consideriamo gli specificatori di accesso (supponiamo che sia tutto public)

Page 5: 1 Semantica Operazionale di un frammento di Java: lo stato

5

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

Page 6: 1 Semantica Operazionale di un frammento di Java: lo stato

6

Ambiente delle classi

Quali informazioni dobbiamo memorizzare?

le variabili statiche dichiarate nella classe, con il relativo valore

i metodi statici dichiarati nella classe

sono condivise da tutti gli oggetti della classe il valore delle variabili statiche verra’

eventualmente modificato durante l’esecuzione del programma

Page 7: 1 Semantica Operazionale di un frammento di Java: lo stato

7

Ambiente delle classi

è una funzione da identificatori di classe a descrizioni di classe – : Cenv

– Cenv = Id -> Cdescr

cos’è una descrizione di classe?

Page 8: 1 Semantica Operazionale di un frammento di Java: lo stato

8

Sintassi

Class_decl := class Id {Static_var_decl_listStatic_meth_decl_listInst_var_decl_listInst_meth_decl_listCostruttore }

•La sintassi del costruttore (sequenza di assegnamenti),

non nome non parametri

il costruttore si tratta come un metodo d’istanza

Page 9: 1 Semantica Operazionale di un frammento di Java: lo stato

9

Descrizione di classe

Cdescr = Frame * Menv

variabili statiche

metodi statici

variabili istanza

metodi istanza

Page 10: 1 Semantica Operazionale di un frammento di Java: lo stato

10

Osservazione

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

variabili e metodi statici sono condivisi tra tutti gli oggetti istanza della classe

viene creato prima dell’esecuzione del programma

Page 11: 1 Semantica Operazionale di un frammento di Java: lo stato

11

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

• interi, booleani • locazioni (puntatori ad oggetti)

è una tabella modificabile (il valore associato ad un identificatore puo’ cambiare)

Frame

Page 12: 1 Semantica Operazionale di un frammento di Java: lo stato

12

Ambiente di metodi

è una funzione da identificatori di metodo a descrizioni di metodo – : Menv

– Menv = Id -> Mdescr

cos’è una descrizione di metodo?

Page 13: 1 Semantica Operazionale di un frammento di Java: lo stato

13

Descrizione di metodo

deve contenere le informazioni per eseguirlo– lista dei parametri formali– corpo del metodo

Page 14: 1 Semantica Operazionale di un frammento di Java: lo stato

14

Dichiarazione di metodo: sintassi

Method_decl := Id (Idlist) Blocco– ignorando i tipi

Mdescr = Idlist * Blocco

parametri formali

corpo del metodo

Page 15: 1 Semantica Operazionale di un frammento di Java: lo stato

15

public class A { public static int x; public int y; public static void set (int i) C_set public A metodo1 (A o) C_1 {y=x+1;} }

public class B { public static int x; public int z; public int y; public void metodo2 (int i) C_2 {z=3; y=z+1; z=5;} }

public class Princ { public static void main() C_m}

Page 16: 1 Semantica Operazionale di un frammento di Java: lo stato

16

La heap

è una funzione da locazioni a descrizioni di oggetto– : Heap – Heap = Loc -> Odescr

cos’è una descrizione di oggetto?

Page 17: 1 Semantica Operazionale di un frammento di Java: lo stato

17

Descrizione di oggetto

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)

Page 18: 1 Semantica Operazionale di un frammento di Java: lo stato

18

Descrizione di oggetti

è una funzione da locazioni a descrizioni di istanza (oggetto)

Odescr = Id * Frame * Menv

classe variabili di istanza metodi di istanza

Page 19: 1 Semantica Operazionale di un frammento di Java: lo stato

19

Al momento della new

creo una locazione nuova nello heap 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)

Valuto il costruttore come un metodo d’istanza sull’oggetto

Page 20: 1 Semantica Operazionale di un frammento di Java: lo stato

20

La pila di attivazioni

è una pila di records di attivazione di metodi Last In First Out (LIFO) Ogni record di attivazione descrive uno dei metodi

annidati che sono in esecuzione Quello al top e’ l’unico attivo Gli altri sono sospesi

Page 21: 1 Semantica Operazionale di un frammento di Java: lo stato

21

Attivazione/disattivazione

Invocazione di metodo: viene messo al top della pila un corrispondente record di attivazione

Terminazione di metodo: viene tolto dal top della pila il corrispondente record di attivazione

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

Page 22: 1 Semantica Operazionale di un frammento di Java: lo stato

22

Record di attivazione

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

Page 23: 1 Semantica Operazionale di un frammento di Java: lo stato

23

Osservazione

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’ il puntatore e’ fondamentale per gestire la semantica

differente di metodi statici e metodi d’istanza

Page 24: 1 Semantica Operazionale di un frammento di Java: lo stato

24

La pila di attivazioni

è una pila di records di attivazione di metodi – : Astack

– Astack = Stack (Record)

il record di attivazione

Record = ( Id | Loc ) * Stack(Frame)

classe oggetto variabili locali

Page 25: 1 Semantica Operazionale di un frammento di Java: lo stato

25

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

Page 26: 1 Semantica Operazionale di un frammento di Java: lo stato

26

Ricordiamo che...

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)

Page 27: 1 Semantica Operazionale di un frammento di Java: lo stato

27

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;

Page 28: 1 Semantica Operazionale di un frammento di Java: lo stato

28

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 esecuzioneLa classe a cui appartiene il metodo (se statico)L’oggetto a cui appartiene il metodo (se d’istanza)

Dal significato di Path

Page 29: 1 Semantica Operazionale di un frammento di Java: lo stato

29

Per valutare Path Id

Dobbiamo valutare Path a partire dal metodo correntePuo’ indicare Ide (una classe)•Loc (un oggetto)•metodo corrente (se il path e’ vuoto) indicato da

Dobbiamo cercare il valore di Id a partire dal risultato indicato dal path

Page 30: 1 Semantica Operazionale di un frammento di Java: lo stato

30

Risoluzione di nomi di variabile

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

il modo di effettuare la ricerca dipende da dove essa inizia– un metodo (quello correntemente attivo)– un oggetto– una classe

Page 31: 1 Semantica Operazionale di un frammento di Java: lo stato

31

Da una Classe: nell’ordine

se il path indica una classe si cerca nelle sue variabili statiche (ambiente delle classi) non sono visibili nomi d’istanza

Page 32: 1 Semantica Operazionale di un frammento di Java: lo stato

32

Da un oggetto:nell’ordine

Variabili d’istanza (nella descrizione dell’oggetto nella heap)

Altrimenti si passa alla classe tramite il puntatatore

Page 33: 1 Semantica Operazionale di un frammento di Java: lo stato

33

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

Page 34: 1 Semantica Operazionale di un frammento di Java: lo stato

34

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

Page 35: 1 Semantica Operazionale di un frammento di Java: lo stato

35

Ricerca dei nomi: metodi

Simile alla ricerca dei nomi di variabili

Unica differenza: non si cerca nello stack dei frames locali (non ci sono dichiarazioni di metodi annidate)

I metodi stanno nelle classi (se statici) o negli oggetti (se d’istanza)

La ricerca inizia dal risultato della valutazione del path

Page 36: 1 Semantica Operazionale di un frammento di Java: lo stato

36

Invocazione di metodi: commenti

dopo avere trovato la descrizione del metodo si valuta il parametro attuale si crea un nuovo stack di frames, il cui unico frame

contiene l’associazione tra parametro formale e valore del parametro attuale

si pusha sulla pila il record che contiene la classe o l’oggetto associato al metodo e la pila di frames

si valuta il corpo del metodo Quando termina si elimina il record di attivazione

Page 37: 1 Semantica Operazionale di un frammento di Java: lo stato

37

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

Page 38: 1 Semantica Operazionale di un frammento di Java: lo stato

38

public class B { public static int x; public int z; public int y; public void metodo2 (int i) { int z=this.z; this.z=y+3+z;}

{z=3; y=z+1; z=5;} }

Page 39: 1 Semantica Operazionale di un frammento di Java: lo stato

39

public class Princ { public static void main(){

A.set(3);A p1=new A();A p2=new A();p1=p1.metodo1(p2);B p3=new B();B.x=4;p3.metodo2(6);}

}

Page 40: 1 Semantica Operazionale di un frammento di Java: lo stato

40

Il naming

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

le regole di visibilità tengono anche conto degli attributi private, public, protected

il meccanismo dei packages (con esportazioni ed importazioni) – serve per raggruppare insiemi di classi

introduce ulteriori restrizioni

Page 41: 1 Semantica Operazionale di un frammento di Java: lo stato

41

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

Page 42: 1 Semantica Operazionale di un frammento di Java: lo stato

42

public class B { public static int x; public int z; public int y; public void metodo2 (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;} }