Corso di Linguaggi di Programmazione

Documenti analoghi
LINGUAGGI DI ALTO LIVELLO. Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware

LINGUAGGI DI ALTO LIVELLO

Linguaggi di Programmazione

Linguaggi e Ambienti di Programmazione

Linguaggi, Traduttori e le Basi della Programmazione

C++ Barriera di astrazione. Barriera di astrazione. Basic. Basic. Lisp. Lisp. Pascal. Prolog. Pascal. Prolog. Cobol. Fortran IMPERATIVI FUNZIONALI

Grammatiche Parse trees Lezione del 17/10/2012

LINGUAGGI DI ALTO LIVELLO

Dall algoritmo al calcolatore: concetti introduttivi. Fondamenti di Programmazione

LINGUAGGI DI ALTO LIVELLO. Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware

Unità Didattica 2 I Linguaggi di Programmazione

Fasi di un Compilatore

Lez. 8 La Programmazione. Prof. Pasquale De Michele (Gruppo 2) e Raffaele Farina (Gruppo 1) 1

2. Sintassi e Semantica

Descrizione dei Linguaggi di Programmazione

Grammatiche. Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione

Linguaggi Liberi dal Contesto. Linguaggi Liberi dal Contesto

Introduzione alla programmazione

I Linguaggi di Programmazione

Elementi di programmazione

Il linguaggio di programmazione Python

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Corso di Programmazione Linguaggi di Programmazione. Linguaggio. Messaggio

Il Concetto Intuitivo di Calcolatore. Esercizio. I Problemi e la loro Soluzione. (esempio)

Corso di Programmazione Linguaggi di Programmazione

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Corso di Linguaggi e Traduttori 1 AA GRAMMATICHE

Informatica 3. LEZIONE 2: Sintassi e semantica

Problemi, algoritmi, calcolatore

Il concetto di calcolatore e di algoritmo

Un po di storia sui linguaggi

Università degli studi Roma Tre. linguaggio Java. A cura di A. Orlandini. Linguaggi: Sintassi e Semantica - Il. Il linguaggio Java

GRAMMATICHE DEI LINGUAGGI DI PROGRAMMAZIONE. Cosimo Laneve

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

ALGORITMI: PROPRIETÀ FONDAMENTALI

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Riconoscitori e analizzatori sintattici. Scanning e parsing. Funzionamento di un parser: la tecnica Shift/Reduce. Esempio

Lez. 5 La Programmazione. Prof. Salvatore CUOMO

Introduzione agli Algoritmi

LA LOGICA DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

Elementi di programmazione

Informatica e Comunicazione Digitale Crediti formativi 9. No, ma la frequenza è fortemente consigliata Lingua di erogazione

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Corso di Fondamenti di Informatica Linguaggi di Programmazione

Definizione di Grammatica

Le basi del linguaggio Java

Linguaggi di Programmazione

Le basi del linguaggio Java

Espressività e limitazioni delle grammatiche regolari

Macchine astratte, linguaggi, interpretazione, compilazione

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Semantica e traduzione guidata dalla sintassi

Definizioni syntax-directed

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

Cos'e un linguaggio di programmazione?

AXO - Architettura dei Calcolatori e Sistema Operativo. organizzazione strutturata dei calcolatori

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Corso di Linguaggi di Programmazione

Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici

Intro. Traduzione guidata dalla sintassi. Attributi. Due notazioni a diversi livelli. Due notazioni a diversi livelli. Il flusso concettuale

DAGLI ALGORITMI AI LINGUAGGI. Linguaggi di Programmazione

Teoria dell Informazione

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Funzioni, Stack e Visibilità delle Variabili in C

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso

Programmazione = decomposizione basata su astrazioni

Introduzione alla Programmazione Logica ed al linguaggio PROLOG

Introduzione alla programmazione strutturata

Unità di apprendimento 6. Il software: dal linguaggio alla applicazione

Strutture di controllo iterative

LA SINTASSI DEI LINGUAGGI DI PROGRAMMAZIONE. Ivan Lanese

Corso di Linguaggi di Programmazione

Espressioni e Comandi

GRAMMATICA FORMALE. Albero sintattico

Linguaggi Sintassi e Semantica

Macchine Astratte. Nicola Fanizzi Dipartimento di Informatica Università degli Studi di Bari. Linguaggi di Programmazione feb, 2016

Cosa si intende con stato

Codice binario. Codice. Codifica - numeri naturali. Codifica - numeri naturali. Alfabeto binario: costituito da due simboli

Linguaggio C: introduzione

Lezione 6 Introduzione al C++ Mauro Piccolo

LINGUAGGI DI PROGRAMMAZIONE E CODIFICA PROGRAMMI

Linguaggi formali e compilazione

Informatica Generale Andrea Corradini Ancora sui linguaggi di programmazione

Scrivere il software. Scrivere il software. Interprete. Compilatore e linker. Fondamenti di Informatica

Espressioni Regolari

Linguaggi di Programmazione

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1

Le grammatiche formali

Programmazione logica e PROLOG. Esercitazione 1. AI - Carlucci Aiello & Nardi, 2007 Esercitazione 1 0

Linguaggi di programmazione

Fondamenti d Informatica: Linguaggio While. Barbara Re, Phd

Programmazione C Massimo Callisto De Donato

Corso di Linguaggi di Programmazione + Laboratorio

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

Matlab. Istruzioni condizionali, cicli for e cicli while.

LA CODIFICA DELLE INFORMAZIONI

Transcript:

Corso di Linguaggi di Programmazione Lezione 13 Alberto Ceselli alberto.ceselli@unimi.it Dipartimento di Informatica Università degli Studi di Milano 23 Aprile 2013

Riassunto delle puntate precedenti Linguaggi di Programmazione Diversi linguaggi di programmazione usano diversi paradigmi (programming style); Non è facile valutare la qualità di un linguaggio di programmazione. Non è possibile stabilire la correttezza di un programma tramite testing. È impossibile verificare in modo consistente e completo qualsiasi proprietà di un programma che dipenda dall esito della computazione.

Sintassi e semantica Definire un linguaggio Cosa hanno in comune diversi linguaggi? Aspetti importanti di un linguaggio di programmazione (sia da parte di chi lo deve costruire/estendere, sia da parte di chi lo deve utilizzare): sintassi: come si presenta il codice? come è fatto? (forma della sue espressioni, istruzioni ecc) specificata da una grammatica formale (BNF) definisce il parser del compilatore semantica: cosa succede durante l esecuzione di un programma? (significato delle sue espressioni, istruzioni ecc) non esiste uno standard de facto per la descrizione della semantica di un linguaggio definisce le possibili tracce di esecuzione del programma

Sintassi e semantica: esempio Sintassi e semantica Definire un linguaggio Ciclo in Java: sintassi: while (<condizione>) <istruzione> semantica: valuta la condizione, se è falsa termina, altrimenti esegui l istruzione e ricomincia l esecuzione del while N.B. I nun buon LdP la sintassi deve suggerire la semantica.

Linguaggio di Programmazione Sintassi e semantica Definire un linguaggio Definition Un linguaggio di programmazione è un insieme di regole che definiscono un insieme di stringhe (programmi) legali, attribuendo ad ogni stringa un preciso significato. Un linguaggio è definito prescindendo dai dettagli del dispositivo che eseguirà i programmi Alcune caratteristiche implementative possono condizionare i risultati durante l esecuzione Es: il massimo intero rappresentabile varia da macchina a macchina. Problema: come dare una descrizione finita a un linguaggio che ha un numero infinito di frasi?

Sintassi e semantica Definire un linguaggio Regole per la definizione di un linguaggio Lessicali, che descrivono quali sequenze di simboli costituiscono le parole del linguaggio (i.e., come sono fatti i token del linguaggio - identificatori, parole chiave,...) esempio: un intero è una sequenza di caratteri numerici, non separati da spazi. relazione tra simboli dell alfabeto. Sintattiche, che descrivono come le parole del linguaggio possono venire combinate tra di loro per formare istruzioni legali, ovvero quali sequenze di parole sono corrette esempio: un espressione può essere costituita da un espressione seguita dal simbolo + o - e da un altra espressione. relazione tra parole. Semantiche, che descrivono il significato di una frase corretta relazione tra parole e significati.

Sintassi e semantica Definire un linguaggio Classificazione dei Linguaggi (Chomsky 1956-1959) È una classificazione basata sulla complessità delle produzioni delle grammatiche che li generano: Linguaggi di tipo 0 (a struttura di fase) Linguaggi di tipo 1 (dipendenti da contesto) Linguaggi di tipo 2 (libere da contesto) Linguaggi di tipo 3 (regolari) Importante I linguaggi liberi da contesto e i linguaggi regolari sono utilizzati per definire la sintassi dei linguaggi di programmazione. BNF (Backus e Naur) e grammatiche libere da contesto (Chomsky) sono due strumenti teorici molto simili per descrivere Linguaggi di tipo 2. Espressioni regolari e grammatiche regolari sono strumenti per descrivere Linguaggi di tipo 3.

Regole lessicali Le unità sintattiche più piccole sono chiamate lessemi In un linguaggio, un token è una categoria di lessemi (es. identificatori, costanti intere ecc) Esempio: index = 2 * count + 3 Lessemi Tokens index identificatore = costante * operatore count identificatore + operatore 3 costante

Espressioni regolari Per descrivere la forma dei tokens possono essere utilizzate le espressioni regolari espressioni che descrivono stringhe esempio: e ( ) per indicare alternative, [: :] per indicare insiemi di caratteri, * + per indicare ripetizioni esempio: prim(a o) descrive le strighe prima e primo esempio: [:digit:]+ con almeno una cifra descrive tutte le stringhe di naturali esempio: // [:alnum:]* \n descrive una stringa che comincia con //, continua con una sequenza qualsiasi di caratteri alfanumerici, e termina con newline

Sintassi Grammatiche e classificazione Definition Sintassi. La parte della grammatica che contiene le regole di combinazione degli elementi lessicali e significativi, e quindi di formazione delle frasi (Zingarelli). In informatica: l insieme delle regole per la corretta costruzione delle istruzioni in un linguaggio di programmazione. La sintassi fornisce le informazioni necessarie per comprendere la struttura (e quindi parte del significato) di un programma. Identificare la struttura sintattica di un programma è il primo passo sia in caso venga interpretato, sia in caso venga compilato.

Sintassi Grammatiche e classificazione Come definire la sintassi di un LdP? Descrivendo come riconoscere programmi sintatticamente validi in quel LdP (analizzatori sintattici, o parser) Descrivendo come generare programmi sintatticamente validi in quel LdP (generalmente, più espressivo) (anche se nessuno dei due modi è utile per chi deve imparare ad utilizzare il linguaggio!)

Grammatica Grammatiche e classificazione Una grammatica è un metodo generativo per descrivere linguaggi. Formalmente, una grammatica è una quadrupla G = (T, NT, P, S), dove: T è l insieme di simboli terminali di solito indicati con a, b,... NT è l insieme finito di simboli non terminali o variabili di solito indicati con A, B,... P = { α 1, β 1,..., α n, β n } è l insieme delle produzioni dove α e β indicano stringhe miste, e α j contiene almeno un simbolo non terminale per 1 j n ogni coppia α, β P di solito viene scritta come α β S NT è il simbolo iniziale.

Esempio (1) Grammatiche e classificazione Una grammatica per stringhe di palindrome su {a, b, c}. G = (T, NT, P, S) dove: T = {a, b, c}, NT = {S}, P = {S asa, S bsb, S csc, S ɛ, S a, S b, S c}. Un esempio di derivazione (generazione di programma) è S asa absba abba.

Grammatiche e classificazione Come descrivere formalmente un linguaggio? Distinguiamo: Bakus-Naur Form e Grammatiche libere da contesto Metodi piú diffusi per descrivere la sintassi dei linguaggi di programmazione Extended BNF Migliora la leggibilitá della BNF Grafi sintattici Introdotti per descrivere l ALGOL 60 (Taylor, 1961) Ogni regola è descritta da un grafo orientato, dove i simboli non terminali sono racchiusi in rettangoli e i simboli terminali sono racchiusi in rettangoli arrotondati. Ogni stringa valida può essere ottenuta percorrendo i grafi in modo opportuno.

Semantica di un linguaggio Semantica Statica Semantica Dinamica Definisce il significato di ogni costrutto sintattico legale del linguaggio; Distinguiamo semantica statica da semantica dinamica: la semantica statica può essere controllata prima dell esecuzione del programma, perchè non dipende dall esito del calcolo la semantica dinamica deve essere controllata durante l esecuzione del programma, perchè specifica il comportamento atteso durante l esecuzione.

Semantica statica e BNF Semantica Statica Semantica Dinamica Alcune regole semantiche possono essere specificate anche in BNF (non tutte) Regola: Un valore floating point non può essere assegnato ad una variabile di tipo int... può essere specificata in BNF, introducendo nuovi nonterminali e nuove regole. Regola: Nessuna variabile può essere utilizzata prima della sua dichiarazione... non può essere specificata in BNF.

Semantica Statica Semantica Dinamica Semantica statica: Grammatica ad attributi Una grammatica ad attributi è una tripla G, A, E dove: G è una grammatica libera da contesto A è un insieme di attributi associati ai simboli non-terminali e terminali della grammatica G E è un insieme di equazioni per il calcolo dei valori dei vari attributi, dette regole semantiche, associate alle regole di produzione della grammatica G. Le regole semantiche sono scritte in un opportuna notazione, detta metalinguaggio semantico, ad esempio notazioni matematiche, logiche o imperative

Semantica Statica Semantica Dinamica Grammatica ad attributi - Attributi (1) Sia X 0 X 1... X n una regola sintattica, ad ogni simbolo non terminale X i si associano uno o più attributi, A(X i ). Un attributo di X ha un dominio (ad esempio può assumere valori interi o stringhe) e può essere: Sintetizzato Ereditato Intrinseco

Semantica Statica Semantica Dinamica Grammatica ad attributi - Attributi (2) Sintetizzato S(X 0 ) il suo valore dipende da X 1,..., X n : un attributo del padre è calcolato in funzione dei valori degli attributi dei figli. S(X 0 ) = f (A(X 1 ),..., A(X n )) il calcolo va dalle foglie alla radice (ascendente) Ereditato I (X j ) il suo valore dipende da X 0, X 1,..., X n : un attributo di un nodo è calcolato in funzione dal valore degli attributi del suo padre e dei fratelli (a volte solo quelli left-most per non avere cicli). I (X j ) = f (A(X 0 ),..., A(X n )), 1 j n non c è un ordine particolare per il calcolo, tendenzialmente dalla radice alle foglie (discendente) Intrinseco V (X ) prodotto dall esterno (es. analizzatore lessicale o lettura da tastiera). sono A. Ceselli, associabili DI Univ. anche di Milano ai simboli Corso di terminali, Linguaggi di Programmazione quindi alle foglie

Semantica Statica Semantica Dinamica Grammatica ad attributi - Notazioni A.a indica l attributo a del simbolo non terminale A I simboli non terminali che compaiono più volte nella parte destra di una regola di produzione sono indicizzati per distinguere le occorrenze multiple expr T + T diventa expr T [1] + T [2] oppure, E T + T diventa E T 1 + T 2

Semantica Statica Semantica Dinamica Come definire formalmente la semantica (dinamica) di un linguaggio? Non esiste uno standard come nel caso della descrizione formale della sintassi; La descrizione formale rispetto al linguaggio naturale permette di verificare formalmente la correttezza di un programma (vedi theorem prover basati su semantica assiomatica); Principali formalismi utilizzati: semantica operazionale semantica denotazionale semantica assiomatica

Semantica Operazionale Semantica Statica Semantica Dinamica Ottenuta definendo un interprete del linguaggio L su di una macchina virtuale i cui componenti sono descritti in modo matematico ; Il significato di un istruzione consiste nella variazione dello stato della macchina virtuale (registri, program counter, istruzione corrente, etc.) causato dall esecuzione dell istruzione stessa. Esempio: pag 141 Sebesta

Semantica Statica Semantica Dinamica Semantica Operazionale: valutazione - Descrizioni molto complesse - Spesso la macchina virtuale è un linguaggio di programmazione più semplice... che necessita di essere definito formalmente -... infatti, la macchina fisica è macchina virtuale per il linguaggio macchina + Vicina all intuizione di un programmatore (simile ad un manuale) + Usata anche in pratica (per PL/I)

Semantica Denotazionale Semantica Statica Semantica Dinamica Metodo introdotto da Scott e Strachey nel 1971. È il metodo finora più utilizzato. Definisce la semantica di un linguaggio in termini di funzioni ricorsive: per ogni costrutto del linguaggio si definisce un oggetto matematico che lo rappresenti e una funzione che collega istanze di uno stesso costrutto allo stesso oggetto matematico. Lo stato delle variabili viene esaminato e modificato tramite funzioni.

Semantica Denotazionale: esempio Semantica Statica Semantica Dinamica Esempio: assegnamento x := E con associata una funzione M a () { error if M e (E, s) = error M a(i k := E, s) = {< i 1, VARMAP(i 1, s) >,..., < i k, M e (E, s) >,..., < i n, VARMAP(i n, s) >} otherwise

Semantica Statica Semantica Dinamica Semantica Denotazionale: valutazione + Matematicamente rigorosa + Può aiutare il progettista del linguaggio (se un costrutto richiede descrizione complessa, probabilmente risulterà oscuro anche ad un programmatore, ed andrà quindi riprogettato). - Molto complessa - Poco utile per comprendere il linguaggio

Semantica Assiomatica Semantica Statica Semantica Dinamica Introdotta da Floyd nel 1967 e raffinata da Hoare nel 1969. Fondata sulla logica matematica e sul concetto di asserzione Ad ogni istruzione sono associati vincoli sul valore che devono assumere le variabili prima e dopo l esecuzione dell istruzione

Semantica Assiomatica: definizioni Semantica Statica Semantica Dinamica Un asserzione è un espressione logica (o predicato) Se descrive vincoli sul valore delle variabili dopo un istruzione l asserzione è una postcondition. Se descrive vincoli sul valore delle variabili prima di un istruzione l asserzione è una precondition. Esempio: sum = 2 * x + 1... pongo come postcondition: {sum > 1}... ne deriva una precondition, tipo: {x > 100} (oppure {x > 20}) Una postcondition diventa la precondition dell istruzione successiva

Semantica Statica Semantica Dinamica Semantica Assiomatica: weakest preconditions Data una postcondition... tra tutte le preconditions cerchiamo la meno restrittiva che garantisce di rispettare la postcondition... nell esempio precedente la weakest precondition è {x > 0} La postcondition dell ultima istruzione è il risultato del programma Per valutare semanticamente il programma partiamo dalla postcondition dell ultima istruzione e calcoliamo all indietro le weakest preconditions (che diventano le postconditions dell istruzione precedente)

Semantica Assiomatica: esempio Semantica Statica Semantica Dinamica Costrutto di selezione if-then-else {P} if B then S1 else S2 {Q} Regola di inferenza di preconditions (P) data una postcondition (Q): {B and P}S1{Q}, {(not B) and P}S2{Q} {P}if B then S1 else S2{Q} Esempio: if (x > 0) then y := y-1 else y := y+1 (alla lavagna, Sebesta pag 148)

Semantica Statica Semantica Dinamica - Poco chiara come strumento di definizione. - Difficile definire regole di inferenza (a meno di progettare l intero linguaggio con semantica assiomatica in testa) - Poco utilizzata, anche durante il progetto di compilatori + In alcuni casi (programmi piccoli e semplici) permette di provare formalmente la correttezza di un programma. + Può aiutare durante lo sviluppo di programmi, per inserire assertions nel programma stesso

Motivation Struttura di un compilatore Struttura di un interprete Sistemi ibridi Importante Alcune proprietà ( siamo ancora nell ambito della semantica di un linguaggio) degli elementi di un programma sono determinate dall implementazione del linguaggio. Nelle prossime lezioni, analizziamo diversi aspetti dei linguaggi di programmazione, cercando di capire cosa si può valutare in modo automatico, come e perchè. In particolare, parleremo di costrutti o feature safe se il loro corretto utilizzo (semantica) può essere determinato automaticamente dal compilatore costrutti o feature unsafe se il loro corretto utilizzo è a carico del programmatore

Linguaggi e compilatori Struttura di un compilatore Struttura di un interprete Sistemi ibridi Per capire cosa si può valutare automaticamente utilizzando un particolare linguaggio e come dobbiamo avere una sensibilità a basso livello del funzionamento del relativo compilatore / interprete...

Struttura di un compilatore Struttura di un compilatore Struttura di un interprete Sistemi ibridi Vantaggi: massima efficienza! Es. C, C++

Struttura di un interprete Struttura di un compilatore Struttura di un interprete Sistemi ibridi Vantaggi: massima flessibilità! Es. Scheme, Prolog

Sistema ibrido Struttura di un compilatore Struttura di un interprete Sistemi ibridi

Generazione di codice intermedio Struttura di un compilatore Struttura di un interprete Sistemi ibridi Es. Java un compilatore genera solo codice intermedio una macchina virtuale interpreta ed esegue il codice intermedio

Compilatori just-in-time Struttura di un compilatore Struttura di un interprete Sistemi ibridi Es. C# una macchina virtuale riceve il codice quando una porzione di codice deve essere eseguita, la macchina virtuale ne richiede la compilazione viene eseguito il codice compilato il controllo torna alla macchina virtuale N.B. ogni porzione di codice è compilata una sola volta (indipendentemente dal numero di attivazioni)

Linguaggi interpretati e compilati Struttura di un compilatore Struttura di un interprete Sistemi ibridi N.B. in linea di principio, ogni linguaggio può essere sia compilato che interpretato nulla vieta di scrivere interpreti per C. nulla vieta di compilare ed ottimizzare codice SCHEME, ottenendo degli eseguibili.... oppure operare scelte intermedie