mercoledì 27 agosto 2008

Appunti di Metodologie di programmazione (3): Lo stato

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]

Nessun commento: