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