Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno)

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Introduzione al linguaggio C++
Procedure e funzioni A. Ferrari.
Linguaggi di programmazione
Algebra parziale con predicati
Esercitazione guidata 1
Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
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.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di un’espressione La maggior.
Linguaggi a memoria condivisa Lidea è di aggiungere ad un linguaggio imperativo dei costrutti per rappresentare lesecuzione parallela di statements. Supponiamo.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di unespressione La maggior parte.
Algoritmi e Programmazione
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
Metodologie di Programmazione = decomposizione basata su astrazioni
Semantica Operazionale di un frammento di Java: lo stato
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Anno accademico Le classi di memorizzazione.
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Semantica Denotazionale
Semantica Denotazionale
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
CORSO DI PROGRAMMAZIONE II
-calcolo Vogliamo studiare le problematiche relative al meccanismo di chiamata di funzione (eg differenze fra binding statico e dinamico) in isolamento.
Semantica Operazionale Strutturata
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
Dall’algoritmo al programma.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Corso JAVA Lezione n° 11 Istituto Statale di Istruzione Superiore “F. Enriques”
I metodi F. Bombi Campi e metodi Abbiamo visto che una classe può contenere – Campi – Metodi stato I campi sono utilizzati per memorizzare.
Complessità di un algoritmo
1 Tecniche per il passaggio dei parametri. 2 Contenuti ¥la tecnica base (nei vari paradigmi) ¥ passaggio per costante, per riferimento, di funzioni, procedure.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Funzioni e Procedure Marco D. Santambrogio – Ver. aggiornata al 3 Aprile 2015.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
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”
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
Lo stato  I domini della semantica restano invariati: Ide, Val (Int  { ,  }) Loc (locazioni di memoria), FunctDecl. ma definiamo 2 funzioni: Loc :
Elementi di semantica denotazionale ed operazionale
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Semantica denotazionale algebrica di LW
Esercitazione guidata 1
Transcript della presentazione:

Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno) espressioni etc. producono valori (di base) a partire dalle informazioni sui valori degli identificatori Dichiarazioni etc. determinano quali sono gli identificatori usabili nel seguito (e per le sole funzioni quali sono i rispettivi valori), cioè creano/modificano gli ambienti Quindi i carrier dellalgebra semantica dovranno essere qualche tipo di funzioni aventi come argomenti le informazioni sui valori degli identificatori Le informazioni sui valori degli identificatori sono di due tipi: Ci sono identificatori associati a variabili, il cui valore cambia nel tempo durante lesecuzione dei programmi. Altri associati a funzioni, il cui valore è costante per tutta la durata dellesecuzione.

Modello ambiente/stato ambiente Identificatori Locazioni + Valori costanti Valori base stato Locazioni: astrazione del concetto di cella di memoria, per semplicità sono tipate, in modo che le locazioni per il tipo T siano abbastanza grandi da contenere un valore di tipo T Valori costanti. Siccome nel nostro linguaggio ci sono dichiarazioni di variabili di tipo base e di costante di tipo funzionale, avremo nei valori costanti funzioni e nellimmagine dello stato solo valori di tipo intero e booleano Ci dovranno essere dei vincoli di coerenza, cioè locazioni di tipo T dovranno essere associate a valori di tipo T (il suo contenuto)

Ambiente Un ambiente associa ad un identificatore un valore che resta costante per tutta la durata dellesecuzione. Env = [L Id (LW) p ] Fin Fun = [Arg p Res] Arg = [Z| B] + States Stato al momento della chiamata, da usare per valutare variabili globali Stato modificato dalla chiamata void Per gli identificatori di funzione si tratta della funzione descritta dal body. Per le variabili si tratta della locazione. LocFun Le locazioni sono tipate: Loc = T BTypes Loc T Non ci interessa dettagliare come siano fatte le locazioni di un dato tipo, ma assumiamo di averne a disposizione un numero illimitato Res = [Z| B|{ * }] States

Stato Uno stato rappresenta una fotografia della memoria del programma ad un dato istante dellesecuzione. Quindi associa ad ogni locazione (=cella) un valore. States = [Loc p Value] Fin Value = T BTypes [T] [T] è linsieme dei valori di tipo T: [int] = Z, [bool] = B Siccome le locazioni sono tipate, lassociazione deve rispettare i tipi: Per ogni stato s, l Loc T e s(l) definito implica s(l) [T]. Alternativamente Loc e Value possono essere visti come famiglie Loc = {Loc T } T Btypes, Value = {[T]} T Btypes, ed s: Loc p Value come una famiglia di funzioni {s T : Loc T p [T]} T Btypes Solo alle locazioni inizializzate (che sono un numero finito) è associato un valore Nomenclatura. Dato uno stato s Dom(s). Il dominio di s consiste di tutte le locazioni riservate, cioè associate ad un identificatore (ad un qualche livello più o meno locale) DDef(s). Il dominio di definizione di s consiste di tutte le locazioni inizializzate. Quindi DDef(s) Dom(s)

Locazioni nuove Nel seguito ci servirà allocare delle locazioni distinte da tutte quelle in uso (per evitare aliasing e cancellazione di dati). Dati un ambiente r ed uno stato s, quali sono le locazioni in uso? Tutte le locazioni nellimmagine di r sono sicuramente in uso, ma non sono le sole. Infatti, se abbiamo una dichiarazione locale di x che copre una dichiarazione globale di variabile per x, la locazione l associata ad x nellambiente globale non compare nellimmagine dellambiente aggiornato (risulta coperta dal nuovo valore associato a x), ma non per questo si può riassegnare. Quindi, definiamo il predicato Nuova Loc Env States come Nuova(l,r,s) sse l (Im(r) Dom(s)) Però in un caso come questo, l appartiene anche al dominio dello stato (non necessariamente al dominio di definizione). int x = 3; int y; void f(bool x; int z;) {if (x) {y=1;} else {y=z;}} x y z f... 3 l

Funzione(/i) Semantica(/he) Le dichiarazioni modificano lambiente. [_] Decs :L Decs (LW) Env States Env States Lo stato serve (e può venir modificato) a causa delle dichiarazioni con inizializzazione, oltre che per individuare le locazioni libere. Come nel caso della semantica statica, la semantica è una famiglia di funzioni indiciata sui non terminali (un omomorfismo) Dovremmo quindi definire ciascuna funzione. Definiremo solo quelle per tipi, liste di dichiarazioni, di statements, di espressioni e quella per il programma. Le altre si desumono da queste, perché il loro dominio è incluso in uno dei precedenti. Gli statements modificano lo stato. [_] Stats :L Stats (LW) Env States States Le espressioni producono un valore e(d eventualmente) modificano lo stato (side-effects). [_] Exps :L Exps (LW) Env States Value + States Per i tipi labbiamo già vista (manca la regola [void] RType = { * } ) [_] RType :L RType (LW) Set Nelseguito tralasceremo gli indici

Definizione delle funzioni semantiche Definiamo le funzioni semantiche per (mutua) ricorsione Possiamo indifferentemente usare la notazione in linea F(exp) = …. F(exp)…. Oppure quella a regole Vediamo quale è più conveniente. Ad esempio consideriamo il caso della concatenazione di dichiarazioni. Lidea intuitiva è di valutare la prima dichiarazione e usare il risultato come punto di partenza (= argomento) per valutare le restanti dichiarazioni: Notazione in linea: [d ds] Decs (r,s) = [ds] Decs ([d] Decs (r,s)) Notazione a regole: [d ds] Decs (r,s) = (r,s) [d] Decs (r,s) = (r,s)[ds] Decs (r,s) = (r,s) F(exp) = ….A…. F(exp) = A Risulta più leggibile quella a regole. Quindi useremo questa.

Espressioni [e es] (r,s) = (v lv,s) [e] (r,s) = (v,s)[es] (r,s) = (lv,s) [x](r,s) = (s(r(x)),s) Exp ::= Id Il risultato è il valore della variabile (se inizializzata) Exps ::= Exp Exps r(x) Loc [x = e](r,s) = [e](r,s) = (v,s) Exp ::= Id = Exp Questo formalizza anche lintuizione che leggere il valore di una cella non altera la memoria (v,s[v/r(x)]) [f(es)](r,s) = [es](r,s) = (lv,s) Exp ::= Id(Exps) r(f)(lv,s) Questa è una funzione per via della correttezza statica [e + e] (r,s) = (a,s) [e] (r,s) = (v,s) Exp ::= Exp + Exp v + v = a Scarichiamo le funzione base sullinterpretazione dei tipi base nellalgebra semantica

Esercizio Valutare la semantica della seguente espressione in ambiente r e stato s, assumendone la correttezza statica x = f(3,x) + 2 [x = f(3,x)+2](r,s) = (v,s[v/r(x)]) [f(3,x)+2](r,s) = (v,s) [f(3,x)](r,s) = (u 1,s 1 ) [2](r,s 1 ) = (u 2,s) v= u 1 + u 2 u 2 = 2 s= s 1 [3,x](r,s) = (lv,s 1 ) r(f)(lv, s 1 )= (u 1,s 1 ) [3](r,s) = (v 1,s 1 )[x](r, s 1 ) = (v 2,s 1 ) lv = v 1 v 2 v 1 = 3 s 1 =s v 2 = s 1 (r(x)) s 1 = s 1 Convenzione: usiamo questa font per indicare valori ed operazioni nellalgebra semantica 3 s(r(x)) 3 3 s s s s s s s(r(x)) s 3 s(r(x)) 2 2 Concludendo [x = f(3,x)+2](r,s) = (u 1 + 2, s 1 [u /r(x)]) dove (u 1,s 1 ) = r(f)(3 s(r(x)), s) s1s1 s1s1 s1s1 u 1 + 2

Dichiarazioni di variabili [d ds] (r,s) = (r,s) [d] (r,s) = (r,s)[ds] (r,s) = (r,s) [t x](r,s) = (r[l/x],s[ /l]) Dec ::= Type Id Leffetto deve essere di associare alla variabile una nuova locazione non inizializzata Decs ::= Dec Decs Nuova(l,r,s) [t x = e](r,s) = (r[l/x],s[v/l]) [e](r,s) = (v,s) Dec ::= Type Id = Exp; Nuova(l,r,s) Convenzione: Dom(s[ /l])= Dom(s) l} s[ /l](y)= s(y) se y DDef(s) DDef(s[ /l])= DDef(s) ( opzionale )

Lidea è: usare il parametro x per estendere ambiente (parametro formale) e lo stato al momento della chiamata (parametro attuale) e valutarvi il corpo ottenendo una funzione da associare a f nellambiente Dichiarazioni di funzioni 1 [void f(T x) {sts}] (r, s) = (r[F/f],s) [void f(T x) {sts}] Dove F : [T] States { * } States Consideriamo il caso più semplice possibile: procedurale, senza ricorsione e con un solo parametro. Parametro attuale Stato al momento della chiamata Stato prodotto dalla chiamata è definita da F(v,s c ) = ( *,s) [sts] (r[ /f,l/x],s c [v/l]) = s Nuova(l,r,s c ) l è nuova rispetto al momento della chiamata Lo stato non viene modificato. La locazione per il parametro viene allocata al momento di ogni chiamata Maschero f, caso mai ci fosse nellambiente. Per il momento è inutile, perché sappiamo che f non è ricorsiva

Dichiarazioni di funzioni ricorsive [void f(T x) {sts}](r,s) = (r[F/f],s) Dove F : [T] States { * } States Si parte come nel caso non ricorsivo Il problema è la definizione di F: non so come fare le chiamate ricorsive perché f non compare in r[ /f] Cambiamo approccio. F è definita induttivamente da tutte le regole della semantica più le seguenti due: F(v,s c ) = ( *,s) [sts] (r[ /f,l/x],s c [v/l]) = s F(v,s c ) = ( *,s) [sts] (r[ /f,l/x],s c [v/l]) = s [f(e)] (r[ /f],s 0 ) = (*,s) F(u,s) = ( *,s)[e](r[ /f],s 0 ) = (u,s) Caso base: riesco a valutare il corpo(come nel caso non ricorsivo) Regola ad hoc per la chiamata di f Nuova(l,r,s c )

Dichiarazioni di funzioni ricorsive 2 [RT f(T x) {sts result e}](r,s) = (r[F/f],s) Dove F : [T] States [RT] States Cosa cambia nel caso in cui il tipo di ritorno non è void? La definizione di F si fa analogamente al caso void F è definita induttivamente da tutte le regole della semantica più le seguenti due: F(v,s c ) = (a, s) [sts] (r[ /f,l/x],s c [v/l]) = s [f(e)] (r[ /f],s 0 ) = (a,s) F(u,s) = (a,s)[e](r[ /f],s 0 ) = (u,s) Caso base: riesco a valutare il corpo(come nel caso non ricorsivo) Regola ad hoc per la chiamata di f [e](r[ /f,l/x], s ) = (a,s) Nuova(l,r,s c )

Statements [st sts ] (r,s) = [st] (r,s) = s[sts] (r,s) = s Stat ::= Exp; Vogliamo considerare solo i side-effects della valutazione di unespressione Stats ::= Stat Stats s [e](r,s) = (v,s) Stat ::= if (Exp) {Stats} else {Stats} Scelta condizionale usuale [ if (e) {sts} else {sts} ] (r,s) = s [e](r,s) = (tt,s)[sts] (r,s) = s [ if (e) {sts} else {sts} ] (r,s) = s [e](r,s) = (ff,s)[sts] (r,s) = s Stat ::= while (Exp) {Stats} [ while (e) {sts} ] (r,s) = [e](r,s) = (tt,s)[sts] (r,s) = s [ while (e) {sts} ] (r,s) = [e](r,s) = (ff,s) [ while (e) {sts} ] (r,s) = s 0 s 0 s s [e;](r,s) =

Input e Output Finora abbiamo considerato solo programmi che modificano lo stato interno. Vogliamo permettere anche operazioni di input e output. Anzitutto bisogna introdurre i costrutti opportuni Stat::=... ?(Id) | !(Exp) Poi dovremo dare le ovvie regole di semantica statica (per esercizio) Ultimo problema: la semantica. Bisogna aggiungere allo stato le componenti per linterazione col mondo esterno: States = Input Output [Loc p Value] Fin stato (vecchio) interno Nel nostro caso si leggono valori da assegnare alle variabili e si scrivono valori (valutazioni delle espressioni), quindi Input = Output = Value * Perché le regole vecchie abbiano senso bisogna estendere la notazione s[v/l] ai nuovi stati (i,o,m)[v/l]=(i,o,m[v/l]) [ !(e) ] (r,s) =(i, vo,m) [e](r,s) = (v,(i,o,m)) [ ?(x) ] (r,(v i,o,m)) =(i,o,m[v/r(x)])