10/10/2013 Fondamenti di Informatica CdL Ingegneria Meccanica A.A. 2013/14 Docente: Ing. Ivan Bruno Elementi di programmazione 1. 2. 3. Algoritmi e linguaggi di programmazione Definizione di un linguaggio di programmazione Grammatica e Linguaggi 1 10/10/2013 Programmazione È l’attività con cui si predispone l’elaboratore a eseguire un particolare insieme di azioni su particolari dati, allo scopo di risolvere un problema. Dati Elaboratore Elettronico (input) Risultati (output) Problemi da risolvere I problemi che siamo interessati a risolvere con l’elaboratore sono di natura molto varia: Dati due numeri trovare il maggiore Dato un elenco di nomi e relativi numeri di telefono trovare il numero di telefono di una determinata persona Dati a e b, risolvere l’equazione ax+b=0 Stabilire se una parola viene alfabeticamente prima di un’altra Somma di due numeri interi Scrivere tutti gli n per cui l’equazione: Xn+Yn = Zn ha soluzioni intere (problema di Fermat) Ordinare una lista di elementi Calcolare il massimo comun divisore fra due numeri dati. Calcolare il massimo in un insieme. …. 2 10/10/2013 Risoluzione dei problemi La descrizione del problema non fornisce (in generale) un metodo per risolverlo. Affinché un problema sia risolvibile è però necessario che la sua definizione sia chiara e completa Non tutti i problemi sono risolvibili attraverso l’uso del calcolatore. Esistono classi di problemi per le quali la soluzione automatica non è proponibile. Ad esempio: se il problema presenta infinite soluzioni per alcuni dei problemi non è stato trovato un metodo risolutivo per alcuni problemi è stato dimostrato che non esiste un metodo risolutivo automatizzabile Risoluzione dei problemi La risoluzione di un problema è il processo che, dato un problema e individuato un opportuno metodo risolutivo, trasforma i dati iniziali nei corrispondenti risultati finali. Affinché la risoluzione di un problema possa essere realizzata attraverso l’uso del calcolatore, tale processo deve poter essere definito come sequenza di azioni elementari. 3 10/10/2013 Algoritmo Un algoritmo è una sequenza finita di mosse che risolve in un tempo finito una classe di problemi. L'esecuzione delle azioni nell'ordine specificato dall'algoritmo consente di ottenere, a partire dai dati di ingresso, i risultati che risolvono il problema. Metodo Risolutivo (algoritmo ) Esecutore Dati ESECUTORE una macchina astratta capace di eseguire le azioni specificate dall’algoritmo. Risultati Algoritmi: proprietà Eseguibilità: ogni azione dev’essere eseguibile dall’esecutore in un tempo finito. Non ambiguità: ogni azione deve essere univocamente interpretabile dall'esecutore. Finitezza: il numero totale di azioni da eseguire, per ogni insieme di dati di ingresso, deve essere finito. 4 10/10/2013 Algoritmi: proprietà (2) Quindi, l’algoritmo deve: essere applicabile a qualsiasi insieme di dati di ingresso appartenenti al dominio di definizione dell’algoritmo essere costituito da operazioni appartenenti ad un determinato insieme di operazioni fondamentali essere costituito da regole non ambigue, cioè interpretabili in modo univoco qualunque sia l’esecutore (persona o “macchina”) che le legge. Algoritmi e programmi Ogni elaboratore è una macchina in grado di eseguire azioni elementari su oggetti detti DATI. L’esecuzione delle azioni è richiesta all’elaboratore tramite comandi elementari chiamati ISTRUZIONI espresse attraverso un opportuno formalismo: il LINGUAGGIO di PROGRAMMAZIONE. La formulazione testuale di un algoritmo in un linguaggio comprensibile a un elaboratore è detta programma. 5 10/10/2013 Programma Un programma è un testo scritto in accordo alla sintassi e alla semantica di un linguaggio di programmazione. Un programma è la formulazione testuale, in un certo linguaggio di programmazione, di un algoritmo che risolve un dato problema. Algoritmo & programma Passi per la risoluzione di un problema: individuazione di un procedimento risolutivo scomposizione del procedimento in un insieme ordinato di azioni ALGORITMO rappresentazione dei dati e dell’algoritmo attraverso un formalismo comprensibile dal calcolatore LINGUAGGIO DI PROGRAMMAZIONE Problema Metodo risolutivo Algoritmo Programma Linguaggio di Programmazione 6 10/10/2013 Algoritmi equivalenti Due algoritmi si dicono equivalenti quando: hanno lo stesso dominio di ingresso; hanno lo stesso dominio di uscita; in corrispondenza degli stessi valori del dominio di ingresso producono gli stessi valori nel dominio di uscita. Due algoritmi equivalenti forniscono lo stesso risultato ma possono avere diversa efficienza e possono essere profondamente diversi! Algoritmi: esempi Soluzione dell’equazione ax+b=0 leggi i valori di a e b calcola -b dividi quello che hai ottenuto per a e chiama x il risultato stampa x Calcolo del massimo di un insieme Scegli un elemento come massimo provvisorio max Per ogni elemento i dell’insieme: se i>max eleggi i come nuovo massimo provvisorio max Il risultato è max 7 10/10/2013 Algoritmi: esempi Stabilire se una parola P viene alfabeticamente prima di una parola Q leggi P,Q ripeti quanto segue: se prima lettera di P < prima lettera di Q allora scrivi vero altrimenti se prima lettera P > Q allora scrivi falso altrimenti (le lettere sono =) togli da P e Q la prima lettera fino a quando hai trovato le prime lettere diverse. Linguaggio & Programma Dato un algoritmo, un programma è la sua descrizione in un particolare linguaggio di programmazione Un linguaggio di programmazione è una notazione formale che può essere usata per descrivere algoritmi. 8 10/10/2013 Linguaggi di Programmazione I linguaggi sono classificati in: Low level Linguaggio macchina & Linguaggio Assembly High level C/C++, Pascal, Delphi, Java, Cobol…. Linguaggi di Programmazione I linguaggi low level sono strettamente legati all’architettura interna del computer Ad ogni singola azione corrisponde una linea di programma (rapporto 1 a 1) I linguaggi high level sono più “vicini” al nostro modo di pensare Devono essere opportunamente tradotti per essere compresi da un computer 9 10/10/2013 Relazione tra linguaggi di programmazione START: MOV AX, BX CMP AX, 12h JZ EQUAL INT 21h RET EQUAL: MOV BL, 82h Linguaggio Assembly Assemblatore (Assembler) void main ( ){ int x, y; printf(“Hello world\n”); if(x>=0) stampa(y); else x++;} // C/C++ Linguaggio High Level Compilatore o Interprete Computer - Linguaggio Macchina Compilatore vs Interprete I compilatori traducono automaticamente un programma dal linguaggio L a quello macchina (per un determinato elaboratore). Durante la traduzione verificano la correttezza di ciascuna istruzione. La traduzione termina quando non ci sono più errori sintattici. Al termine della traduzione il programma è pronto per essere eseguito. 10 10/10/2013 Compilatore vs Interprete Gli interpreti sono programmi capaci di eseguire direttamente un programma in linguaggio L istruzione per istruzione. Verificano la correttezza sintattica di ogni istruzione durante l’esecuzione. In presenza di istruzioni ripetute (cicli) queste sono verificate e tradotte come se fossero da eseguire per la prima volta. Prestazioni: I programmi compilati sono in generale più efficienti e più veloci di quelli interpretati. Le fasi della compilazione: Compilatore: opera la traduzione di un programma sorgente (scritto in un linguaggio ad alto livello) in un programma oggetto. Linker: (collegatore) nel caso in cui la costruzione del programma oggetto richieda l’unione di più moduli o librerie (compilati separatamente), il linker provvede a collegarli formando un unico programma eseguibile. Debugger: consente di eseguire passo-passo un programma, controllando via via quel che succede, al fine di scoprire ed eliminare errori non rilevati in fase di compilazione. 11 10/10/2013 Ambiente di sviluppo Editor File sorgente Compilatore Ambiente/Software File oggetto di Sviluppo Debugger Librerie Linker File eseguibile Risultati Programma in memoria Loader S.O Come sviluppare un programma Qualunque sia il linguaggio di programmazione scelto occorre: Se il linguaggio è compilato: Scrivere il testo del programma e memorizzarlo su supporti di memoria permanenti (fase di editing); Compilare il programma, ossia utilizzare il compilatore che effettua una traduzione automatica del programma scritto in un linguaggio qualunque in un programma equivalente scritto in linguaggio macchina; Eseguire il programma tradotto. Se il linguaggio è interpretato: Usare l’interprete per eseguire il programma. 12 10/10/2013 Definizione di un linguaggio Aspetti caratteristici del linguaggio: Esistenza di un insieme di parole chiave Sintassi: l’insieme di regole formali per la scrittura di programmi in un linguaggio, che dettano le modalità per costruire espressioni legali nel linguaggio stesso. Semantica: l’insieme dei significati da attribuire alle espressioni legali (sintatticamente corrette) costruite nel linguaggio. Sintassi di un linguaggio Un vocabolario V è un insieme di simboli. L’insieme V* di tutte le sequenze finite di simboli in V viene indicato come universo linguistico. Esempio: Sia V={p,c}, allora V* contiene tutte le parole composte con le due lettere di qualsiasi lunghezza e la parola nulla (λ) V*={λ,p,c,pp,pc,cp,cc,ppp,ppc,….} Un linguaggio L sul vocabolario V è un sottinsieme di V* un linguaggio costruito sull’insieme V={p,c} potrebbe essere costituito da tutte le parole in cui la p compare in posizione pari L { , c, cp, cc, ccc, cpc, cccp,} V* 13 10/10/2013 Sintassi di un linguaggio La definizione della sintassi di un linguaggio è legata alla determinazione dei limiti del sottoinsieme V* Limiti che devono consentire la definizione di una rappresentazione finita. Tali limiti possono essere imposti attraverso la formalizzazione di una grammatica Grammatica di un linguaggio Si definisce grammatica G=<V,N,S,P> dove: V è il vocabolario e i simboli sono detti simboli terminali N è un insieme disgiunto da V, i cui elementi sono detti categorie sintattiche S è un elemento di N detto simbolo iniziale P è un insieme di relazioni di N su (N U V)* detto produzioni o regole sintattiche, definito come sottoinsieme del prodotto cartesiano N x (N U V)* p = <n, η> oppure n→η con: nN e η sequenza di elementi appartenenti o ad N o a V 14 10/10/2013 Esempio di grammatica S = frase; V = {UN, GATTO, MANGIA, TOPO, VELOCEMENTE, GIRA, LENTAMENTE, BIANCO, IL, GRASSO, MAGRO}; N = {frase, soggetto, predicato, frase-nominale, lista-di-aggettivi, articolo, nome, aggettivo, verbo, avverbio}; P={ frase→soggetto predicato, soggetto →frase_nominale, frase_nominale → articolo nome aggettivo, frase_nominale → articolo nome, articolo →”UN”, articolo →”IL”, nome →”Gatto”, nome →”Topo”, predicato →verbo frase_nominale, predicato →verbo avverbio, verbo →”Gira”, verbo →”Mangia”, aggettivo →”Grasso”, aggettivo →”Magro”, avverbio →”Lentamente”, avverbio →”Velocemente” …. } Grammatica e linguaggio Una grammatica definisce un linguaggio se valgono le seguenti regole Derivazione diretta Siano pre e post elementi di (N U V)*. Sia a0N e 1 (N U V)*. Si dice che pre 1 post deriva direttamente da pre a0 post, e si indica con: 1 pre post pre a0 post → 1 se P contiene la produzione a0→1 Esempio: 1 articolo nome aggettivo → articolo “Gatto” aggettivo nome →”Gatto” 15 10/10/2013 Grammatica e linguaggio Derivazione indiretta: Sia 0 e N elementi in (N U V)*. Si dice che N deriva 0 , e si indica con: 0 → N se esiste una sequenza di elementi i (N U V)* tali che: 1 i [1,N] i-1→ i Esempio: frase_nominale → “IL” “Gatto” “Magro” Produzioni: frase_nominale → articolo nome aggettivo nome →”Gatto” articolo →”IL” aggettivo → “Magro” Grammatica e linguaggio Un linguaggio LG definito dalla grammatica G=<V,N,S,P> sul vocabolario V è l’insieme degli elementi di V* che derivano dal simbolo iniziale S attraverso le categorie sintattiche N e le produzioni P 16 10/10/2013 Produzioni descritte mediante Diagrammi Sintattici frase Frase nominale Mangi a Frase nominale Gira Velocement e Frase nominale Un Gatto Il Topo Aggettivo Esempio: espressioni aritmetiche Definire un linguaggio per cui: a+b*(c-d) è legale mentre a+b-*c non lo è a, b, c e d sono delle variabili l’insieme che le contiene lo chiamiamo var = {a,b,c,…,pippo,….} +,-,/,* sono gli operatori (,) indicano una precedenza Da un punto di vista simbolico il vocabolario V del linguaggio è costituito da questi simboli: V = var U {+,-,*,/,(,)} Poiché stiamo considerando espressioni aritmetiche, possiamo denotare con expr una categoria sintattica e assumerla come simbolo iniziale della grammatica: S = expr 17 10/10/2013 Esempio: espressioni aritmetiche Produzioni: expr→var Una espressione legale tra parentesi è essa stesa una espressione legale expr → expr op expr una variabile è essa stessa una espressione legale expr →(expr) Una combinazione di due espressioni legali per mezzo di un operatore op è ancora una espressione legale op costituisce anche una categoria sintattica costruita sugli operatori +,-,*,/ op →+, op →-, op →*, op →/ Produzioni associate ad op Esempio: espressioni aritmetiche Categorie sintattiche N N = {expr, var, op} Nota: var vale anche come categoria sintattica Insieme delle produzioni P P = { expr→var , expr→expr , expr→(expr) , expr→expr op expr, op→+, op→-, op→*, op→/, var→a, …..} 18 10/10/2013 Esempio: espressioni aritmetiche Verifica se a+b*(c-d) è un espressione legale ovvero si può ridurre al simbolo iniziale expr Essendo a, b, c e d simboli di var: var+var*(var-var) → a+b*(c-d) Applicando expr→var più volte Applicando le produzioni di op più volte Applicando poi expr → expr op expr e expr →(expr) E nuovamente expr → expr op expr Concatenando il tutto (tornando indietro) expr → a+b*(c-d) expr+expr*(expr - expr ) → var+var*(var-var) expr op expr op (expr op expr ) → expr+expr*(expr - expr ) expr op expr → expr op expr op (expr op expr ) expr → expr op expr Esempio: espressioni aritmetiche Nel caso a+b-*c applicando le produzioni si arriva al caso: expr op op expr → a+b-*c Ci si ferma perché non esiste alcuna regola di produzioni da applicare L’espressione non può essere ridotta al simbolo iniziale expr e pertanto l’espressione di partenza non è legale 19 10/10/2013 Albero sintattico Nodo radice Il processo di riduzione visto nell’esempio può essere convenientemente rappresentato attraverso un albero sintattico Un albero è una struttura costituita da un insieme di nodi sui quali è definita una relazione di successione Nodi intermedi Livello i Nodi foglia Un nodo ha un unico predecessore e più Nell’albero sintattico: successori I nodi rappresentano simboli Il nodo che non ha elementari e produzioni predecessori è definito radice Gli archi esprimono le relazioni (root) dell’albero di derivazione diretta tra nodi in Nodi senza successori si base all’insieme P della definiscono nodi foglia grammatica Albero sintattico Validità - Data una sequenza di simboli del vocabolario, se sulla sequenza può essere costruito un albero che si chiude su una radice (simbolo iniziale) allora la sequenza costituisce un’istanza della categoria sintattica associata alla radice stessa (a) e (b) sono valide ed esprimono due diverse forme di riduzione per l’espressione a+b*(c-d) (c) mostra l’albero non richiudibile sul simbolo iniziale per l’espressione non legale a+b-*c 20 10/10/2013 Ambiguità a+b*(d-c) produce 2 alberi sintattici validi ma genera Ambiguità Da evitare con la definizione di regole di precedenza nell’applicazione delle riduzioni ad esempio sugli operatori aritmetici Definizione: Una grammatica è ambigua se: esiste almeno una stringa di simboli terminali che ammette più alberi di derivazione Ambiguità di una grammatica La riduzione dell’ambiguità di una grammatica può essere raggiunta con l’introduzione di nuove categorie sintattiche e regole di produzione aggiuntive nel caso della grammatica delle espressioni aritmetiche introduzione di regole che definiscono le precedenze degli operatori aritmetici. Categorie sintattiche: fatt (fattore) term (termine) expr (espressione) Regole di produzione modificate <expr>::=<expr> “+” < term > |<expr> “-” < term > | < term > <term>::=< term >”*”< fatt > | < term > “/” < fatt > | < fatt > < fatt >::=“(“< expr >”)” | <var> 21 10/10/2013 Ambiguità di una grammatica Verifica: a+b*c var+var*var var+fatt*fatt var+term*fatt var+term fatt+term term+term expr+term expr <expr>::=<expr> “+” <term> |<expr> “-” <term> | <term> <term>::=< term >”*”< fatt > | <term> “/” <fatt> | <fatt> <fatt>::=“(“<expr>”)” | <var> Codifica BNF I diagrammi sintattici consentono di descrivere l’insieme delle produzioni P. Esiste un formalismo alternativo che semplifica la rappresentazione delle produzioni: BNF (Backus Naur Form) Convenzioni BNF: η::= n significa che P contiene la produzione η→ n η::= n1 | n2 significa che P contiene le produzioni η→n1 e η→ n2 e che sono alternative η::= npre [n] npost significa che P contiene le produzioni η→ npre npost e η→ npre n npost , e che n è opzionale η::= npre {n}min npost significa che P contiene le produzioni che riducono η ad una sequenza aperta npre e chiusa da npost e che può contenere un numero di ripetizioni del termine n variabile tra il min e max. Se non specificati è valido un qualunque numero >=0 EBNF (Extended Backus Naur Form) è una estensione della precedente, dove le categorie sintattiche sono definite racchiuse tra parentesi angolari < > 22 10/10/2013 Esempio S = frase; V = {UN, GATTO, CANE, MONTE, MANGIA, TOPO, VELOCEMENTE, GIRA, LENTAMENTE, BIANCO, IL, GRASSO, MAGRO}; N = {frase, soggetto, predicato, frase-nominale, lista-di-aggettivi, articolo, nome, aggettivo, verbo, avverbio}; P = { “Rappresentazione EBNF”} Rappresentazione EBNF: <frase> ::= <soggetto> <predicato> “.” <soggetto> ::= <frase-nominale> <predicato> ::= <verbo> (<frase-nominale> | <avverbio>) <frase-nominale> ::= <articolo> <nome> [<lista-diaggettivi>] <lista-di-aggettivi> ::= <aggettivo> {“,” <aggettivo>} <articolo> = “UN” | “IL” <nome> ::= “GATTO” | “TOPO” | ”MONTE” | “CANE” <aggettivo:: = “NERO” | “BIANCO” | “MAGRO” | “GRASSO” <verbo> ::= “GIRA” | “MANGIA” <avverbio> ::= “VELOCEMENTE” | “LENTAMENTE” ( | = oppure; { } = ripetizione; ( ) = raggruppano alternative con una sola occorrenza; [ ] = parte opzionale) Esempio Per la grammatica delle espressioni aritmetiche: P = { expr→var , expr→expr , expr→(expr) , expr→expr op expr, op→+, op→-, op→*, op→/, var→a, …..} In EBNF le regole di produzione diventano: <expr>::= <var> | <expr><op><expr>| “(“<expr>”)” | <expr> <op>::= + | - | * | / <var> ::= a | b | c | …. 23 10/10/2013 Grammatica Contestuale (Cenni) Là dove le regole di produzione non sono in grado di risolvere il problema di ambiguità o dove servano delle condizioni di applicazione si ricorre a caratterizzare la grammatica con “vincoli contestuali” attraverso annotazioni complementari Grammatica contestuale Esempio di vincoli (linguaggio di programmazione): numero parametri attuali = parametri formali un identificatore deve essere dichiarato prima dell’uso compatibilità dei tipi in un assegnamento ecc Nonostante aumenti la complessità della grammatica aumenta la comprensibilità Il processo di interpretazione si articola ora in 3 fasi Verifica lessicale: l’espressione appartiene all’universo linguistico V* (è composta da simboli del vocabolario V) Verifica sintattica: l’espressione è legale Verifica contestuale: le espressioni legali sono comparati contro i vincoli contestuali Semantica e Sintassi La semantica di un linguaggio si occupa dell’interpretazione del linguaggio, ovvero del significato delle frasi corrette sintatticamente Esempio di frasi corrette sintatticamente in italiano, ma non tutte valide – in grassetto le frasi valide il gatto mangia il topo il topo mangia il monte il cane mangia il topo il monte beve il cane La semantica di un’espressione legale consiste nel valore che questa restituisce 24 10/10/2013 Semantica e Sintassi Si consideri le espressioni della logica Booleana <expr>::= var | “(“<expr>”)”|<expr1> | <expr1><expr2>| <expr1><expr2> <expr>::=<var> (<expr>) = (<var>) Nel caso di variabili booleane il valore restituito da (<var>) vale true o false; <expr>::=“(“<expr1>”)” (<expr>) = (<expr1>) <expr>::= <expr1> (<expr>) = (<expr1>) <expr>::= <expr1><expr2> (<expr>) = (<expr1>) (<expr2>) <expr>::= <expr1> <expr2> (<expr>) = (<expr1>) (<expr2>) Operatori booleani A B AB A A A B AB 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1 OR NOT AND 25 10/10/2013 Sematica e Sintassi Valutazione semantica dell’espressione: a (b c) assumendo a=true, b=false e c=false e indicando Ttrue e Ffalse Si costruisce l’albero sintattico e si valutano le espressioni intermedie con Il valore di <expr> è true 26