Semantica Operazionale di un
frammento di Java: lo stato
1
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
2
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
 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)
4
Lo stato
 pila di attivazioni s
– per la valutazione dei metodi
– pila dei record di attivazione dei metodi
 heap z
– contiene gli oggetti (istanze di classi)
 ambiente delle classi r
– contiene le classi dichiarate prima dell’inizio
dell’esecuzione
5
Ambiente delle classi r
 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
6
Ambiente delle classi r
 r è una funzione da identificatori di classe a
descrizioni di classe
– r : Cenv
– Cenv = Id -> Cdescr
 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
}
•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
metodi statici
9
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
10
Frame
 è una funzione j 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)
11
Ambiente di metodi m
 m è una funzione da identificatori di metodo a
descrizioni di metodo
– m : Menv
– Menv = Id -> Mdescr
 cos’è una descrizione di metodo?
12
Descrizione di metodo
 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
Mdescr = Idlist * Blocco
parametri formali
corpo del metodo
14
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}
15
La heap z
 z è una funzione da locazioni a descrizioni di
oggetto
– z : Heap
– Heap = Loc -> Odescr
 cos’è una descrizione di oggetto?
16
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)
17
Descrizione di oggetti
 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
 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
19
La pila di attivazioni s
 s è 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
20
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
21
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
22
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
23
La pila di attivazioni s
 s è una pila di records di attivazione di metodi
– s : Astack
– Astack = Stack (Record)
 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 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...
 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)
26
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 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
Dobbiamo valutare Path a partire dal metodo corrente
Puo’ 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
29
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
30
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
31
Da un oggetto:nell’ordine
 Variabili d’istanza (nella descrizione dell’oggetto nella
heap)
 Altrimenti si passa alla classe tramite il puntatatore
32
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 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
 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
35
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
36
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;}
}
37
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;}
}
38
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);
}
39
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
40
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;}
}
41
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;}
}
42
Scarica

Lucidi