Upload
azzurra-vitali
View
221
Download
1
Embed Size (px)
Citation preview
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
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)
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)
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
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
7
Ambiente delle classi
è una funzione da identificatori di classe a descrizioni di classe – : Cenv
– Cenv = Id -> Cdescr
cos’è una descrizione di classe?
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
9
Descrizione di classe
Cdescr = Frame * Menv
variabili statiche
metodi statici
variabili istanza
metodi istanza
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
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
12
Ambiente di metodi
è una funzione da identificatori di metodo a descrizioni di metodo – : Menv
– Menv = Id -> Mdescr
cos’è una descrizione di metodo?
13
Descrizione di metodo
deve contenere le informazioni per eseguirlo– lista dei parametri formali– corpo del metodo
14
Dichiarazione di metodo: sintassi
Method_decl := Id (Idlist) Blocco– ignorando i tipi
Mdescr = Idlist * Blocco
parametri formali
corpo del metodo
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}
16
La heap
è una funzione da locazioni a descrizioni di oggetto– : Heap – Heap = Loc -> Odescr
cos’è una descrizione di oggetto?
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)
18
Descrizione di oggetti
è una funzione da locazioni a descrizioni di istanza (oggetto)
Odescr = Id * Frame * Menv
classe variabili di istanza metodi di istanza
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
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
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
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
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
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
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
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)
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;
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
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
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
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
32
Da un oggetto:nell’ordine
Variabili d’istanza (nella descrizione dell’oggetto nella heap)
Altrimenti si passa alla classe tramite il puntatatore
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
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
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
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
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;} }
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;} }
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);}
}
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
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;} }
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;} }