Implementazione dell interprete di un nucleo di linguaggio funzionale
|
|
- Antonino Cocco
- 4 anni fa
- Visualizzazioni
Transcript
1 Implementazione dell interprete di un nucleo di linguaggio funzionale 1
2 Linguaggio funzionale didattico Consideriamo un nucleo di un linguaggio funzionale o sottoinsieme di ML senza tipi né pattern matching Obiettivo: esaminare tutti gli aspetti relativi alla implementazione dell interprete e del supporto a run time per il linguaggio Partiamo dalla semantica operazionale 2
3 Linguaggio funzionale didattico type ide = string type exp = Eint of int Ebool of bool Den of ide Prod of exp * exp Sum of exp * exp Diff of exp * exp Eq of exp * exp Minus of exp Iszero of exp Or of exp * exp And of exp * exp Not of exp Ifthenelse of exp * exp * exp Let of ide * exp * exp (* Dichiarazione di ide: modifica ambiente *) Fun of ide list * exp (* Astrazione di funzione *) Appl of exp * exp list (* Applicazione di funzione *) 3
4 Valori esprimibili e ambiente Valori esprimibili type evt = Int of int Bool of bool Unbound Ambiente evt env 4
5 Primi passi let rec eval (e: exp) (r: evt env) : evt = match e with Eint n -> Int n Ebool b -> Bool b Den i -> applyenv r I Eq(a, b) -> eq (eval a r) eval(b, r) Prod(a, b) -> mult (eval a r) (eval b r)) Sum(a, b) -> plus (eval a r) (eval b r) Diff(a, b) -> diff (eval a r) (eval b r) Minus a -> minus (eval a r) And(a, b) -> et (eval a r) (eval b r) Or(a, b) -> vel (eval a r) (eval b r) Not a -> non (eval a r) Ifthenelse(a, b, c) -> let g = (eval a r) in if typecheck("bool", g) then (if g = Bool(true) then (eval b r) else (eval c r)) else failwith ("non boolean guard") 5
6 Let(x, e1, e2) Con il Let possiamo cambiare l ambiente in punti arbitrari all interno di una espressione o facendo sì che l ambiente nuovo valga soltanto durante la valutazione del corpo del blocco, l espressione e2 o lo stesso nome può denotare entità distinte in blocchi diversi I blocchi possono essere annidati o e l ambiente locale di un blocco più esterno può essere (in parte) visibile e utilizzabile nel blocco più interno! come ambiente non locale! Il blocco o porta naturalmente a una semplice gestione dinamica della memoria locale (stack dei record di attivazione) o si sposa felicemente con la regola di scoping statico! per la gestione dell ambiente non locale 6
7 Semanica operazionale di Let env e1 v1 env[v1/ x] e2 v2 env Let(x,e1,e2) v2 7
8 Semanica operazionale di Let run-time stack push RA env e1 v1 env[v1/ x] e2 v2 env Let(x,e1,e2) v2 Usciamo dal blocco Effettuando pop 8
9 let rec eval (e: exp) (r: evt env) : evt = match e with Eint(n) -> Int(n) Ebool(b) -> Bool(b) Den(i) -> applyenv(r, i) Iszero(a) -> iszero(eval(a, r)) Eq(a, b) -> equ(eval(a, r),eval(b, r)) Prod(a, b) -> mult(eval(a, r), eval(b, r)) Sum(a, b) -> plus(eval(a, r), eval(b, r)) Diff(a, b) -> diff(eval(a, r), eval(b, r)) Minus(a) -> minus(eval(a, r)) And(a, b) -> et(eval(a, r), eval(b, r)) Or(a, b) -> vel(eval(a, r), eval(b, r)) Not(a) -> non(eval(a, r)) Ifthenelse(a, b, c) -> let g = eval(a, r) in if typecheck("bool", g) then (if g = Bool(true) then eval(b, r) else eval(c, r)) else failwith ("nonboolean guard") Let(i, e1, e2) -> eval (e2, bind(r, i, eval(e1, r))) 9
10 Analisi let rec eval (e: exp) (r: evt env) : evt = match e with Let(i, e1, e2) -> eval (e2, bind(r, i, eval(e1, r))) L espressione e2 (corpo del blocco) è valutata nell ambiente esterno esteso con l associazione tra il nome i e il valore di e1 10
11 Esempio di valutazione # eval (Let("x", Sum(Eint 1, Eint 0), Let("y", Ifthenelse(Eq(Den "x", Eint 0), Diff(Den "x", Eint 1), Sum(Den "x", Eint 1)), Let("z", Sum(Den "x", Den "y"), Den "z"))), (emptyenv Unbound));; -: evt = Int 3 Sintassi OCaml corrispondente # let x = 1+0 in let y = if x = 0 then x-1 else x+1 in let z = x+y in z;; -: int = 3 11
12 Funzioni o astrazione funzionale o applicazione di funzione 12
13 Sintassi Astrazione type exp =... Fun of ide list * exp Appl of exp * exp list Applicazione 13
14 Funzioni Identificatori (parametri formali) nel costrutto di astrazione Fun of ide list * exp Espressioni (parameri attuali) nel costrutto di applicazione Appl of exp * exp list Per ora non ci occupiamo del modo del passaggio parametri le espressioni parametro attuale sono valutate e i valori ottenuti legati nell ambiente al corrispondente parametro formale Per ora ignoriamo le funzioni ricorsive Assumeremo solitamente di avere funzione unarie Introducendo le funzioni, il linguaggio funzionale è completo un linguaggio funzionale reale (tipo ML) ha in più i tipi, il pattern matching e le eccezioni 14
15 Valori esprimibili? Come bisogna estendere i tipi esprimibli (evt) per comprendere le astrazioni funzionali? Quale è il valore di una funzione? Assumiamo scoping statico (vedremo poi quello dinamico) type evt = Int of int Bool of bool Unbound Funval of efun efun = ide * exp * evt env La definizione di efun mostra che una astrazione funzionale è una chiusura, che comprende nome del parametro formale codice della funzione dichiarata ambiente al momento della dichiarazioni I riferimenti non locali dell astrazione verranno risolti nell ambiente di dichiarazione 15
16 Astrazione e applicazione di funzione: scoping statico env Fun(x,e) Funval(x, e, env) env e1 v1 v1= Funval(x,e, env1) env e2 v2 env1[v2 / x] e v env Apply(e1,e2) v 16
17 Dichiarazione di una funzione env f Code_f env 17
18 Semantica eseguibile: scoping statico let rec eval (e: exp) (r: evt env) = match e with... Fun(i, a) -> Funval(i, a, r) Apply(e1, e2) -> match eval(e1, r) with Funval(i, a, r1) -> eval(a, bind(r1, i, eval(e2, r))) _ -> failwith("no funct in apply") Il corpo della funzione viene valutato nell ambiente ottenuto legando i parametri formali ai valori dei parametri attuali nell ambiente r1, nel quale era stata valutata l astrazione 18
19 Semantica operazionale vs. eseguibile env e1 v1 v1= Funval(x, e, env1) env e2 v2 env1[v2 / x] e v env Apply(e1, e2) v let rec eval (e: exp) (r: evt env) = match e with... Fun(i, a) -> Funval(i, a, r) Apply(e1, e2) -> match eval(e1, r) with Funval (i, a, r1) -> eval (a, bind(r1, i, eval(e2, r))) _ -> failwith("no funct in apply") 19
20 Scoping dinamico Dobbiamo modificare evt type evt = Int of int Bool of bool Unbound Funval of efun efun = ide * exp La definizione di efun mostra che l astrazione funzionale contiene solo il codice della funzione dichiarata Il corpo della funzione verrà valutato nell ambiente ottenuto o legando i parametri formali ai valori dei parametri attuali o nell ambiente nel quale avviene la applicazione 20
21 Astrazione e applicazione di funzione: scoping dinamico env Fun(x,e) Funval(x, e) env e1 v1 v1= Funval(x,e) env e2 v2 env[v2 / x] e v env Apply(e1, e2) v 21
22 Semantica eseguibile: scoping dinamico let rec eval (e: exp) (r: evt env) = match e with... Fun(i, a) -> Funval(i, a) Apply(e1, e2) -> match eval(e1, r) with Funval (i, a) -> eval (a, bind(r, i, eval(e2, r))) _ -> failwith("no funct in apply") Il corpo della funzione viene valutato nell ambiente ottenuto legando i parametri formali ai valori dei parametri attuali nell ambiente r, quello nel quale viene effettuata la chiamata 22
23 Ricapitolando: regole di scoping 23
24 Definizioni ricorsive 24
25 Funzioni ricorsive Come è fatta una definizione di funzione ricorsiva? o è una espressione Let(f, e1, e2) nella quale! f è il nome della funzione (ricorsiva)! e1 è un astrazione Fun(i, a) nel cui corpo occorre una applicazione di Den f 25
26 Funzioni ricorsive Esempio Let("fact", Fun("x", Ifthenelse(Eq(Den "x", Eint 0), Eint 1, Prod(Den "x", Apply(Den "fact", [Diff(Den "x", Eint 1)])))), Apply(Den "fact", [Eint 4])) In Ocaml let fact x = if (x == 0) then 1 else (x * fact (x-1)) in fact (4) non funziona!!! 26
27 Guardiamo la semantica let rec eval (e: exp) (r: evt env) = match e with.. Let(i,e1,e2) -> eval e2 bind (r,i, (eval e1 r)) Fun(i, a) -> Funval(i, a, r) Apply(e1, e2) -> match eval(e1, r) with Funval(i, a, r1) -> eval(a, bind(r1, i, eval(e2, r))) _ -> failwith("no funct in apply") Il corpo a (che include Den "fact" ) è valutato in un ambiente che è quello (r1) nel quale si valutano sia l espressione Let che l espressione Fun, esteso con una associazione per il parametro formale x. Tale ambiente non contiene il nome "fact" pertanto Den "fact" restituisce Unbound!!! 27
28 Morale Per permettere la ricorsione bisogna che il corpo della funzione venga valutato in un ambiente nel quale è già stata inserita l associazione tra il nome e la funzione Abbiamo bisogno di o un diverso costrutto per dichiarare funzioni ricorsive (come il let rec di ML) o oppure un diverso costrutto di astrazione per le funzioni ricorsive 28
29 Problema generale Come costruiamo la chiusura per la gestione della ricorsione? Il punto importante è che l ambiente della chiusura deve contenere un binding per la gestione della ricorsione 29
30 Modello operazionale 30
31 Letrec Estendiamo la sintassi astratta del linguaggio didattico con un opportuno costruttore type exp = : Letrec of ide * ide * exp * exp Letrec("f", "x", fbody, letbody) "f" identifica il nome della funzione "x" identifica il parametro formale fbody è il corpo della funzione letbody è il corpo del let 31
32 Esempio: solito fattoriale Letrec("fact", "n", Ifthenelse(Eq(Den("n"),EInt(0)), EInt(1), Prod(Den("n"), Apply(Den("fact"), Sub(Den("n"),EInt(1))))) Apply(Den("fact"),Eint(4))) let rec fact x = if (x == 0) then 1 else (x * fact (x-1)) in fact (4) 32
33 Tipi esprimibili Estendiamo i tipi esprimibli (evt) per avere le astrazioni funzionali ricorsive (Recfunval) type evt = Int of int Bool of bool Unbound Funval of ide * exp * evt env Recfunval of ide * ide * exp * evt env 33
34 Recfunval Recfunval of ide * ide * exp * evt env Recfunval (funname, param, funbody, staticenvironment) 34
35 Il codice dell interprete : Letrec(f, i, fbody, letbody) -> let benv = bind(r, f, (Recfunval(f, i, fbody, r))) in eval(letbody, benv) : Viene associato al nome della funzione ricorsiva una chiusura ricorsiva che contiene il nome della funzione stessa 35
36 Il codice dell interprete (2) : Apply(Den f, earg) -> let fclosure = eval(f, r) in match fclosure with Funval(arg, fbody, fdecenv) -> :: Recfunval(f, arg, fbody, fdecenv) -> let aval = eval (earg, r) in let renv = bind(fdecenv, f, fclosure) in let aenv = bind(renv, arg, aval ) in eval(fbody, aenv) _ -> failwith("non functional value ) Apply (_,_) -> failwith( not function ) 36
37 Passi dell interprete Il valore della chiusura ricorsiva RecFunVal è recuperato dall ambiente corrente Il parametro attuale è valutato nell ambiente del chiamante ottenendo il valore aval L ambiente statico fdecenv, memorizzato nella chiusura, è esteso con il legame tra il nome della funzione e la sua chiusura ricorsiva, ottendo l ambiente renv L ambiente effettivo di esecuzione fbody si ottiene estendendo l ambiente renv con il binding del passaggio del parametro 37
38 # let myrp = Letrec("fact", "n", Ifthenelse(Eq(Den("n"),EInt(0)), EInt(1), Prod(Den("n"), Apply(Den("fact"), Sub(Den("n"),CstInt(1))))), Apply(Den("fact"),EInt(3)));; val myrp : exp = # eval myrp emptyenv;; - : eval = Int 6 38
39 Scoping statico e dinamico: valutazione 39
40 Anzitutto In presenza del solo costrutto di blocco, non c è differenza fra le due regole di scoping perché non c è distinzione fra definizione e attivazione o un blocco viene eseguito immediatamente quando lo si incontra 40
41 Scoping statico e dinamico: verifiche Un riferimento non locale al nome x nel corpo di un blocco o di una funzione viene risolto o se lo scoping è statico, con la (eventuale) associazione per x creata nel blocco o astrazione più interni fra quelli che sintatticamente contengono o se lo scoping è dinamico, con la (eventuale) associazione per x creata per ultima nella sequenza di attivazioni (a tempo di esecuzione) 41
42 Scoping statico Guardando il programma (la sua struttura sintattica) siamo in grado di verificare se l associazione per x esiste identificare la dichiarazione (o il parametro formale) rilevanti e conoscere quindi l eventuale informazione sul tipo Il compilatore può staticamente determinare gli errori di nome (identificatore non dichiarato, unbound) fare il controllo di tipo e rilevare gli eventuali errori di tipo 42
43 Scoping dinamico L esistenza di una associazione per x e il tipo di x dipendono dalla particolare sequenza di attivazioni Due diverse applicazioni della stessa funzione, che utilizza x come non locale, possono portare a risultati diversi o errori di nome si possono rilevare solo a tempo di esecuzione o non è possibile fare controllo dei tipi statico 43
44 Scoping statico: ottimizzazioni Un riferimento non locale al nome x nel corpo di un blocco o di una funzione e viene risolto o con la (eventuale) associazione per x creata nel blocco o astrazione più interni fra quelli che sintatticamente contengono Guardando il programma (la sua struttura sintattica) siamo in grado di o verificare se l associazione per x esiste o identificare la dichiarazione (o il parametro formale) rilevanti e conoscere quindi l eventuale informazione sul tipo Il compilatore potrà ottimizzare l implementazione al prim ordine (mediante struttura dati) dell ambiente sia la struttura dati che lo implementa o che l algoritmo che permette di trovare l entità denotata da un nome Tali ottimizzazioni sono impossibili con lo scoping dinamico 44
45 Regole di scoping e linguaggi Lo scoping statico è decisamente migliore L unico linguaggio importante che ha una regola di scoping dinamico è LISP Alcuni linguaggi non hanno regole di scoping l ambiente è locale oppure globale non ci sono associazioni ereditate da altri ambienti locali PROLOG, JAVA Avere soltanto ambiente locale e ambiente non locale con scoping statico crea problemi rispetto alla modularità e alla compilabilità separata PASCAL Soluzione migliore ambiente locale, ambiente non locale con scoping statico e ambiente globale basato su un meccanismo di moduli 45
46 Implementazione dell ambiente (ragione) 46
47 Ambiente locale dinamico Per ogni attivazione entrata in un blocco o applicazione di funzione abbiamo attualmente nel record di attivazione l intero ambiente o implementato come una funzione Le regole della semantica dell ambiente locale dinamico non lo richiedono. In realtà possiamo inserire nel record di attivazione o una tabella che implementa il solo ambiente locale o e tutto quello che ci serve per reperire l ambiente non locale in accordo con la regola di scoping Quando l attivazione termina o uscita dal blocco o ritorno della applicazione di funzione possiamo eliminare l ambiente locale (e cose eventualmente associate) insieme a tutte le altre informazioni contenute nel record di attivazione 47
48 L ambiente locale (una implementazione furba ) Nel caso del blocco (Let) contiene una sola associazione (la dichiarazione del let) Nel caso della applicazione (Apply) contiene tante associazioni quanti sono i parametri Rappresentiamo l ambiente locale con una coppia di array corrispondenti o l array dei nomi o l array dei valori denotati la cui dimensione è determinata dalla sintassi del costrutto 48
49 Shallow binding Si può semplificare il costo di un riferimento non locale o accesso diretto senza ricerca complicando la gestione di creazione e distruzione di attivazioni L ambiente è realizzato con un unica tabella centrale che contiene tutte le associazioni attive (locali e non locali) o ha una entry per ogni nome utilizzato nel programma o in corrispondenza del nome, oltre all oggetto denotato, c è un flag che indica se l associazione è o non è attiva I riferimenti (locali e non locali) sono compilati in accessi diretti alla tabella a tempo di esecuzione o non c è più ricerca, basta controllare il bit di attivazione I nomi possono sparire dalla tabella ed essere rimpiazzati dalla posizione nella tabella Diventa molto più complessa la gestione di creazione e distruzione di associazioni o la creazione di una nuova associazione locale rende necessario salvare quella corrente (se attiva) in una pila (detta pila nascosta) o al ritorno bisogna ripristinare le associazioni dalla pila nascosta La convenienza rispetto al deep binding dipende dallo stile di programmazione o se il programma usa molti riferimenti non locali e pochi Let e Apply 49
50 Scoping dinamico e scoping statico Con lo scoping dinamico si vede anche dalle implementazioni dell ambiente non è possibile effettuare nessuna analisi e nessuna ottimizzazione a tempo di compilazione Lo scoping statico porta a programmi più sicuri rilevamento statico di errori di nome quando si usa un identificatore si sa a chi ci si vuole riferire verifica e inferenza dei tipi statici e più efficienti si possono far sparire i nomi dalle tabelle che realizzano gli ambienti locali i riferimenti possono essere trasformati in algoritmi di accesso che sono essenzialmente indirizzamenti indiretti e non richiedono ricerca Il problema della non compilabilità separata (ALGOL, PASCAL) si risolve (C) combinando la struttura a blocchi con scoping statico con un meccanismo di moduli separati con regole di visibilità 50
Implementazione dell interprete di un nucleo di linguaggio funzionale
Implementazione dell interprete di un nucleo di linguaggio funzionale 1 Linguaggio funzionale dida.co Consideriamo un nucleo di un linguaggio funzionale o so5oinsieme di ML senza 7pi né pa5ern matching
Linguaggio funzionale dida.co
IMPLEMENTAZIONE DELL INTERPRETE DI UN NUCLEO DI LINGUAGGIO FUNZIONALE 1 Linguaggio funzionale dida.co Consideriamo un nucleo di un linguaggio funzionale o So5osinsieme di ML senza 7pi né pa5ern matching
24. Implementazione dell interprete di un nucleo di linguaggio funzionale
AA 2015-2016 24. Implementazione dell interprete di un nucleo di linguaggio funzionale 1 Linguaggio funzionale didacco Consideriamo un nucleo di un linguaggio funzionale o so9oinsieme di ML senza
Tecniche per il passaggio dei parametri
Tecniche per il passaggio dei parametri 1 Contenuti la tecnica base (nei vari paradigmi) passaggio per costante, per riferimento, di funzioni, procedure e oggetti altre tecniche passaggio per nome nuovi
Espressioni. Espressioni logiche: sintassi astratta. type BoolExp = True False Not of BoolExp And of BoolExp * BoolExp 15/11/18. INTERPRETE in OCAML
Espressioni INTERPRETE in OCAML Espressioni logiche: sintassi astratta type BoolExp = True False Not of BoolExp And of BoolExp * BoolExp Definizionedella sintassi astratta tramitei tipi algebrici di OCaml
PROGRAMMAZIONE Nomi, binding, regole di visibilità (scope)
PROGRAMMAZIONE 2 19. Nomi, binding, regole di visibilità (scope) PR2 2017-2018 1 Nomi Un nome in un linguaggio di programmazione è esattamente quello che immaginate o la maggior parte dei nomi sono definiti
Strutture dati nel supporto a run time
Strutture dati nel supporto a run time 1 Entità presenti quando un programma va in esecuzione programmi d utente (compilati) routines del supporto interprete I/O, librerie, routines per la gestione delle
Nomi, binding e regole di scope
Nomi, binding e regole di scope 1 Nomi Un nome in un linguaggio di programmazione è esattamente quello che immaginate o la maggior parte dei nomi sono definiti dal programma (gli identificatori) o ma anche
23. Implementazione dell interprete di un nucleo di linguaggio funzionale
AA 2014-2015 23. Implementazione dell interprete di un nucleo di linguaggio funzionale 1 Linguaggio funzionale didacco Consideriamo un nucleo di un linguaggio funzionale o so9osinsieme di ML senza
Contenuti. Sottoprogrammi e astrazioni funzionali in linguaggi funzionali. Le esigenze a cui si risponde con il sottoprogramma 1
Contenuti Sottoprogrammi e astrazioni funzionali in linguaggi funzionali! nascono i sottoprogrammi (digressione archeologica)! per rispondere a quali esigenze?! cosa veniva offerto per la loro simulazione!
AA Implementazione di un linguaggio impera4vo
AA 2015-2016 25. Implementazione di un linguaggio impera4vo 1 Cara,eris0che del linguaggio impera0vo Include totalmente il linguaggio funzionale o inclusi i costru@ Fun, Apply e Rec Le espressioni includono
Implementazione dell ambiente (linguaggio funzionale)
Implementazione dell ambiente (linguaggio funzionale) 1 Contenuti ambiente locale dinamico, scoping statico cosa serve in ogni attivazione (catena statica) un problema con le funzioni esprimibili: la retention
Contenuti. Elementi di semantica denotazionale ed operazionale. Sintassi astratta. Sintassi e semantica. ! sintassi astratta e domini sintattici
Elementi di semantica denotazionale ed operazionale Contenuti! sintassi astratta e domini sintattici " un frammento di linguaggio imperativo! semantica denotazionale " domini semantici: valori e stato
Macchine astratte, linguaggi, interpretazione, compilazione
Macchine astratte, linguaggi, interpretazione, compilazione 1 Macchine astratte una collezione di strutture dati ed algoritmi in grado di memorizzare ed eseguire programmi componenti della macchina astratta
Implementazione di (ambiente e) memoria nel linguaggio imperativo
Implementazione di (ambiente e) memoria nel linguaggio imperativo 1 Contenuti ambiente e memoria locale nel linguaggio imperativo cosa serve in ogni attivazione perché la restrizione a locazioni denotabili
AA Controllo di sequenza: espressioni e comandi
AA 2015-2016 22. Controllo di sequenza: espressioni e comandi 1 Espressioni in sintassi astra3a Alberi e6che3a6 o nodi! applicazioni di funzioni (operazioni primi6ve)! i cui operandi sono i so3oalberi
Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Sintassi
Nomi Nomi e ambiente Blocchi e regole di scoping Meccanismi di astrazione fondamentale per gestire la complessità del software. Uso dei nomi: un meccanismo di astrazione. Nome: sequenza di caratteri usata
Funzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
Pr ogramming Languages. Sottoprogrammi
Pr ogramming Languages Sottoprogrammi 1 ISottoprogrammi Qualche nozione introduttiva DVAL:dominiodeivaloridenotabili,ovverooggettiai quali èpossibiledareunnome:dataobject(variabili), indirizzi, sottoprogrammi,
Pattern matching e tipi di dato strutturati
Capitolo 3 Pattern matching e tipi di dato strutturati Per il momento abbiamo considerato un linguaggio funzionale (denominato SimpleCaml ) i cui unici tipi di dato sono interi, float, booleani e funzioni.
AA Il passaggio dei parametri
AA 2016-2017 25. Il passaggio dei parametri 1 Condivisione dei binding Associazione non locale o globale o comodo quando quando l en:tà da condividere è sempre la stessa Parametri o importante quando l
Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.
Programmazione II Lezione 7 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 9/11/2010 1/24 Programmazione II Lezione 7 9/11/2010 Sommario 1 Gestione della Memoria 2/24 Programmazione II Lezione 7 9/11/2010
Nomi. Nomi e ambiente. Nomi e oggetti denotabili. Esempio
Nomi e ambiente Blocchi e regole di scoping Nomi Meccanismi di astrazione fondamentale per gestire la complessità del software. Uso dei nomi: un meccanismo di astrazione. Nome: sequenza di caratteri usata
CONFRONTO TRA I SUPPORTI A RUN TIME DI VARI LINGUAGGI
CONFRONTO TRA I SUPPORTI A RUN TIME DI VARI LINGUAGGI 1 En#tà presen# quando un programma va in esecuzione! Programmi d utente (compila#)! Rou#nes del supporto o interprete o I/O, librerie, rou#nes per
Programmazione Funzionale
Programmazione Funzionale Linguaggi funzionali http://cialdea.dia.uniroma3.it/teaching/pf/ di alto livello: un programma è una funzione. di tipo dichiarativo: il programmatore specifica che cosa calcola
Nomi, binding e regole di scope
Nomi, binding e regole di scope 1 Nomi Un nome in un linguaggio di programmazione è esa5amente quello che immaginate o la maggior parte dei nomi sono defini; dal programma (gli iden;ficatori) o ma anche
Macchine astratte, linguaggi, interpretazione, compilazione
Macchine astratte, linguaggi, interpretazione, compilazione 1 Macchine astratte! una collezione di strutture dati ed algoritmi in grado di memorizzare ed eseguire programmi! componenti della macchina astratta
Linguaggi di Programmazione
Linguaggi di Programmazione!paradigmi linguistici, costrutti!semantica!implementazione, strutture a tempo di esecuzione 1 Linguaggi di programmazione e astrazione! i linguaggi di programmazione ad alto
LA RICORSIONE LA RICORSIONE
LA RICORSIONE Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa La ricorsione consiste nella possibilità di definire una funzione in termini
Informatica 3. LEZIONE 2: Sintassi e semantica
Informatica 3 LEZIONE 2: Sintassi e semantica Modulo 1: Introduzione ai concetti di sintassi e semantica Modulo 2: Il concetto di binding Modulo 3: Variabili Modulo 4: Routine Convenzioni dei nomi Informatica
Funzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2018/2019 Argomenti del Corso Ogni lezione consta di una spiegazione assistita da slide,
Traduzione ed Interpretazione
Traduzione ed Interpretazione Queste sconosciute Siano L Linguaggio ad alto livello M L Macchina astratta di L M 0 Macchina ospite Implementazione interpretativa di L Implementazione compilativa di L Simulazione
Traduzione ed Interpretazione. Queste sconosciute
Traduzione ed Interpretazione Queste sconosciute Siano L Linguaggio ad alto livello M L M 0 Macchina astratta di L Macchina ospite Implementazione interpretativa di L Simulazione software di M L su M 0
Linguaggi di Programmazione
Linguaggi di Programmazione E una notazione con cui e possibile descrivere gli algoritmi. Programma: e la rappresentazione di un algoritmo in un particolare linguaggio di programmazione. In generale, ogni
Fasi di un Compilatore
Dipartimento di Matematica e Informatica Università di Camerino Un implementazione compilativa di un linguaggio di programmazione viene realizzata tramite un programma che prende il nome di compilatore
Elementi di semantica operazionale
Elementi di semantica operazionale 1 Contenuti sintassi astratta e domini sintattici un frammento di linguaggio imperativo semantica operazionale domini semantici: valori e stato relazioni di transizione
1 Il Paradigma Imperativo
1 Il Paradigma Imperativo 1.1 Imp : un semplice linguaggio imperativo Abbiamo visto in Fun un meccanismo eager per la valutazione dei parametri di una funzione ed un meccanismo lazy. Una situazione analoga
Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione
Informatica 3 Informatica 3 LEZIONE 2: Sintassi e semantica Lezione 2- Modulo 1 Modulo 1: Introduzione ai concetti di sintassi e semantica Modulo 2: Il concetto di binding Modulo 3: Variabili Modulo 4:
PROGRAMMAZIONE Funzioni e procedure
PROGRAMMAZIONE 2 20. Funzioni e procedure PR2 2017-2018 1 Breve storia dei sotto-programmi Astrazione di una sequenza di istruzioni o un frammento di programma (sequenza di istruzioni) risulta utile in
Espressioni aritmetiche
Espressioni aritmetiche Consideriamo espressioni costruite a partire da variabili e costanti intere mediante applicazione delle operazioni di somma, sottrazione, prodotto e divisione (intera). Ad esempio:
Lezione 6 Introduzione al C++ Mauro Piccolo
Lezione 6 Introduzione al C++ Mauro Piccolo piccolo@di.unito.it Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,
Logica per la Programmazione
Logica per la Programmazione Lezione 11 Linguaggio di Programmazione Imperativo: Sintassi e Semantica Concetto di Tripla di Hoare Soddisfatta pag. 1 Introduzione Dall inizio del corso ad ora abbiamo introdotto,
PROGRAMMAZIONE Tipi di dato, implementazione
PROGRAMMAZIONE 2 18. Tipi di dato, implementazione 1 A cosa servono? Livello di progetto: organizzano l informazione tipi diversi per concetti diversi meccanismi espliciti dei linguaggi per l astrazione
Gestione della memoria
Gestione della memoria Stack di attivazione, Heap Stack di attivazione, Heap Gestione della memoria 1 / 52 La gestione della memoria Come il compilatore-interprete, organizza i dati necessari all esecuzione
PROGRAMMAZIONE 2 15bis. OCaML: un veloce ripasso
PROGRAMMAZIONE 2 15bis. OCaML: un veloce ripasso PR2 2017-2018 1 Lo stile funzionale In Java (ma anche in C) l effetto osservabile di un programma è la modifica dello stato temp = pair.x; pair.x = pair.y;
LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi
LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica Marco Lapegna Dipartimento di Matematica e Applicazioni Universita degli Studi di Napoli Federico II wpage.unina.it/lapegna Partiamo da un
DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione
DAGLI ALGORITMI AI LINGUAGGI Linguaggi di Programmazione E` una notazione con cui e` possibile descrivere gli algoritmi. Programma: e` la rappresentazione di un algoritmo in un particolare linguaggio di
FUNZIONI: IL MODELLO A RUN-TIME!
FUNZIONI: IL MODELLO A RUN-TIME! Ogni volta che viene invocata una funzione si crea di una nuova attivazione (istanza) del servitore viene allocata la memoria per i parametri e per le variabili locali
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa
Definizione di metodi in Java
Definizione di metodi in Java Un metodo in Java definisce un operazione ad alto livello (sottoprogramma) che consente di manipolare dati e oggetti. Durante la computazione effettuata da un programma, un
Laboratorio 3 (SmallC: Alberi Astratti con Tipi Algebrici in OCaml)
Laboratorio 3 (SmallC: Alberi Astratti con Tipi Algebrici in OCaml) Sommario: 6 aprile, 2018 - Ocaml: Tipi Algebrici o Concreti. Sintassi Astratta: Esprimiamo Dcl con Tipi Algebrici OCaml. Programmare
Record di Attivazione Cenni sulla ricorsione
MASTER Information Technology Excellence Road (I.T.E.R.) Cenni sulla ricorsione Maurizio Palesi Salvatore Serrano Master ITER Informatica di Base Maurizio Palesi, Salvatore Serrano 1 Il modello a RUN-TIME
Analisi Statica, traduzione dei nomi. Riferimenti: Trovate il materiale di questa esercitazione e altre informazioni.
Analisi Statica, traduzione dei nomi Riferimenti: www.di.unipi.it/~basile Trovate il materiale di questa esercitazione e altre informazioni. Analisi Statica: traduzione dei nomi dato il programma, per
La principale modalità di calcolo è l applicazione di funzioni
1 La principale modalità di calcolo è l applicazione di funzioni Nei linguaggi funzionali puri non esistono strutture di controllo predefinite per la realizzazione di cicli quali for, while, repeat Un
FUNZIONI: IL MODELLO A RUN-TIME
FUNZIONI: IL MODELLO A RUN-TIME Ogni volta che viene invocata una funzione si crea di una nuova attivazione (istanza) del servitore viene allocata la memoria per i parametri e per le variabili locali si
passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad una funzione, in
I Parametri di tipo vettore I Il meccanismo del passaggio per valore di un indirizzo consente il passaggio di vettori come parametri di funzioni/procedure. I Quando si passa un vettore come parametro ad
Informatica 3. LEZIONE 9: Introduzione ai linguaggi funzionali. Modulo 1: Introduzione ai linguaggi funzionali Modulo 2: LISP
Informatica 3 LEZIONE 9: Introduzione ai linguaggi funzionali Modulo 1: Introduzione ai linguaggi funzionali Modulo 2: LISP Informatica 3 Lezione 9 - Modulo 1 Introduzione ai linguaggi funzionali Linguaggi
CONTROLLO DI SEQUENZA: ESPRESSIONI E COMANDI
CONTROLLO DI SEQUENZA: ESPRESSIONI E COMANDI 1 Espressioni in Sintassi Astra.a Alberi e1che.a1 o nodi ü applicazioni di funzioni (operazioni primi1ve) ü i cui operandi sono i so.oalberi o Foglie ü costan1
CONTROLLO DI SEQUENZA: ESPRESSIONI E COMANDI
CONTROLLO DI SEQUENZA: ESPRESSIONI E COMANDI 1 Espressioni in Sintassi Astra.a! Alberi e1che.a1 o nodi! applicazioni di funzioni (operazioni primi1ve)! i cui operandi sono i so.oalberi o Foglie! costan1
Programmazione II. Lezione 9. Daniele Sgandurra 16/11/2010.
Programmazione II Lezione 9 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 16/11/2010 1/31 Programmazione II Lezione 9 16/11/2010 Sommario 1 Gestione della Memoria 2/31 Programmazione II Lezione 9 16/11/2010
IL PASSAGGIO DEI PARAMETRI
IL PASSAGGIO DEI PARAMETRI 1! Condivisione dei binding! Si può fare con associazione non locale o globale o Comodo quando quando l en9tà da condividere è sempre la stessa! Parametri o Importante quando
LINGUAGGI DI PROGRAMMAZIONE
LINGUAGGI DI PROGRAMMAZIONE Il potere espressivo di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente) quali istruzioni di
Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili
Linguaggio C Argomenti Avanzati! I puntatori! Stack! Visibilità delle Variabili 2 ! Il C consente di associare ai tipi di dati nomi definiti dal programmatore, mediante la parola chiave typedef! Dal punto
Introduzione alla Programmazione Funzionale
Introduzione alla Programmazione Funzionale April 27, 2017 Paradigmi di Programmazione Programmi sviluppabili usando diversi paradigmi Imperativo: computazione come modifica di stato Funzionale: computazione
Linguaggi di programmazione e astrazione
Linguaggi di programmazione e astrazione i linguaggi di programmazione ad alto livello moderni sono il più potente strumento di astrazione messo a disposizione dei programmatori che possono, con un solo
Informatica 3. LEZIONE 1: Introduzione. Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di programmazione
Informatica 3 LEZIONE 1: Introduzione Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di Informatica 3 Lezione 1- Modulo 1 Introduzione al corso Introduzione Corso di Informatica 3
Linguaggi di Programmazione I Lezione 1
Linguaggi di Programmazione I Lezione 1 Prof. Marcello Sette mailto://marcello.sette@gmail.com http://sette.dnsalias.org 4 marzo 2008 Introduzione al corso 3 Obbiettivi..............................................................
Nomi. ! Un nome in un linguaggio di programmazione è. esa9amente quello che immaginate
NOMI, BINDING, AMBIENTI Nomi! Un nome in un linguaggio di programmazione è. esa9amente quello che immaginate o La maggior parte dei nomi sono defini@ dal programma (gli iden@ficatori) o Ma anche i simboli
Variabili e Funzioni. Informatica 1 / 19
Variabili e Funzioni Informatica 1 / 19 Programmi C e Un programma C e composto da funzioni e variabili Variabile: memorizza valori appartenenti ad un insieme di definizione (dipendente dal tipo) Funzione:
PROGRAMMAZIONE Nomi, binding
PROGRAMMAZIONE 2 19. Nomi, binding PR2 2017-2018 1 Nomi Un nome in un linguaggio di programmazione è esa6amente quello che immaginate o la maggior parte dei nomi sono defini< dal programma (gli iden
ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1
ASTRAZIONE Esistono linguaggi a vari livelli di astrazione Linguaggio Macchina: implica la conoscenza dei metodi utilizzati per la rappresentazione delle informazioni Linguaggio Macchina e Assembler: implica
Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore
Programma del corso Introduzione agli algoritmi Rappresentazione delle Informazioni Architettura del calcolatore Reti di Calcolatori Elementi di Programmazione Algoritmi e programmi Algoritmo Sequenza
FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice
Funzioni FUNZIONI Spesso può essere utile avere la possibilità di costruire nuove istruzioni che risolvono parti specifiche di un problema Una funzione permette di attribuire un nome ad un insieme di istruzioni
Informatica 3. Informatica 3. Lezione 1- Modulo 1. LEZIONE 1: Introduzione. Concetti di linguaggi di programmazione. Introduzione
Informatica 3 Informatica 3 LEZIONE 1: Introduzione Lezione 1- Modulo 1 Modulo 1: Introduzione al corso Modulo 2: Introduzione ai linguaggi di Introduzione al corso Politecnico di Milano - Prof. Sara Comai
ML è un linguaggio interattivo La modalità interattiva di OCaml Ciclo: LETTURA, VALUTAZIONE, STAMPA. Objective Caml version 3.06
1 ML è un linguaggio interattivo La modalità interattiva di OCaml Ciclo: LETTURA, VALUTAZIONE, STAMPA # Objective Caml version 3.06 Il cancelletto è il prompt di Caml. # 3*8;; - : int = 24 LETTURA: viene
Elementi di semantica denotazionale ed operazionale
Elementi di semantica denotazionale ed operazionale 1 Contenuti! sintassi astratta e domini sintattici " un frammento di linguaggio imperativo! semantica denotazionale " domini semantici: valori e stato
7 Procedure. Estensioni sintattiche Dec ::= void Ide (Ptype Ide) Block Com ::= Ide(Exp);
7 Procedure Nei linguaggi di programmazione è di fondamentale importanza riuscire a scrivere dei programmi che siano facili da leggere e da modificare. Lo scopo di funzioni e procedure è quello di permettere
Linguaggi e Ambienti di Programmazione
Linguaggi e Ambienti di Programmazione Principi e tecniche diffuse che si incontrano spesso nelle applicazioni dell informatica. Compilatori Editor di struttura: riceve in input una sequenza di comandi
La gestione della memoria. Gestione della memoria. Uso della Memoria RAM
La gestione della memoria Gestione della memoria Stack di attivazione, Heap Come il compilatore-interprete, organizza i dati necessari all esecuzione del programma. Alcuni aspetti organizzativi già visti
AA Realizzare un interprete in OCaml
AA 2016-2017 17. Realizzare un interprete in OCaml 1 La stru/ura let x = 3 in x+x;; Parsing Programma (text-file) Rappresentazione Intermedia (IR) Let ( x, Num 3, B_op(Plus, Var x, Var x )) Num 6 Pre/y
Programmazione Definizione di nuovi tipi
Programmazione Definizione di nuovi tipi Samuel Rota Bulò DAIS Università Ca Foscari di Venezia. Outline Abbiamo incontrato i tipi primitivi. unit, bool, int, float, char, string Abbiamo visto come costruire
Sommario Linguaggi, messaggi e comunicazione. Introduzione ai Linguaggi di Programmazione. Linguaggio. Messaggio
Sommario Linguaggi, messaggi e comunicazione Traduzione di programmi Interpreti e compilatori Introduzione al processo di compilazione 1 2 Linguaggio Messaggio Insieme di sequenze di simboli, le parole,
Il linguaggio C. Istruzioni, funzioni, dati strutturati
Il linguaggio C Istruzioni, funzioni, dati strutturati Istruzioni Servono a dirigere il flusso di esecuzione di un programma controllano l ordine di esecuzione delle espressioni, quindi dei loro side effects
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli email:emanuela.merelli@unicam.it Argomenti della lezione Elementi di un linguaggio
Linguaggi di programmazione. Paradigmi di programmazione
Linguaggi di programmazione Paradigmi di programmazione Linguaggi: un po di storia Albori: Macchine a programma memorizzato, Programmi come dati Linguaggio Macchina Assemblatore FORTRAN (calcolo scientifico)
Corso: Fondamenti di Linguaggi di Programmazione
Corso: Fondamenti di Linguaggi di Programmazione Paola Giannini Chiusure e Binding statico e dinamico Paola Giannini, a.a. 2017/2018 FONDAMENTI LINGUAGGI Binding statico e dinamico 1 / 8 Stack e Sostituzione
Assegnazione di una variabile
Assegnazione di una variabile Per scrivere un valore dentro una variabile si usa l operatore di assegnazione, che è rappresentato dal simbolo =. Quindi, se scrivo int a; a = 12; assegno alla variabile
Scheme: struttura del programma e campo di azione
«a2» 2013.11.11 --- Copyright Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net Scheme: struttura del programma e campo di azione Definizione e campo di azione...........................
Le istruzioni corrispondono univocamente a quelle macchina, ma vengono espresse tramite nomi simbolici i (parole chiave)
ASTRAZIONE Esistono linguaggi a vari livelli di astrazione Linguaggio Macchina: implica la conoscenza dei metodi utilizzati per la rappresentazione delle informazioni Linguaggio Macchina e Assembler: implica
Perché il linguaggio C?
Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare
Sommario Obiettivo della programmazione e ciclo di sviluppo di programmi. Programmi. Ciclo di sviluppo di programmi. Obiettivo
Sommario Obiettivo della programmazione e ciclo di sviluppo di programmi Istruzioni variabili e tipi Sottoprogrammi Strutture di controllo Ricorsione 1 2 Obiettivo Ciclo di sviluppo di programmi Risoluzione
Corso di Linguaggi di Programmazione
Corso di Linguaggi di Programmazione Lezione 15 Alberto Ceselli alberto.ceselli@unimi.it Dipartimento di Informatica Università degli Studi di Milano 30 Aprile 2013 Classificazione di un Type System Riassumendo:
Logica per la Programmazione
Logica per la Programmazione Lezione 12 Linguaggio di Programmazione Imperativo: Sintassi e Semantica Tripla di Hoare soddisfatta A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a.
Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010
Corso di Laurea in Informatica Applicata Prima Prova di Verifica Intermedia di Programmazione II 1 Dicembre 2010 Istruzioni: scrivere le risposte alle domande negli spazi presenti nel testo e riconsegnare
Programmazione Orientata agli Oggetti in Linguaggio Java
Programmazione Orientata agli Oggetti in Linguaggio Java Classi e Oggetti: Metafora Parte a versione 2.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione
Linguaggio C: Stack e Ricorsione FUNZIONI: IL MODELLO A RUN-TIME Ogni volta che viene invocata una funzione: si crea di una nuova attivazione (istanza) del servitore viene allocata la memoria per i parametri