Ambiente delle classi ρ: contiene le classi dichiarate prima dell’inizio dell’esecuzione
ρ è una funzione da identificatori di classe a descrizioni di classe
ρ : Cenv = Id -> Cdescr
Cdescr = Id * Frame * Menv * Frame * Menv
Descrizione di classe: superclasse * variabili statiche * metodi statici * variabili istanza * metodi istanza
NB: il costruttore (sequenza di assegnamenti) viene aggiunto ai metodi istanza
Class_decl := class Id extends Id {
Static_var_decl_list
Static_meth_decl_list
Inst_var_decl_list
Inst_meth_decl_list
Costruttore }
Frame ϕIl frame è una tabella (estendibile e mutabile) che mantiene associazioni fra identificatori (di variabili) e valori (interi, booleani oppure locazioni (puntatori ad oggetti))
Operazioni definite sui frame:
• un frame ϕ:Frame viene creato vuoto (newframe())
• l’operazione bind(ϕ, i, v) estende ϕ inserendo l’associazione tra i e v
• l’operazione update(ϕ, i, v) modifica in ϕ l’associazione per i (che deve esistere)
• l’operazione defined(ϕ, i) dice se ϕ contiene un’associazione per i
• per ottenere il valore di una variabile, si applica il frame all’Id
Ambiente di metodi μμ è una funzione da identificatori di metodo a descrizioni di metodo
μ : Menv = Id -> Mdescr
Mdescr = Idlist * Blocco * ( Loc | Id )
Descrizione di metodo: parametri formali * corpo del metodo * puntatore a oggetto o nome di classe
Method_decl := Id (Idlist) Blocco
Operazioni sugli ambienti di metodi e di classi:
• cbind((ρ:Cenv), (i:Id), (c:Cdescr)) estende ρ associando ad i il valore c
• cdefined(ρ:Cenv, i:Id) dice se ρ è definita per i
• mbind((μ:Menv), (i:Id), (m:Mdescr)) estende μ associando ad i il valore m
• mdefined(μ :Menv, i:Id) dice se μ è definita per i
• instantiate((μ:Menv), (l:Loc)) crea un nuovo ambiente μ1 diverso da μ perché tutte le descrizioni di metodi contengono l’oggetto l
Heap ζ: contiene gli oggetti (istanze di classi)ζ è una funzione da locazioni a descrizioni di istanza (oggetto)
ζ : Heap = Loc -> Odescr
Odescr = Id * Frame * Menv
Descrizione di istanza: classe * variabili di istanza * metodi di istanza
Operazioni sullo heap:
• newheap() genera una heap vuota
• newloc(ζ) genera una nuova locazione in ζ
• hbind((ζ:Heap), (l:Loc), (o:Odescr)) estende ζ associando ad l il valore o
NB:
• un oggetto viene creato con l’espressione new Id
• genera il valore o:Odescr a partire dalla classe Id
• l = newloc(ζ)
• hbind((ζ:Heap), (l:Loc), (o:Odescr))
• restituisce l
Pila di attivazioni σ: per la valutazione dei metodi, simile alla pila dei record di attivazione nei linguaggi tradizionaliσ è una pila di records di attivazione di metodi
σ : Astack
Astack = Stack (Record)
Record = ( Id | Loc ) * Stack(Frame)
record di attivazione: oggetto o classe a cui il metodo appartiene * pila di frames (blocchi annidati)
Operazioni sulle pile (record, frame):
• emptystack() genera una pila vuota
• top((π:Stack(x)) restituisce l’elemento di tipo x in testa a π
• pop((π:Stack(x)) modifica π eliminando l’elemento in testa
• push((π:Stack(x),(e:x)) modifica π inserendo l’elemento e in testa
• empty((π:Stack(x)) verifica se π è vuota
[
Fonte]