1 Implementazione di (ambiente e) memoria nel linguaggio imperativo.

Slides:



Advertisements
Presentazioni simili
Puntatori in C e C++.
Advertisements

Tipi di dato astratti Lista, Pila, Coda, Albero.
Estendere i linguaggi: i tipi di dato astratti
Procedure In assembler.
Strutture dati lineari
PHP.
Linguaggi di programmazione
MATLAB.
SOS a piccoli passi Invece di semplificare sempre in configurazioni finali, fattorizziamo in passi più piccoli (da cui il nome). In questo modo la non.
Algoritmi e Programmazione
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
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.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Introduzione al linguaggio C
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
Introduzione alla programmazione lll
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.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
Le funzioni a tempo di esecuzione
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Complessità di un algoritmo
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
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 degli oggetti. 2 Contenuti ¥effetto dell’implementazione di ambiente e memoria sugli oggetti ¥ oggetti come ambiente e memoria permanente.
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.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
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.
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.
Metodologie di Programmazione Esercizi sulla semantica di Java.
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 Sottoprogrammi in linguaggi imperativi. 2 Contenuti ¥introduciamo le procedure nel linguaggio imperativo ¥ astrazione ¥ chiamata ¥ regole di scoping.
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 |
Esercizi.
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)
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

1 Implementazione di (ambiente e) memoria nel linguaggio imperativo

2 Contenuti ¥ambiente e memoria locale nel linguaggio imperativo ¥ cosa serve in ogni attivazione ¥ perché la restrizione a locazioni denotabili ¥ implementazione: strutture dati e operazioni ¥ cosa cambia nell’interprete iterativo

3 Ambiente locale dinamico ¥per ogni attivazione ¥ entrata in un blocco o chiamata di procedura abbiamo attualmente nel record di attivazione gli interi ambiente e memoria ¥ implementati come funzioni ¥in accordo con la semantica dell’ambiente locale dinamico possiamo inserire nel record di attivazione ¥ una tabella che implementa il solo ambiente locale (catena statica) ¥ una tabella che implementa la memoria locale ¥quando l’attivazione termina ¥ uscita dal blocco o ritorno della chiamata di procedura possiamo eliminare l’ambiente e la memoria locali insieme a tutte le altre informazioni contenute nel record di attivazione ¥ ma si può fare solo se si impongono opportune restrizioni

4 La pila di ambienti locali ¥stessa soluzione del linguaggio funzionale con creazione di un ambiente locale nuovo per  Let, Apply, Block, Call ¥insieme di pile di ambienti locali  namestack, pila di array di identificatori  dvalstack, pila di array di valori denotati  slinkstack, pila di (puntatori ad) ambienti  tagstack, pila di etichette per la retention solo per il frammento funzionale le procedure non sono esprimibili

5 E la memoria locale? storestack, pila di mval store ¥la creazione di una nuova memoria locale avviene chiaramente quando si entra in un blocco o si chiama una procedura ¥ se ci sono dichiarazioni di variabile creiamo una associazione tra un nome ed una espressione di tipo Newloc  un array di mval, con tante posizioni quante sono le dichiarazioni di variabile  il nuovo storestack, pila di array di mval  uno store è un puntatore nella pila (intero)  e lo store corrente è il valore della variabile currentstore ¥una locazione è una coppia di interi: ¥ il primo identifica lo store ¥ il secondo la posizione relativa ¥tutte le variabili raggiungibili attraverso l’ambiente non locale sono accessibili ¥ possono essere lette ¥ possono essere modificate con l’assegnamento ¥ possono essere passate come parametri

6 Strutture dati e operazioni type ‘t store = int let (currentstore: mval store ref) = ref(0) let storestack = emptystack(stacksize,[|Undefined|]) let (newloc,initloc) = let count = ref(-1) in (fun () -> count := !count +1; (!currentstore, !count)), (fun () -> count := -1) let applystore ((x: mval store), ((n1, n2): loc)) = let a = access(storestack, n1) in Array.get a n2 let emptystore(x) = initloc(); svuota(storestack); currentstore := -1; !currentstore let allocate ((s:mval store), (m:mval)) = let (n1, n2) = newloc() in let a = access(storestack, n1) in Array.set a n2 m; ((n1, n2), s) let update((s:mval store), (n1,n2), (m:mval)) = if applystore(s, (n1,n2)) = Undefined then failwith ("wrong assignment") else let a = access(storestack, n1) in Array.set a n2 m; s let pushlocalstore (dl) = let rdl = ref(dl) in let rn = ref(0) in while not(!rdl = []) do let (i, d) = List.hd !rdl in (match d with | Newloc(_) -> rn := !rn + 1 | _ -> ()); rdl := List.tl !rdl done; let a = Array.create !rn Undefined in pop(storestack); push(a, storestack); initloc(); !currentstore  pushlocalstore ha come argomento una lista di dichiarazioni (costanti e variabili)  crea l’array locale della dimensione necessaria e lo sostituisce a quello (vuoto) correntemente sulla testa di storestack  allocate setta l’array già così creato

7 Gestione a pila della memoria locale 1 ¥per poter correttamente poppare anche la memoria locale insieme al resto del record di attivazione dobbiamo essere sicuri che non esistano cammini d’accesso “esterni” alle locazioni interne alla memoria locale ¥ diversi da quelli costituiti dall’ambiente locale che stanno per essere eliminati ¥un cammino d’accesso esterno può essere ¥ un altro nome, diverso da quello locale, per la locazione (aliasing) l’unico meccanismo che può crearlo è il passaggio della locazione come parametro (per riferimento!) ad altra procedura ma, al momento del ritorno della procedura che conteneva la dichiarazione di variabile originale, –qualunque procedura chiamata è già necessariamente ritornata –l’aliasing non può esistere più ¥ una locazione appartenente a diversa memoria locale che contiene la locazione come valore impossibile perché le locazioni non sono valori memorizzabili ¥ il valore temporaneo della attuale “applicazione di funzione” impossibile perchè le locazioni non sono valori esprimibili ¥la memoria “dinamica” può essere gestita a pila solo se ¥ le locazioni non sono nè esprimibili nè memorizzabili le locazioni sono diverse dai puntatori ed i puntatori non esistono!

8 Gestione a pila della memoria locale 2 ¥digressione su casi non compresi nel linguaggio didattico ¥la gestione dinamica a pila della memoria è stata inventata da ALGOL 60 ¥ insieme all’ambiente locale dinamico ed alla struttura a blocchi ¥ ALGOL 60 non prevede nè puntatori nè vere strutture dati dinamiche (vedi dopo) ¥se il linguaggio prevede i puntatori (PASCAL, C) ¥ è necessaria una gestione della memoria a heap simile a quella vista per le liste ed a quella che vedremo per gli oggetti ¥ che può coesistere con una gestione a pila se viene mantenuta una distinzione fra locazioni e puntatori (PASCAL)  una gestione dinamica della memoria può essere necessaria anche in linguaggi che non hanno nella semantica nè store nè heap ¥ linguaggi funzionali, linguaggi logici semplicemente perché esistono vere strutture dati dinamiche ¥ liste, termini, s-espressioni implementate necessariamente con heap e puntatori ¥tutti i casi che richiedono la gestione a heap ¥ puntatori, strutture dinamiche, oggetti permettono che operazioni che richiedono l’allocazione dinamica di memoria  new di strutture o di classi, applicazione di costruttori ricorsivi possano figurare in punti arbitrari del programma ¥invece che soltanto nelle dichiarazioni all’ingresso dei blocchi!

9 Alcune novità nell’interprete iterativo 1 let applyproc ((ev1:dval),(ev2:dval list), s) = ( match ev1 with | Dprocval(Proc(ii,(l1, l2, l3)), x) -> let r = bindlist(x, ii, ev2) in newframes(labelcom(l3), r, s); push(Rdecl(l2), top(cstack)); push(labeldec(l1),top(cstack)); pushlocalenv(l1,l2,r); pushlocalstore(l1); () | _ -> failwith ("attempt to apply a non-functional object")) ¥chiamata di procedura ¥ un unico frame l’ambiente locale che contiene i parametri e lo “spazio” per tutte le dichiarazioni del blocco la memoria locale che contiene lo spazio per tutte le variabili locali

10 Alcune novità nell’interprete iterativo 2 let itsemrdecl() = let tempstack = top(tempvalstack) in let continuation = top(cstack) in let tempdstack = top(tempdvalstack) in let rho = topenv() in let sigma = topstore() in let rl = (match top(continuation) with | Rdecl(rl1) -> rl1 | _ -> failwith("impossible in semrdecl")) in pop(continuation); let prl = ref(rl) in while not(!prl = []) do let currd = List.hd !prl in prl := List.tl !prl; let (i, den) = (match currd with |(j, Proc(il,b)) -> (j, makeproc(Proc(il,b),rho)) |(j, Fun(il,b)) -> (j, makefun(Fun(il,b),rho)) | _ -> failwith("no more sensible cases in recursive declaration")) in currentenv := bind(rho, i, den) done ¥non c’è più il punto fisso ¥ l’ambiente delle chiusure (rho) è lo stesso in cui vengono inserite le associazioni

11 Alcune novità nell’interprete iterativo 3 let semb ((l1, l2, l3), r, s) = initstate(r,s); newframes(labelcom(l3), r, s); push(Rdecl(l2), top(cstack)); push(labeldec(l1),top(cstack)); pushlocalenv(l1,l2,!currentenv); pushlocalstore(l1); loop(); currentenv := !currentenv + 1; currentstore := !currentstore + 1; topstore()