Semantica Operazionale Strutturata

Slides:



Advertisements
Presentazioni simili
Definitezza Vogliamo poter richiedere la “definitezza” delle funzioni
Advertisements

Equazioni di primo grado
23/11/06Dino Puller1 Analisi statica in tempo reale con domini numerici Facoltà di scienze MM.FF.NN. Università degli studi di Verona.
Programma: main() { istruzioni } ; assegnazione condizione ciclo istruzione: ;
if (condizione.) { blocco_istruzioni } else
Sintassi (prima parte)
Esercitazione guidata 1
Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
Type Checking (1° parte)
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.
Generazione di Codice Intermedio
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
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
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Introduzione al linguaggio C
Strategie per la progettazione di algoritmi:
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Reaching Definitions. Tino CortesiTecniche di Analisi di Programmi 2 Reaching definitions Dato un punto del programma, quali sono i comandi di assegnamento.
Semantica Denotazionale
Semantiche dei linguaggi di programmazione
Semantica Denotazionale
Iterazione enumerativa (for)
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Introduzione alla programmazione lll
-calcolo Vogliamo studiare le problematiche relative al meccanismo di chiamata di funzione (eg differenze fra binding statico e dinamico) in isolamento.
Semantica denotazionale algebrica di LW Idea intuitiva: i valori che vogliamo denotare sono: gli statements sono funzioni di trasformazioni di stato (interno)
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
mosaic manipola oggetti primitivi (ruota e unisci) regole:
Lezione 2 Programmare in ASP
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
LINGUAGGI DI PROGRAMMAZIONE
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
CODIFICA Da flow-chart a C++.
void binario(int n); …………………
L’iterazione while La sintassi è la seguente: while (condizione) {
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
Sistemi e Tecnologie Informatiche Verifica di correttezza di un programma.
Introduzione a Javascript
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
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.
Classi: class Foo { public int x; public int y; public void swap (boolean z) { if (z) {int temp = x; x = y; y = temp;}; }; } Ambienti per le classi: Cenv.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
1 Interpretazione astratta: un approccio sistematico all’analisi statica.
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
Semantica dinamica Vogliamo definire una funzione che associ ad ogni termine corretto del mio linguaggio di programmazione un valore. Questa associazione.
Grammatiche Grammatiche libere da contesto Grammatiche regolari
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
public class volume { public static void main (String[] args) { final double bott_vol =2.0; final double latt_vol = 0.355; int bott_num = 4; int latt_num.
Elementi di semantica denotazionale ed operazionale
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Espressioni regolari (1)
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
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.
Semantica denotazionale algebrica di LW
Esercitazione guidata 1
Transcript della presentazione:

Semantica Operazionale Strutturata Semantica per riscrittura o riduzione o semplificazione basata sulla struttura dei termini che voglio semplificare Si individuano dei termini (del linguaggio) che rappresentano direttamente dei valori, cioè che non possono essere ulteriormente semplificati. Si danno delle regole di semplificazione in modo tale che ogni termine corretto si riduca ad uno e uno solo di quei termini che rappresentano valori In realtà come nel caso denotazionale abbiamo bisogno di ambienti e stati per poter eseguire le semplificazioni. Quindi la semplificazione agisce su configurazioni, che consistono di un termine e del contesto in cui si vuole valutare il termine.

SOS a grandi passi per LW Gli stessi della denotazionale tranne che cambia Value Molto simile alla semantica denotazionale Come configurazioni usiamo Conf = L  Env  States [T] è l’insieme dei valori sintattici di tipo T: [int] = {0,1,2,..-1,-2….}, [bool] = {true,false} L = sN Ls(LW)  {l}  {*} Definiamo la semplificazione come relazione binaria sulle configurazioni:   Conf  Conf Siccome la maggior parte delle semplificazioni non modifica gli ambienti introduciamo una notazione semplificata: (t,s) r (t’,s’) sse (t,r,s)  (t’,r,s’) Una configurazione (t,r,s) è finale se t = l (ho rielaborato tutto il termine in esame usandolo per modificare ambiente e/o stato) o t Value+ (ho raggiunto un termine che rappresenta un valore) A grandi passi vuol dire che se derivo (t,r,s)  (t’,r,s’), allora (t’,r,s’) è finale (non vado mai in uno stato intermedio, ma direttamente alla fine)

Espressioni Denotazionale SOS a grandi passi [e es] (r,s) = (v lv,s”) [e] (r,s) = (v,s’) [es] (r,s’) = (lv,s”) (e es, s) r (v lv,s”) (e,s) r (v,s’) (es,s’) r (lv,s”) [x](r,s) = (s(r(x)),s) r(x) LocT (x,s) r (s(r(x)),s) r(x) LocT [x = e](r,s) = [e](r,s) = (v ,s’) (v,s’[v/r(x)]) (x=e,s) r (v,s’[v/r(x)])) (e,s) r (v,s’) a è la rappresentazione sintattica del valore ottenuto sommando i valori rappresentati da v e v’ [f(es)](r,s) = r(f)(lv,s’) [es](r,s) = (lv ,s’) (f(es),s) r r(f)(lv,s’) (es,s) r (lv,s’) [e + e’] (r,s) = (a,s”) [e] (r,s) = (v,s’) [e’] (r,s’) = (v’,s”) (e+e’,s) r (a,s”) (e,s) r (v,s’) (e’,s’) r (v’,s”) v + v’ =a v + v’ =a

Espressioni completamento In realtà bisogna anche aggiungere tutti i controlli di tipo Alcuni controlli si possono omettere in quanto derivano dalla grammatica CF eLExp(LW) vValue esLExps(LW) lv Value+ (e es, s) r (v lv,s”) (e,s) r (v,s’) (es,s’) r (lv,s”) (x,s) r (s(r(x)),s) r(x) LocT xLId(LW) (x=e,s) r (v,s’[v/r(x)])) (e,s) r (v,s’) eLExp(LW) vValue xLId(LW) Altri esprimono proprio il fatto che stiamo dando una semantica a grandi passi (f(es),s) r r(f)(lv,s’) (es,s) r (lv,s’) fLId(LW) esLExps(LW) lv Value+

Dichiarazioni di variabili Denotazionale SOS a grandi passi [d ds (r,s) ] = (r”,s”) [d] (r,s) = (r’,s’) [ds] (r’,s’) = (r”,s”) (d ds,r,s)  (l,r”,s”) (d,r,s)  (l,r’,s’) (ds,r’,s’)  (l,r”,s”) dLDec(LW) dsLDecs(LW) [t x](r,s) = (r[l/x],s[/l]) Nuova(l,r,s) (t x,r,s)  (l, r[l/x],s[/l]) Nuova(l,r,s) xLId(LW) tLType(LW) [t x = e](r,s) = (r[l/x],s’[v/l]) [e](r,s) = (v ,s’) Nuova(l,r,s’) (t x = e,r,s)  (l, r[l/x],s’[v/l]) (e,s) r (v,s’) Nuova(l,r,s’) eLExp(LW) xLId(LW) tLType(LW)

Dichiarazioni di funzioni ricorsive: void [void f(T x) {sts}](r,s) = (r[F/f],s) (void f(T x) {sts},r,s)  (l, r[F/f],s) Dove F : [T]  States  {*}  States è definita induttivamente da tutte le regole della semantica più le seguenti due: F(v,sc) = (*,s’-{l}) [sts] (r[/f,l/x],sc[v/l]) = s’ F(v,sc) = (*,s’-{l}) (sts, sc[v/l]) r[/f,l/x] (l, s’) Nuova(l,r,sc) [f(e)] (r[/f],s1) = (*,s”) F(u,s’) = (*,s”) [e](r[/f],s1) = (u ,s’) (f(e), s1) r[/f] (*,s”) F(u,s’) = (*,s”) (e, s1) r[/f] (u, s’)

Dichiarazioni di funzioni ricorsive: BType [RT f(T x) {sts result e}](r,s) = (r[F/f],s) (RT f(T x) {sts result e},r,s)  (l, r[F/f],s) Dove F : [T]  States  [RT]  States è definita induttivamente da tutte le regole della semantica più le seguenti due: Nuova(l,r,sc) F(v,sc) = (a,s”-{l}) [sts] (r[/f,l/x],sc[v/l]) = s’ [e](r[/f,l/x], s’)= (a ,s”) F(v,sc) = (a,s”-{l}) (sts, sc[v/l]) r[/f,l/x] (l, s’) (e, s’) r[/f,l/x] (a, s”) Nuova(l,r,sc) [f(e)] (r[/f],s1) = (a ,s”) F(u,s’) = (a ,s”) [e](r[/f],s1) = (u ,s’) (f(e), s1) r[/f] (a, s”) F(u,s’) = (a,s”) (e, s1) r[/f] (u, s’)

Statements 1 [if (e) {sts} else {sts’}](r,s) = s” [st sts ] (r,s) = [st] (r,s) = s’ [sts] (r,s’) = s” s” (st sts, s) r (l, s”) (st, s) r (l, s’) (sts, s’) r (l, s”) stLStat(LW) stsLstats(LW) [e](r,s) = (v ,s’) [e;](r,s) = s’ (e, s) r (v, s’) (e;, s) r (l, s’) eLExp(LW) [if (e) {sts} else {sts’}](r,s) = s” [e](r,s) = (tt ,s’) [sts] (r,s’) = s” (if (e) {sts} else {sts’}, s) r (l, s”) (e, s) r (true, s’) (sts, s’) r (l, s”) [if (e) {sts} else {sts’}](r,s) = s” [e](r,s) = (ff ,s’) [sts’] (r,s’) = s” (if (e) {sts} else {sts’}, s) r (l, s”) (e, s) r (false, s’) (sts’, s’) r (l, s”)

Statements 2: while [while (e) {sts}](r,s) = [e](r,s) = (ff ,s’) s’ (while (e) {sts}, s) r (l, s’) (e, s) r (false, s’) [while (e) {sts}](r,s) = s0 [e](r,s) = (tt ,s’) [sts] (r,s’) = s” [while (e) {sts}](r,s”) = s0 (while (e) {sts}, s) r (l, s0) (e, s) r (true, s’) (sts, s’) r (l, s”) (while (e) {sts}, s”) r (l, s0)

Problema dei valori Consideriamo la semantica dell’espressione 3 + 2. Per valutarne la semantica possiamo solo usare la regola della somma (3+2,s) r (5,s”) v + v’ =5 (3,s) r (v,s’) (2,s’) r (v’,s”) ______?____?____?______ ______?____?____?______ Non ci sono regole per completare alberi di questa forma. In realtà in tutte le regole (che ce l’hanno) la valutazione di un’espressione dovrebbe essere opzionale, perché se l’espressione è già un valore non va ulteriormente elaborata. Quindi, ad esempio, ci vorranno regole tipo (e+v’,s) r (a,s’) (e,s) r (v,s’) v + v’ =a (v+e’,s) r (a,s’) (e’,s) r (v’,s’) v + v’ =a (v+v’,s) r (a,s) v + v’ =a (while (false) {sts}, s) r (l, s) (t x = v,r,s)  (r[l/x],s[v/l]) Nuova(l,r,s’) eLExp(LW) xLId(LW) tLType(LW) (v;, s) r (l, s)

Relazione con la semantica denotazionale Le due semantiche coincidono, fatti i dovuti aggiustamenti tecnici, cioè adeguate le due notazioni: [d]Decs(r,s)=(r’,s’) se e solo se (d,r,s)  (l, r’, s’) [st]Stats (r,s)=s’ se e solo se (st,s) r (l, s’) [e]Exps(r,s)=(v,s’) se e solo se (e,s) r (v, s’) e modulo una traduzione fra i valori (usati nella semantica denotazionale) e le loro descrizioni sintattiche (usate nella semantica operazionale) Non sono necessarie prove, o meglio la prova è banale, perché le due semantiche sono descritte da regole “isomorfe” (a volta partizionate in modo diverso, a seconda che le espressioni coinvolte già rappresentino valori) Quindi i due approcci hanno gli stessi limiti. In particolare, non danno informazioni in caso di non terminazione. Questo può essere riduttivo in caso di sistemi che sono progettati in modo non terminante (e.g. sistemi operativi)