1 Implementazione degli oggetti. 2 Contenuti ¥effetto dell’implementazione di ambiente e memoria sugli oggetti ¥ oggetti come ambiente e memoria permanente.

Slides:



Advertisements
Presentazioni simili
1 La Standard Template Library vettori, liste, mappe, …. find, replace, reverse, sort, …. puntatori intelligenti La libreria standard STL e una libreria.
Advertisements

LS Tron Classe 4TC – as 2006/07 LORGANIZZAZIONE DEI PROGRAMMI UD. 8 p. 282.
Type Checking (1° parte)
1 Semantica Operazionale di un frammento di Java: lo stato.
Semantica Operazionale di un frammento di Java: lo stato
1 Strutture dati nel supporto a run time. 2 Entità presenti quando un programma va in esecuzione §programmi dutente (compilati) §routines del supporto.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Strutture dati elementari
Tail recursion: esempio
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Introduzione alla Object Oriented Programming, OOP E.Mumolo. DEEI
E.Mumolo. DEEI Introduzione alla programmazione ad oggetti in C++ Object Oriented Programming, OOP E.Mumolo. DEEI
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Argomenti della lezione
APPUNTI SUL LINGUAGGIO C
Progettazione dei sistemi interattivi (A.A. 2004/05) - Lezione 3 1 La relazione di ereditarietà Punto di vista insiemistico: la relazione di ereditarietà
Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno)
Heap allocation e garbage collector di Oberon Algoritmo Quick Fit e garbage collector mark and sweep.
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
memoria gestita staticamente:
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Java Collections.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
AN FI Array Array in Java. AN FI Array Dichiarazione di array in Java [ ]; //oppure u [] ; int a[]; int[] a; u La dimensione non è specificata.
Javascript: fondamenti, concetti, modello a oggetti
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Programmazione Mod. B - prof. Burattini - Cap 17 1.
Corso di informatica Athena – Periti Informatici
Complessità di un algoritmo
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Approfondimenti sulle Classi.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
CORSO DI PROGRAMMAZIONE II Lezione 22
1 Tecniche per il passaggio dei parametri. 2 Contenuti ¥la tecnica base (nei vari paradigmi) ¥ passaggio per costante, per riferimento, di funzioni, procedure.
1 Implementazione di (ambiente e) memoria nel linguaggio imperativo.
Un interprete astratto per l’inferenza dei tipi
1 Blocchi e ambiente locale in linguaggi funzionali e imperativi.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Algoritmi e Strutture Dati Strutture Dati Elementari.
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
1 Controllo di sequenza: espressioni e comandi. 2 Contenuti ¥espressioni pure (senza blocchi e funzioni) ¥ regola di valutazione, operazioni strette e.
estensione (con piccole varianti) di quella in
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in FONDAMENTI DI PROGRAMMAZIONE.
Lo stato  I domini della semantica restano invariati: Ide, Val (Int  { ,  }) Loc (locazioni di memoria), FunctDecl. ma definiamo 2 funzioni: Loc :
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
Elementi di semantica denotazionale ed operazionale
1 Strutture dati. 2 Astrazione Non vogliamo sapere l’organizzazione fisica dei dati  indirizzi e celle di memoria Ci interessa solo la loro organizzazione.
1 Semantica Operazionale di un frammento di Java: lo stato estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini, Elementi di Semantica.
1 Programmazione Funzionale: ML 1 implementazione del -calcolo tipato l definizione di nuovi tipi ricorsivi l i valori dei nuovi tipi sono termini, che.
Valutazione parziale, specializzazione di interpreti, compilazione
1 Classi e oggetti. 2 Contenuti ¥dai sottoprogrammi alle classi ¥ oggetti come attivazioni permanenti, ambienti accessibili ovunque, entità con stato,
Progetto Parte II OCAML.
1 Gestione dinamica della memoria a heap (nel linguaggio orientato ad oggetti)
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
1 Semantica Operazionale di un frammento di Java: intro estensione (con piccole varianti) di quella di FP | v |
1 Espressioni 4 dato che non abbiamo previsto inizializzazioni per le variabili (statiche e di istanza) all’interno delle classi, le espressioni possono.
1 Implementazione dell’ambiente (linguaggio funzionale)
Elementi di semantica operazionale
1 Classi e oggetti. 2 Contenuti ¥dai sottoprogrammi alle classi ¥ oggetti come attivazioni permanenti, ambienti accessibili ovunque, entità con stato,
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
1 Controllo di sequenza: espressioni e comandi. 2 Contenuti ¥espressioni pure (senza blocchi e funzioni) ¥ regola di valutazione, operazioni strette e.
Transcript della presentazione:

1 Implementazione degli oggetti

2 Contenuti ¥effetto dell’implementazione di ambiente e memoria sugli oggetti ¥ oggetti come ambiente e memoria permanente ¥effetto degli oggetti sull’implementazione di ambiente e memoria ¥ ambienti e memoria esistono sia sulla pila che sulla heap ¥alcune modifiche nell’interprete iterativo

3 Oggetti e implementazione dello stato ¥nella semantica attuale, un oggetto è un ambiente ¥ come sempre rappresentato da una funzione ¥ ottenuto a partire dall’ambiente complessivo esistente dopo l’esecuzione del blocco  limitandosi ( localenv ) alle associazioni per this, campi e metodi (inclusi quelli ereditati)  tale ambiente è utilizzato soltanto per selezionare campi e metodi ( Field ) ¥l’ambiente non-locale dell’oggetto ¥ è soltanto l’ambiente globale delle classi, ma potrebbe essere un ambiente qualunque se permettessimo classi annidate è rappresentato completamente nelle chiusure dei suoi metodi ¥la memoria esportata nella posizione della pila corrispondente all’attivazione precedente contiene tutto ¥ anche le locazioni locali ad attivazioni ritornate non accessibili perchè non denotate nell’ambiente ¥ anche le locazioni locali dell’oggetto che restano accessibili (permanenti) in quanto denotate nell’ambiente-oggetto (che rimane nella heap) ¥quando l’ambiente e la memoria vengono implementati come pile di ambienti e memorie locali, bisogna adattare anche l’implementazione dell’oggetto ¥ ambiente locale ¥ memoria locale

4 La nuova struttura degli oggetti type obj = ide array * dval array * dval env * mval array ¥come negli ambienti e memorie locali  ide array, array di identificatori, come gli elementi di namestack  dval array, array di valori denotati, come gli elementi di dvalstack  dval env, (puntatore ad) ambiente, come gli elementi di slinkstack  mval array, (puntatore a) memoria, come gli elementi di storestack ¥ non serve un tag per la retention, perché l’ambiente locale così costruito è permanente

5 La nuova heap ¥come nel caso di ambiente e memoria anche la heap non può più essere una funzione ¥da type heap = pointer -> obj a type heap = obj array  mantenendo per ora l’implementazione “banale” di pointer e newpoint type pointer = int let newpoint = let count = ref(-1) in function () -> count := !count +1; !count

6 Operazioni sulla heap let emptyheap () = initpoint(); (Array.create 100 ((Array.create 1 "dummy"),(Array.create 1 Unbound), Denv(-1), (Array.create 1 Undefined)) : heap) let currentheap = ref(emptyheap()) let applyheap ((x: heap), (y:pointer)) = Array.get x y let allocateheap ((x:heap), (i:pointer), (r:obj)) = Array.set x i r; x let getnomi(x:obj) = match x with | (nomi, den, slink, st) -> nomi let getden(x:obj) = match x with | (nomi, den, slink, st) -> den let getslink(x:obj) = match x with | (nomi, den, slink, st) -> slink let getst(x:obj) = match x with | (nomi, den, slink, st) -> st

7 Ambiente e memoria devono cambiare! ¥nel linguaggio imperativo, ambiente e memoria erano semplicemente interi ¥ interpretati come puntatori alle tabelle locali nelle varie pile che realizzano l’ambiente e la memoria ¥in presenza di oggetti, ambienti e memorie locali possono essere permanenti essendo allocate sulla heap ¥possiamo astrarre dalle differenze e definire un solo tipo di ambiente e memoria type 't env = Denv of int | Penv of pointer type 't store = Dstore of int | Pstore of pointer  le versioni che iniziano con D (dinamiche) sono puntatori nelle pile  le versioni che iniziano con P (permanenti) sono puntatori nella heap ¥le implementazioni delle operazioni si preoccuperanno di trattare i due casi in modo appropriato ¥ mostriamo nel seguito solo un paio di operazioni ridefinite

8 Cercare il valore denotato da un nome let applyenv ((r: dval env), (y: ide)) = let den = ref(Unbound) in let (x, caso) = (match r with | Denv(x1) -> (x1, ref("stack")) | Penv(x1) -> (x1, ref("heap"))) in let n = ref(x) in while !n > -1 do let lenv = if !caso = "stack" then access(namestack,!n) else getnomi(applyheap(!currentheap,!n)) in let nl = Array.length lenv in let index = ref(0) in while !index < nl do if Array.get lenv !index = y then (den := (if !caso = "stack" then Array.get (access(dvalstack,!n)) !index else Array.get (getden(applyheap(!currentheap,!n))) !index); index := nl) else index := !index + 1 done; if not(!den = Unbound) then n := -1 else let next = (if !caso = "stack" then access(slinkstack,!n) else getslink(applyheap(!currentheap,!n))) in caso := (match next with |Denv(_) -> "stack" |Penv(_) -> "heap"); n := (match next with |Denv(n1) -> n1 |Penv(n1) -> n1) done; !den

9 Le operazioni sulla memoria let applystore ((x: mval store), (d: loc)) = match d with | (s2,n2)-> (match s2 with | Dstore(n1) -> let a = access(storestack, n1) in Array.get a n2 | Pstore(n1) -> let a = getst(applyheap(!currentheap,n1)) in Array.get a n2) | _ -> failwith("not a location in applystore") let allocate ((s:mval store), (m:mval)) = let (s2, n2) = newloc() in (match s2 with | Pstore(n1) -> let a = access(storestack, n1) in Array.set a n2 m; ((s2, n2),s) | Dstore(n1) -> let a = access(storestack, n1) in Array.set a n2 m; ((s2, n2),s)) let update((s:mval store), (d: loc), (m:mval)) = if applystore(s, d) = Undefined then failwith ("wrong assignment") else match d with | (s2,n2) -> (match s2 with | Dstore(n1) -> let a = access(storestack, n1) in Array.set a n2 m; s | Pstore(n1) -> let a = getst(applyheap(!currentheap,n1)) in Array.set a n2 m; s )

10 L’ereditarietà let eredita ((rho: dval env), ogg, (h: heap)) = let currn = (match rho with | Denv(n) -> n) in let (point, arrnomisotto, arrdensotto, arrstore) = (match ogg with | Object(n) -> let oo = applyheap(!currentheap,n) in (n, getnomi(oo), getden(oo), getst(oo)) | _ -> failwith("not an object in eredita")) in let stl = Array.length arrstore in let newstore = Array.create stl Undefined in let index = ref(0) in while !index < stl do Array.set newstore !index (Array.get arrstore !index); index := !index + 1 done; pop(storestack); push(newstore, storestack); let currarrnomi = access(namestack, currn) in let currarrden = access(dvalstack, currn) in let r = access(slinkstack, currn) in let currl = Array.length currarrnomi in let oldlen = Array.length arrnomisotto in index := 0; while not(Array.get arrnomisotto !index = "this") do index := !index + 1 done; index := !index + 1; let newlen = (currl + oldlen - !index ) in let newarrnomi = Array.create newlen "dummy" in let newarrden = Array.create newlen Unbound in let newindex = ref(0) in while !newindex < currl do Array.set newarrnomi !newindex (Array.get currarrnomi !newindex); Array.set newarrden !newindex (Array.get currarrden !newindex); newindex := !newindex + 1 done; while !newindex < newlen do Array.set newarrnomi !newindex (Array.get arrnomisotto !index); Array.set newarrden !newindex (Array.get arrdensotto !index); newindex := !newindex + 1; index := !index + 1 done; pop(namestack);pop(dvalstack);pop(slinkstack); push(newarrnomi, namestack); push(newarrden,dvalstack); push(r,slinkstack)

11 Localenv let localenv ((r:dval env), (s: mval store), Dobject(ob), (li:ide list), (r1: dval env)) = let (rint, sint) = (match (r,s) with | (Denv nr, Dstore ns) -> (nr, ns) | _ -> failwith("heap structures in localenv")) in let oldst = access(storestack, sint) in let oldnomi = access(namestack, rint) in let oldden = access(dvalstack, rint) in let storesize = Array.length oldst in let newst = Array.create storesize Undefined in let index = ref(0) in while not(!index = storesize) do Array.set newst !index (Array.get oldst !index); index := !index + 1 done; let oldenvlength = Array.length oldnomi in let newenvlength = oldenvlength - (List.length li) in let newnomi = Array.create newenvlength "dummy" in let newden = Array.create newenvlength Unbound in let index = ref(0) in let newindex = ref(0) in while not(!index = oldenvlength) do let lname = Array.get oldnomi !index in let lden = Array.get oldden !index in if notoccur(lname, li) then ( Array.set newnomi !newindex lname; let ldennuova = (match lden with | Dfunval(e,rho) -> if rho >= r then Dfunval(e,Penv(ob)) else lden | Dprocval(e,rho) -> if rho >= r then Dprocval(e,Penv(ob)) else lden | Dloc(sigma, n) -> if sigma >= s then Dloc(Pstore(ob),n) else lden | _ -> lden ) in Array.set newden !newindex ldennuova; newindex := !newindex + 1) else (); index := !index + 1 done; (newnomi, newden, r1, newst)

12 Cosa cambia nell’interprete iterativo 1 ¥numerosi piccoli adattamenti relativi alla introduzione dei due tipi di ambiente e memoria ¥qualche modifica più importante nel trattamento degli oggetti | Ogg1(Class(name, fpars, extends, (b1,b2,b3) )) -> pop(continuation); (match extends with | ("Object",_) -> push(Ogg3(Class(name, fpars, extends, (b1,b2,b3) )),continuation); push(labelcom(b3), top(cstack)); push(Rdecl(b2), top(cstack)); push(labeldec(b1),top(cstack)); pushlocalenv(b1,b2,rho); pushlocalstore(b1); () | (super,superpars) -> let lobj = applyenv(rho, "this") in let superargs = findsuperargs(fpars, dlist(fpars, rho), superpars) in push(Ogg2(Class(name, fpars, extends, (b1,b2,b3) )), continuation); (match applyenv(rho, super) with | Classval(Class(snome, superfpars, sextends, sb), r) -> newframes(Ogg1(Class(snome, superfpars, sextends, sb)), bindlist(r, ["this"], [lobj]), sigma) | _ -> failwith("not a superclass name")))

13 Cosa cambia nell’interprete iterativo 2 | Ogg2(Class(name, fpars, extends, (b1,b2,b3) )) -> pop(continuation); let v = top(tempstack) in pop(tempstack); eredita(rho, v, !currentheap); push(Ogg3(Class(name, fpars, extends, (b1,b2,b3) )),continuation); push(labelcom(b3), top(cstack)); push(Rdecl(b2), top(cstack)); push(labeldec(b1),top(cstack)); pushlocalenv(b1,b2,rho); pushlocalstore(b1); () | Ogg3(Class(name, fpars, extends, (b1,b2,b3) )) -> pop(continuation); let r = (match applyenv(rho,name) with | Classval(_, r1) -> r1 | _ -> failwith("not a class name")) in let lobj = (match applyenv(rho, "this") with | Dobject n -> n) in let newobj = localenv(rho, sigma, Dobject(lobj), fpars, r) in currentheap := allocateheap (!currentheap, lobj, newobj); push(Object lobj, tempstack)