Descrizione dei Linguaggi di Programmazione Nicola Fanizzi Corso di Linguaggi di Programmazione Dipartimento di Informatica Università degli Studi di Bari 4 marzo 2014 Sommario 1 2 Livelli di Descrizione Grammatiche e Sintassi Grammatiche Libere Backus-Naur Form Derivazione e Linguaggi Alberi di Derivazione Ambiguità EBNF 3 4 5 6 Vincoli Sintattici Contestuali Semantica Statica Compilatori Analisi Lessicale Analisi Sintattica Analisi Semantica Fasi Finali Semantica Pragmatica ed Implementazione N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 2 / 51 Livelli di Descrizione Definire un Linguaggio I Linguaggio di programmazione = linguaggio artificiale per esprimere algoritmi destinatario della comunicazione = calcolatore dalla Linguistica, per descrivere un linguaggio: Sintassi Lessico (Morfologia) Semantica Pragmatica In informatica c’è un altro livello: Implementazione N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 3 / 51 Livelli di Descrizione Definire un Linguaggio II Sintassi ”quali sono le frasi corrette ?” Lessico ”quali sequenze di simboli costituiscono le parole del linguaggio ?” Relazione tra simboli dell’alfabeto indica le sequenze di parole corrette: relazione tra segni Semantica ”cosa significa una frase corretta ?” Relazione tra segni e significati N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 4 / 51 Livelli di Descrizione Definire un Linguaggio III Pragmatica ”come (e quando) usare una frase corretta e sensata ?” Dipendenza dal contesto (linguistico) anche a parità di significato Implementazione ” come eseguire le frasi corrette, rispettandone la semantica ?” Vale solo per i linguaggi di programmazione N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 5 / 51 Livelli di Descrizione Terminologia Una frase è una stringa di caratteri presi da un certo alfabeto (finito) Un linguaggio è un insieme di frasi Ma, come mostrato, ci sono vari livelli di descrizione Un lessema (lemma) è un’unità di livello più basso (lessico) di un linguaggio es.: *, somma, begin Un token è una categoria di lessemi es., <identificatore> N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 6 / 51 Grammatiche e Sintassi Formalismi per Descrivere la Sintassi Backus-Naur Form e Grammatiche libere da contesto Metodi più diffusi per descrivere la sintassi dei linguaggi di programmazione Extended BNF Migliora la leggibilità e la scrivibilità della BNF Grammatiche e riconoscitori N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 7 / 51 Grammatiche e Sintassi Grammatiche Libere Grammatiche Libere da Contesto I Grammatiche libere da contesto sviluppate da Noam Chomsky a metà degli anni ’50 sono generatori di linguaggi: tesi alla descrizione della sintassi del linguaggio naturale definiscono una classe di linguaggi detti liberi da contesto N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 8 / 51 Grammatiche e Sintassi Grammatiche Libere Grammatiche Libere da Contesto II Dato un alfabeto A (finito e non vuoto) si costruisce l’insieme (infinito) A∗ di tutte le stringhe su A stringa vuota (senza simboli di A) denotata con Grammatica libera G = (NT, T, R, S) NT insieme di simboli non terminali o variabili T insieme dei simboli terminali (es. A oppure A∗ ) R insieme di regole di produzione V −→ w con V ∈ NT, w ∈ (T ∪ NT)∗ S ∈ NT scopo, simbolo distintivo, iniziale o di partenza N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 9 / 51 Grammatiche e Sintassi Grammatiche Libere Grammatiche Libere da Contesto III Esempio grammatica per il linguaggio delle stringhe di palindrome su A = {a, b} G = ({P}, A, R, P) con R={P P P P P N. Fanizzi Linguaggi di prog.+Lab −→ −→ −→ −→ −→ a b aP a bPb } Descrizione dei Linguaggi di Programmazione 4 marzo 2014 10 / 51 Grammatiche e Sintassi Grammatiche Libere BNF I Backus-Naur Form (1959) Introdotta da John Backus (e Peter Naur) per descrivere ALGOL metalinguaggio linguaggio atto a descrivere un altro linguaggio stessa espressività delle grammatiche libere si usano astrazioni per rappresentare classi di strutture sintattiche fungono da variabili per la sintassi i.e. simboli non-terminali N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 11 / 51 Grammatiche e Sintassi Grammatiche Libere BNF II Basi Non-terminali astrazioni BNF Terminali lessemi / token Grammatica insieme di regole esempi di regole BNF: 1 2 <ident_list> ::= identifier | identifier , <ident_list> <if_stmt> ::= if <logic_expr> then <stmt> N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 12 / 51 Grammatiche e Sintassi Grammatiche Libere BNF III Regole BNF Una regola ha una parte sinistra (left-hand side: LHS) e una parte destra (right-hand side: RHS) fatte di simboli terminali e non-terminali LHS ::= RHS Grammatica BNF: insieme finito e non vuoto di regole Una regola per un simbolo non-terminale può avere più d’una parte destra, separate dal simbolo ”|” 1 2 <stmt> ::= <single_stmt> | begin <stmt_list> end N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 13 / 51 Grammatiche e Sintassi Grammatiche Libere BNF IV Esempio descrivere liste Le liste sono sintatticamente descritte usando la ricorsione 1 2 <ident_list> ::= identifier | identifier, <ident_list> Esempio <program> <stmts> 3 <stmt> 4 <var> 5 <expr> 6 <term> 1 2 N. Fanizzi grammatica di un mini-linguaggio ::= ::= ::= ::= ::= ::= <stmts> <stmt> | <stmt> ; <stmts> <var> = <expr> a | b | c | d <term> + <term> | <term> - <term> <var> | const Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 14 / 51 Grammatiche e Sintassi Grammatiche Libere Derivazioni I Una derivazione consiste nella ripetuta applicazione di regole di una grammatica: ogni stringa di simboli terminali e non coinvolta nella derivazione si chiama forma di frase (o forma sentenziale) una frase è una forma di frase di soli terminali una singola applicazione di una regola, indicata con =⇒, è una relazione tra due forma di frase: derivazione diretta es., aPa =⇒ abPba (si applica la regola P −→ bPb) la derivazione è la chiusura transitiva di =⇒, ∗ e si indica con =⇒ ∗ es. P =⇒ aPa =⇒ abPba =⇒ abba quindi P =⇒ abba NB: Vale anche per zero applicazioni di regole N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 15 / 51 Grammatiche e Sintassi Grammatiche Libere Derivazioni II <program> =⇒ =⇒ 3 =⇒ 4 =⇒ 5 =⇒ 6 =⇒ 7 =⇒ 8 =⇒ 1 2 N. Fanizzi <stmts> <stmt> <var> =<expr> a =<expr> a =<term> +<term> a =<var> +<term> a =b +<term> a =b +const Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 16 / 51 Grammatiche e Sintassi Grammatiche Libere Derivazioni III linguaggio generato da una grammatica G = (NT, T, R, S) è costituito dall’insieme delle stringhe derivabili dal simbolo iniziale di G Formalmente: ∗ L(G) = {w ∈ T ∗ | S =⇒ w} N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 17 / 51 Grammatiche e Sintassi Grammatiche Libere Alberi di Derivazione I Albero Struttura costituita da un insieme di nodi N (se non vuota) si distinguono: La radice r Un partizionamento (S1 , S2 , ..., Sn ) dei nodi di N \ {r} dove ogni Si ha la struttura di un albero Grafo connesso T = (N, A) N = insieme dei nodi A = insieme degli archi (ni , nj ) |N| = |A| + 1 radice r, livello(r) = 0 Nodo n padre di tutti i nodi figli (ordinati) m1 , ..., mp , tali che (n, mj ) ∈ A Se livello(n) = i allora ∀m tale che (n, m) ∈ A : livello(m) = i + 1 N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 18 / 51 Grammatiche e Sintassi Grammatiche Libere Alberi di Derivazione II Albero di derivazione Rappresentazione gerarchica di una derivazione: I nodi sono etichettati con elementi di T ∪ NT ∪ {} Nodo radice = S Nodo interno (con figli) è un A ∈ NT: Se i figli di A sono etichettati X1 . . . Xn dove ∀Xi ∈ T ∪ NT, allora deve esistere in R la regola A −→ X1 ...Xn Se è l’unico figlio di A, allora deve esistere in R la regola A −→ Nodi foglia (senza figli) sono simboli di T ∪ {} N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 19 / 51 Grammatiche e Sintassi Grammatiche Libere Alberi di Derivazione III Esempio albero di derivazione <program> <stmts> <stmt> <expr> <var> <term> <program> ::= <stmts> <stmts> ::= <stmt> | <stmt> ; <stmts> <stmt> ::= <var> = <expr> <var> ::= a | b | c | d <expr> ::= <term> + <term> | <term> - <term> <term> ::= <var> | const <term> <var> a N. Fanizzi = Linguaggi di prog.+Lab b + const Descrizione dei Linguaggi di Programmazione 4 marzo 2014 20 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità I Una derivazione sinistra (leftmost derivation) è una derivazione nella quale, in ogni forma di frase intermedia, si espande il non-terminale più a sinistra <program> =⇒ =⇒ =⇒ =⇒ <stmts> =⇒ <stmt> =⇒ <var> =<expr> a =<expr> =⇒ a =<term> +<term> a =<var> +<term> =⇒ a =b +<term> a =b +const La derivazione destra (rightmost derivation) si definisce analogamente NB: Ci sono derivazioni che non sono né destre né sinistre N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 21 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità II Una grammatica è ambigua sse esiste (almeno) una forma di frase prodotta attraverso due o più alberi di derivazione distinti NB: ma una stringa può però avere più derivazioni distinte senza che la grammatica sia ambigua Equivalentemente: sse essa è prodotta attraverso due derivazioni canoniche dello stesso tipo (sinistre o destre) N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 22 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità III Esempio 1 2 Una grammatica ambigua per generare espressioni <expr> ::= <expr> <op> <expr> | const <op> ::= / | <expr> <expr> <op> <expr> <expr> <expr> <op> <expr> <op> <expr> const N. Fanizzi - const <expr> <expr> <op> <expr> / Linguaggi di prog.+Lab const const - Descrizione dei Linguaggi di Programmazione const / const 4 marzo 2014 23 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità IV Esempio grammatica non ambigua per generare espressioni Se usiamo l’albero di derivazione per indicare i livelli di precedenza degli operatori, non abbiamo ambiguità 1 2 <expr> ::= <expr> - <term> | <term> <term> ::= <term> / const | const <expr> <expr> <op> <expr> <expr> <op> <expr> const N. Fanizzi Linguaggi di prog.+Lab - const / const Descrizione dei Linguaggi di Programmazione 4 marzo 2014 24 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità V Esempio L’associatività degli operatori può anche essere codificata in una grammatica 1 2 <expr> ::= <expr> + <expr> | const <expr> ::= <expr> + const | const ambigua non ambigua <expr> <expr> <expr> const N. Fanizzi Linguaggi di prog.+Lab + const + Descrizione dei Linguaggi di Programmazione const 4 marzo 2014 25 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità VI Esempio Istruzione condizionale Grammatica ambigua per il costrutto if in JAVA <istruzione> ::= ... <if_else> | <altra> <altra> ::= ... <blocco> | <vuota> | <return> 3 <if_else> ::= if "(" <espressione> ")" <istruzione> 4 | if "(" <espressione> ")" <istruzione> 5 else <istruzione> 1 2 Quanti alberi per la forma di frase seguente ? if (a) if (b) p else q N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 26 / 51 Grammatiche e Sintassi Grammatiche Libere Ambiguità VII Grammatica non ambigua per il costrutto if in JAVA <istruzione> <altra> 3 <no_if_breve> 4 <if> 5 <if_else> 1 2 6 7 <if_else2> 8 N. Fanizzi ::= ::= ::= ::= ::= ... <if> | <if_else> | ... <blocco> | <vuota> <altra> | <if_else2> if "("<espressione>")" if "("<espressione>")" else <istruzione> ::= if "("<espressione>")" else <no_if_breve> Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione <altra> | <return> <istruzione> <no_if_breve> <no_if_breve> 4 marzo 2014 27 / 51 Grammatiche e Sintassi Grammatiche Libere EBNF I Le parti opzionali sono poste tra parentesi quadre [...] 1 <proc_call> ::= <ident> [ "(" <expr_list> ")" ] Le parti destre alternative sono poste tra parentesi tonde (...) e separate con barre verticali | 1 <term> ::= <term> ( +| -) const Ripetizioni (di 0 o più elementi) sono poste tra parentesi graffe {...} 1 N. Fanizzi <ident> ::= letter { letter | digit } Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 28 / 51 Grammatiche e Sintassi Grammatiche Libere EBNF II Confronto BNF <expr> ::= | 3 | 4 <term> ::= 5 | 6 | 1 2 <expr> + <expr> <term> <term> * <term> / <factor> <term> <term> <factor> <factor> EBNF 1 2 <expr> ::= <term> { ( + | - ) <term> } <term> ::= <factor> { ( * | / ) <factor> } N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 29 / 51 Vincoli Sintattici Contestuali Vincoli Sintattici Contestuali La correttezza di una frase può dipendere dal contesto ma questo NON si può regolare attraverso una grammatica libera Esempi Identificatore da dichiarare prima dell’uso Inizializzare ogni variabile prima dell’uso Numero dei parametri effettivi pari al numero di parametri formali Espressione nella parte destra di un assegnazione di tipo compatibile con quello della variabile nella parte sinistra Non modificabilità della variabile che controlla il ciclo for Metodi sovrascritti da metodi con firma uguale (o compatibile) ... N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 30 / 51 Vincoli Sintattici Contestuali Semantica Statica Semantica Statica La necessità di gestire i vincoli della sintassi contestuale porta alla nozione di semantica statica ossia verificabile sul testo del programma sorgente diversa dalla semantica dinamica riguarda il significato del programma in esecuzione Esempio grammatiche con attributi grammatiche libere + vincoli ed azioni N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 31 / 51 Compilatori Compilatori - Schema Logico sorgente [caratteri] Analizzatore Lessicale lista token Analizzatore Sintattico albero sintattico Tabella dei Simboli Analizzatore Semantico albero aumentato Gestione Errori Gen. Codice Intermedio codice intermedio Ottimizzazione Codice codice ottimizzato Gen. Codice Oggetto codice oggetto N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 32 / 51 Compilatori Analisi Lessicale Analisi Lessicale Detta anche scanning o lexing da cui scanner (o lexer) è il (sotto)programma che la implementa Lettura dei caratteri dal sorgente (da sinistra a destra in una passata) e costruzione di una lista di token Esempio la stringa a = 12 * indice++; genera 7 token: a , = , 12, * , indice, ++, ; Per descrivere gli elementi del lessico basta una sottoclasse delle grammatiche libere detta delle grammatiche regolari (o lineari sin./des.) N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 33 / 51 Compilatori Analisi Sintattica Analisi Sintattica Detta anche parsing da cui parser è il (sotto)programma che la implementa lettura dei token dalla lista spesso lo scanner è un sottoprogramma chiamato dal parser costruzione dell’albero di derivazione (implicita/esplicita) token = foglie genera un errore se non si è in grado di costruire l’albero N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 34 / 51 Compilatori Analisi Semantica Analisi Semantica Vengono effettuati i controlli dei vincoli contestuali (ossia di semantica statica) L’albero viene aumentato via via con queste nuove informazioni Per gli identificatori viene gestita appositamente la tabella dei simboli Esempio variabile: tipo, punto di dichiarazione, scope, . . . N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 35 / 51 Compilatori Fasi Finali Fasi Finali Generazione della forma intermedia Visita dell’albero per generare codice Forma intermedia: ottimizzabile, portabile, . . . es. quadruple, triple, ecc, . . . Ottimizzazione rimozione codice inutile, espansione delle chiamate di sottoprogrammi, fattorizzazione espressioni, ottimizzazione dei cicli, . . . Generazione del codice oggetto Segue spesso un’altra fase di ottimizzazione es. immagazzinamento nei registri di variabili molto utilizzate N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 36 / 51 Semantica Semantica Specifica del linguaggio attraverso Metodi formali Semantica denotazionale si usano le funzioni Semantica operazionale si usa un formalismo a basso livello: Automi Assiomi algebrico-logici Stati e transizioni (SOS)1 Altre: Semantica assiomatica, algebrica,... 1 vedi Appendice [slide 40]. N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 37 / 51 Pragmatica ed Implementazione Pragmatica ed Implementazione Pragmatica ”a che serve / come usare un certo costrutto linguistico ?” Obiettivo: migliorare il software Fattori in evoluzione: convenzioni e stile Esempi divieto di uso del goto ? modificabilità delle variabili dei cicli for ? scelta della modalità di passaggio di parametri scelta delle iterazioni più indicate Implementazione ”come vengono implementati i costrutti?” ” a quale costo ?” Connessa alla realizzazione pratica dei compilatori scelte di tipo ingegneristico N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 38 / 51 Riferimenti Gabbrielli & Martini: Linguaggi di Programmazione, McGraw-Hill 2a edizione N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 39 / 51 Appendice Semantica Formale Semantica Formale Basi Stato Modello di memoria Stato σ : sequenza finita di coppie (X, n) nello stato σ la variabile X ha il valore n Operazioni σ[X ← v] nuovo stato simile a σ dove la variabile X prende il nuovo valore v σ(X) ritrova il valore della variabile X nello stato σ valore indefinito se la variabile non viene trovata N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 41 / 51 Semantica Formale Transizione Transizione Trasformazione dello stato del programma provocata dalla valutazione di un costrutto / esecuzione di un comando [sintassi PASCAL-like] Forma semplice: hc, σi → σ 0 c costrutto / comando σ stato di partenza σ 0 stato d’arrivo Esempio comando nullo: hskip, σi → σ N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 42 / 51 Semantica Formale Transizione Transizioni Complesse Composte da passi più piccoli espressi da transizioni: hc, σi → hc0 , σ 0 i es. per la selezione, una delle transizioni è la seguente: hif tt then c1 else c2 , σi → hc1 , σi Condizionali basati su regole: se c ha una transizione allora c0 ha una certa transizione hc1 , σ1 i → hc10 , σ10 i hc, σi → hc2 , σ2 i → hc20 , σ20 i hc0 , σ 0 i se c1 partendo dallo stato σ1 si può trasformare in c10 nello stato premesse conseguenze σ10 e c2 partendo da σ2 può trasformarsi in c20 nello stato σ20 allora il comando c partendo da σ può trasformarsi in c0 nello stato σ 0 N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 43 / 51 Semantica Formale Espressioni aritmetiche Espressioni aritmetiche hn, σi → n hX, σi → σ(X) hn+m, σi → p hn-m, σi → p se n − m = p e n ≥ m se n + m = p ha1 , σi → ha, σi ha2 , σi → ha, σi ha1 + a2 , σi → ha + a2 , σi ha1 + a2 , σi → ha1 + a, σi ha1 , σi → ha, σi ha2 , σi → ha, σi ha1 - a2 , σi → ha - a2 , σi ha1 - a2 , σi → ha1 - a, σi N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 44 / 51 Semantica Formale Espressioni logiche Espressioni logiche I htt, σi → tt hff, σi → ff hn = m, σi → tt hn = m, σi → ff se n 6= m se n = m hnot ff, σi → tt hnot tt, σi → ff hb1 and b2 , σi → b se b = b1 ∧ b2 secondo la tavola di verità della congiunzione ∧ b indica un valore booleano tt o ff N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 45 / 51 Semantica Formale Espressioni logiche Espressioni logiche II ha1 , σi → ha, σi ha2 , σi → ha, σi ha1 = a2 , σi → ha = a2 , σi ha1 = a2 , σi → ha1 = a, σi hb1 , σi → hb, σi hb2 , σi → hb, σi hb1 and b2 , σi → hb and b2 , σi hb1 and b2 , σi → hb1 and b, σi hb, σi → hb0 , σi hnot b, σi → hnot b0 , σi NB: nelle transizioni per la valutazione delle espressioni aritmetico-logiche lo stato rimane invariato: occorre calcolare un valore in un dato stato N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 46 / 51 Semantica Formale Comandi Comandi I hskip, σi → σ hX:=n, σi → σ[X ← n] ha, σi → ha0 , σi hX:=a, σi → hX:=a0 , σi hc1 , σi → σ 0 hc1 , σi → hc10 , σ 0 i hc1 ; c2 , σi → hc2 , σ 0 i hc1 ; c2 , σi → hc10 ; c2 , σ 0 i N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 47 / 51 Semantica Formale Comandi Comandi II hif tt then c1 else c2 , σi → hc1 , σi hif ff then c1 else c2 , σi → hc2 , σi hb, σi → hb0 , σi hif b then c1 else c2 , σi → hif b0 then c1 else c2 , σi hwhile b do c, σi → hif b then c;while b do c else skip, σi N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 48 / 51 Semantica Formale Computazione Computazione I Sequenza di transizioni concatenate non ulteriormente estendibile in cui ogni transizione è premessa di qualche regola Due tipi di computazione terminanti: finite divergenti: infinite (loop) N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 49 / 51 Semantica Formale Computazione Computazione II Computazione finita stato σ = [(X, 6)] e comando c = X:=1; while not (X=0) do X:=X-1 | {z } c0 hc, σi → hc0 , σ[X ← 1]i → hif not(X=0) then X:=X-1;c0 else skip, σ[X ← 1]i → hif not(1=0) then X:=X-1;c0 else skip, σ[X ← 1]i → hif not ff then X:=X-1;c0 else skip, σ[X ← 1]i → hif tt then X:=X-1; c0 else skip, σ[X ← 1]i → hX:=X-1; c0 , σ[X ← 1]i → hX:=1-1; c0 , σ[X ← 1]i → hX:=0; c0 , σ[X ← 1]i → hc0 , σ[X ← 0]i → hif not(X=0) then X:=X-1; c0 else skip, σ[X ← 0]i → hif not(0=0) then X:=X-1; c0 else skip, σ[X ← 0]i → hif not tt then X:=X-1; c0 else skip, σ[X ← 0]i → hif ff then X:=X-1; c0 else skip, σ[X ← 0]i → hskip, σ[X ← 0]i → σ[X ← 0] N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 50 / 51 Semantica Formale Computazione Computazione III Computazione infinita stato τ = [(X, 0)] e comando d = X:=1; while (X=1) do skip {z } | d0 hd, τ i → hd0 , τ [X ← 1]i → hif (X=1) then skip; d0 else skip, τ [X ← 1]i → hif (1=1) then skip; d0 else skip, τ [X ← 1]i → hif tt then skip; d0 else skip, τ [X ← 1]i → hskip; d0 , τ [X ← 1]i → hd0 , τ [X ← 1]i → . . . N. Fanizzi Linguaggi di prog.+Lab Descrizione dei Linguaggi di Programmazione 4 marzo 2014 51 / 51
© Copyright 2024 Paperzz