MODULO 2 - Linguaggi di Programmazione
Transcript
MODULO 2 - Linguaggi di Programmazione
Materiale didattico preparato dal dott. Stefano Ferilli Corso di Programmazione Linguaggi di Programmazione Dott. Pasquale Lops [email protected] Università degli Studi di Bari Dipartimento di Informatica Corso di Programmazione - DIB 1/47 Linguaggio • Insieme di sequenze di simboli appartenenti ad un definito lessico, posti in sequenza secondo una opportuna grammatica o sintassi) • Per descriverlo è necessario un meta-linguaggio – Linguaggio che parla di un linguaggio Corso di Programmazione - DIB 2/47 Messaggio • Sequenza di frasi espresse in un linguaggio – Analizzabile dal punto di vista • Sintattico – Si verifica la forma linguistica in cui è codificato (sintassi) • Semantico – Si individua il significato associato alla forma linguistica (semantica) Corso di Programmazione - DIB 3/47 1 Comunicazione Diretta • Requisiti per i due interlocutori: l’estensore del messaggio – al momento della sua formulazione e il ricevitore – al momento della ricezione diano al messaggio eguale significato Corso di Programmazione - DIB 4/47 Comunicazione Indiretta • Cause: – Il ricevitore non conosce il linguaggio usato per la stesura del messaggio – Estensore e ricevitore hanno un diverso grado di conoscenza del linguaggio – Tra i due mancano adeguate convenzioni per un’interpretazione unica del messaggio • Occorre un traduttore Corso di Programmazione - DIB 5/47 Programma • Messaggio di comunicazione fra l’uomo e la macchina – Insieme di frasi costruite secondo regole molto rigide • Eliminazione di ambiguità nell’interpretazione dei comandi da parte della macchina – Necessità di linguaggi molto precisi • Le istruzioni obbediscono a rigorose regole grammaticali Corso di Programmazione - DIB 6/47 2 Sistema di Calcolo • Gerarchia di componenti software e hardware – Software applicativo (es. pacchetti ad usi speciali) • Insieme di programmi da utilizzare per applicazioni particolari • Generalmente scritti in un linguaggio ad alto livello • Forniti direttamente da costruttori di computer o ditte specializzate nella produzione di programmi – Software di sistema (sistemi operativi, traduttori, ecc.) • Insieme dei programmi che forniscono servizi e svolgono funzioni vitali per il software applicativo – Hardware (CPU, memorie, dispositivi di I/O, ecc.) Corso di Programmazione - DIB 7/47 Comunicazione Uomo-Macchina • Processore nudo – La macchina comprende il linguaggio macchina • Costituito da un insieme di istruzioni elementari • Ogni istruzione è una stringa di cifre binarie che specifica un’operazione e la cella di memoria implicata nell’operazione • Processore vestito – Macchina in grado di comprendere un linguaggio di livello superiore • Usato per facilitare il compito di programmare la soluzione di un problema Corso di Programmazione - DIB 8/47 Linguaggio Naturale • Usato per la comunicazione verbale fra esseri umani – Fonti di ambiguità: • Evoluzione – Neologismi, Arcaismi • Polisemia – Parole con significati differenti a seconda del contesto • Intrinseca – …una vecchia porta la sbarra… – Inadatto alla comunicazione con la macchina Corso di Programmazione - DIB 9/47 3 Linguaggi di Programmazione • A basso livello • Ad alto livello – Più vicini alla struttura reale della macchina ed al suo linguaggio – Più vicini al linguaggio dei problemi – Più facili da comprendere per l’uomo – Portabili • Utilizzabili, senza modifiche, su diversi tipi di macchine Corso di Programmazione - DIB 10/47 Linguaggi di Programmazione ad alto livello • Procedurali • Non procedurali – Descrivono i passi necessari per ottenere i risultati desiderati – Esprimono le proprietà dei risultati che si vogliono ottenere • “come” • “cosa” – Basati sui concetti di • Variabile • Assegnamento – Esempio Radice quadrata di y • Quel valore x tale che x*x = y Corso di Programmazione - DIB 11/47 Linguaggi di Programmazione Sintassi • L’insieme delle regole che indicano quali sono le istruzioni formali permesse – Poche, semplici, rigide • Il programma va accuratamente controllato dal punto di vista formale per garantire la correttezza sintattica – Codifica ambigua o non interpretabile • Controllo delegato al traduttore Corso di Programmazione - DIB 12/47 4 Linguaggi di Programmazione Semantica • Riguarda il contenuto informativo ed il significato di una frase – Il lavoro più grosso è verificare e controllare il programma sul fronte logico per garantire la correttezza a livello semantico • Informazione trasmessa non corrispondente allo scopo desiderato – Connessa all’analisi del problema e l’algoritmo Corso di Programmazione - DIB 13/47 Sintassi e Semantica Esempio • “Io ho andato” – Errata sintatticamente • “La penna sta mangiando” – Corretta sintatticamente • Forma – Errata semanticamente • Significato Corso di Programmazione - DIB 14/47 Traduttore • Programma che traduce in linguaggio macchina programmi in un linguaggio di livello superiore – Analizza i messaggi (comandi) e verifica che siano scritti (codificati) in un linguaggio a lui noto • Correttezza sintattica – Attribuisce alle sequenze di simboli l’opportuno significato in modo da eseguire le giuste azioni • Interpretazione unica di ogni istruzione – Fa parte del software di sistema • Livello intermedio della gerarchia software-hardware Corso di Programmazione - DIB 15/47 5 Traduttori • Nei programmi ad alto livello operano su due tipi di entità: – Istruzioni • Molto più potenti che nel linguaggio macchina – Strutture di dati (liste, sequenze, alberi, ecc.) • Non direttamente disponibili al livello di linguaggio macchina • Devono essere rappresentate in termini di bit, indirizzi e legami tra locazioni Corso di Programmazione - DIB 16/47 Traduttori Processore nudo Processore vestito Linguaggio di Traduzione Programmazione Linguaggio Macchina • Interpreti • Compilatori – Specifici per ogni linguaggio – Forniti entrambi dai sistemi di sviluppo del software per i linguaggi supportati Corso di Programmazione - DIB 17/47 Interpretazione • Dopo l’analisi sintattica, la traduzione procede passo passo con l’esecuzione – Traduzione ed esecuzione istruzione per istruzione • Ogni istruzione tradotta tante volte quante viene eseguita Programma Dati Interprete Risultati Corso di Programmazione - DIB 18/47 6 Compilazione • Il programma originale (Sorgente) è analizzato sintatticamente e tradotto in codice oggetto, quindi eseguito – Traduzione completamente effettuata prima che cominci l’esecuzione • Ogni istruzione è tradotta una sola volta Programma Codice Oggetto Compilatore Macchina Fisica Dati Risultati Corso di Programmazione - DIB 19/47 Interpreti vs. Compilatori Programma sorgente residente in memoria Programma sorgente non residente in memoria + Semplici – Efficienti + Ottimizzabili + Efficienti Tempo e Spazio Tempo e Spazio + Interattivi + Errori comprensibili – Interattivi + Errori scoperti prima Riferiti al sorgente Riferiti al codice oggetto Corso di Programmazione - DIB 20/47 Processo di Compilazione Fasi • Analisi Lessicale – Divisione della stringa di caratteri del programma in token • Segni di interpunzione, nomi di dati, operatori, parole riservate • Analisi Sintattica – Definizione della struttura sintattica del programma usando le regole grammaticali del linguaggio • Generazione del Codice – Generazione di appropriate istruzioni in linguaggio macchina per ogni elemento sintattico del programma • L’insieme finale di queste istruzioni è il programma oggetto Corso di Programmazione - DIB 21/47 7 Processo di Compilazione • Le fasi sono tra loro interrelate – I moduli di programma responsabili dell’analisi sintattica possono utilizzare • I moduli dell’analisi lessicale per ottenere un token • I moduli di generazione del codice per produrre il codice oggetto dell’istruzione analizzata • Per capire come vengono effettuate le analisi è necessaria la teoria dei linguaggi Corso di Programmazione - DIB 22/47 Alfabeto • Insieme finito e non vuoto di simboli primitivi (caratteri) tramite i quali è possibile costruire gli elementi base del linguaggio – Esempio: Alfabeto dei numeri reali A = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, +, –, .} • 23 354.35 –86.6 +5589.0 Corso di Programmazione - DIB 23/47 Concatenazione di Simboli di un alfabeto • L’oggetto ottenuto prendendo nell’ordine i simboli da concatenare – Esempio: Dato l’alfabeto per i numeri reali • La concatenazione di 3 e 4 è 34 • La concatenazione di +, 4, 7, . e 5 è +47.5 • La concatenazione di 4, ., 7, . e 5 è 4.7.5 !!!! – Non tutte le sequenze di simboli che si possono costruire sono frasi significative del linguaggio Corso di Programmazione - DIB 24/47 8 Stringa o Parola su un alfabeto • Sequenza di simboli ottenuta come concatenazione di un numero finito di elementi dell’alfabeto – Λ denota la stringa non contenente alcun simbolo (parola vuota) • La concatenazione di due parole – Parola formata dai simboli della prima seguiti da quelli della seconda – Esempi: Λp = pΛ = p per ogni parola p la concatenazione di +3 con 4.5 è +34.5 Corso di Programmazione - DIB 25/47 Prodotto di Insiemi di Parole su un alfabeto • Insieme ottenuto concatenando ogni parola di un insieme con ogni parola dell’altro – Esempio: concatenando {1, 21, 1.4} con {2, 398} si ottiene {12, 1398, 212, 21398, 1.42, 1.4398} Corso di Programmazione - DIB 26/47 Potenza di un Alfabeto A • A è un particolare insieme di parole su A – Si possono considerare i prodotti • AA • AAA • … – Esempio: per l’alfabeto dei numeri reali fanno parte di A3 • 213 3.5 –29 +55 21. .65 4.. … – Le ultime due stringhe non fanno parte dei numeri reali Corso di Programmazione - DIB 27/47 9 Potenza di un Alfabeto A • An – Parole costituite da n simboli dell’alfabeto A • • • • • A0 = {Λ} A1 = A A2 = AA A3 = AAA … – n è detta lunghezza della parola Corso di Programmazione - DIB 28/47 Chiusura di un Alfabeto A • Bisogna delimitare l’universo linguistico esprimibile – Tutte le possibili parole di lunghezza finita costituite da simboli dell’alfabeto • A+ = A1 ∪ A2 ∪ … ∪ An ∪ … – Insieme di tutte le parole su A di lunghezza finita • Unione di tutti gli insiemi di parole di varia lunghezza • A* = {Λ} ∪ A+ – Chiusura di A Corso di Programmazione - DIB 29/47 Linguaggio su un alfabeto A • Un sottoinsieme di A* – Tra le parole di A* ci sono parole ammesse nel linguaggio e parole non ammesse • Linguaggio Generato da una Grammatica – Insieme delle frasi costruite, a partire dall’alfabeto, secondo le regole specificate da una grammatica Corso di Programmazione - DIB 30/47 10 Simboli Non Terminali • Non fanno parte dell’alfabeto – Sono variabili – Rappresentano opportune sequenze di simboli • Nomi che specificano le categorie sintattiche – Componenti delle frasi del linguaggio generato dalla grammatica • Il loro insieme è detto alfabeto dei simboli non terminali – Su di esso è costruito il metalinguaggio Corso di Programmazione - DIB 31/47 Simboli Non Terminali Esempio • Linguaggio naturale – Parole classificate in • frase, soggetto, predicato, articolo, nome, verbo, ecc. – <soggetto > → <articolo> <nome> il cane • Linguaggio algebrico – <formula> → <variabile> = <espressione aritmetica> x = y + z * 12 Corso di Programmazione - DIB 32/47 Regola o Produzione • Coppia ordinata di parole (p, q) tale che, se – A è l’alfabeto dei simboli terminali – N è l’alfabeto dei simboli non terminali p e q possono appartenere tanto ad A* ∪ N* • Scriviamo p → q • “la stringa p produce la stringa q” • “la stringa p può essere riscritta come q” – p (≠ Λ) è detta parte sinistra – q è detta parte destra Corso di Programmazione - DIB 33/47 11 Regola o Produzione Convenzione • Le parti destre di produzioni con la stessa parte sinistra si possono riunire come alternative in un’unica parte destra, separate col simbolo | (“oppure”) – Esempio p→q p→r si può compattare in p→q|r|s|t p→s p→t Corso di Programmazione - DIB 34/47 Grammatica • Insieme delle regole che consentono di definire, tra tutte le possibili sequenze di simboli di lunghezza finita che si possono costruire, quelle lecite (frasi) – Le regole di formazione delle frasi del linguaggio si dicono regole di produzione • Coinvolgono simboli dell’alfabeto ed altri simboli che rappresentano categorie sintattiche Corso di Programmazione - DIB 35/47 Grammatica • Quadrupla [Chomsky] G = < A, N, α, P > –A –N –α –P alfabeto terminale alfabeto non terminale scopo della grammatica (simbolo di partenza) insieme delle regole di produzione Corso di Programmazione - DIB 36/47 12 Grammatica Esempio • Grammatica che genera il linguaggio dei numeri pari – A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} – N = {α, β} • α indica il numero pari – Scopo per cui costruiamo la grammatica • β indica un numero qualunque – P = { α → βα | 0 | 2 | 4 | 6 | 8, β→ 0|1|2|…|8|9| β0 | β1 | β2 | … | β8 | β9 } Corso di Programmazione - DIB 37/47 Grammatica Esempio • A = {il, la, cane, donna, mangia, dorme} • N={ <frase>, <soggetto>, <articolo>, <nome>, <verbo>} • α = <frase> • P={ <frase> → <soggetto> <verbo> <soggetto> → il <nome> | la <nome> il <nome> → il cane la <nome> → la donna <verbo> → dorme | mangia } Corso di Programmazione - DIB 38/47 Generazione di Stringhe • Una stringa di terminali e non, S1, genera un’altra stringa S2 – Direttamente (S1 ⇒ S2) – Indirettamente (S1 ⇒* S2) se quest’ultima si ottiene dalla prima applicando – Una produzione – Una sequenza di produzioni della grammatica Corso di Programmazione - DIB 39/47 13 Forma (Normale) di Backus-Naur BNF • Notazione per scrivere la grammatica – Usata per specificare la sintassi di un linguaggio di programmazione • Simboli non terminali scritti fra parentesi angolari <…> • Simbolo → sostituito da ::= Corso di Programmazione - DIB 40/47 Forma di Backus-Naur Esempio • Grammatica per i numeri pari (infiniti) – <numero pari>::= 0 | 2 | 4 | 6 | 8 | <numero><numero pari> – <numero> ::= 0 | 1 | 2 | … | 8 | 9 | <numero> 0 | … | <numero> 9 – 64932 è ottenibile? • <numero pari>::= <numero><numero pari> ::= <numero>2 ::= <numero>32 ::= <numero>932 ::= <numero>4932 ::= 64932 Corso di Programmazione - DIB 41/47 Forma di Backus-Naur Esempio • Grammatica per le stringhe palindrome – Simmetria speculare – <frase> ::= Λ – <frase> ::= a<frase>a – <frase> ::= b<frase>b • È possibile derivare infinite stringhe Corso di Programmazione - DIB 42/47 14 Carte Sintattiche • Grafi costituiti da blocchi uniti da frecce – Blocchi arrotondati • Simboli terminali del linguaggio – Blocchi rettangolari • Simboli non terminali – Rimandi alla corrispondente carta sintattica – Frecce • Indicano le vie percorribili per costrutti validi – I bivi rappresentano possibilità alternative Corso di Programmazione - DIB 43/47 Carte Sintattiche • Iniziando dalla carta principale, seguire le frecce – Quando si dipartono scegliere una strada • Attraversando un blocco arrotondato – Trascriverne il contenuto • Attraversando un blocco rettangolare, passare alla carta corrispondente e seguirla – Ogni carta ha esattamente un inizio e una fine, come il blocco Corso di Programmazione - DIB 44/47 Carte Sintattiche • Ogni traiettoria percorsa nel verso delle frecce definisce un costrutto sintattico valido del linguaggio • Tutti i simboli terminali incontrati nel percorso ed in quella data sequenza costituiscono una frase legale del linguaggio Corso di Programmazione - DIB 45/47 15 Carte Sintattiche Esempio Corso di Programmazione - DIB 46/47 Carte Sintattiche Esempio • Identificatore: – Lettera seguita (eventualmente) da lettere o cifre • <identificatore> ::= <lettera> | <lettera><stringa alfanumerica> • <stringa alfanumerica> ::= <lettera> | <cifra> | <lettera><stringa alfanumerica> | <cifra><stringa alfanumerica> • <lettera> ::= a | b | c | d | e | f | g | h | … | z • <cifra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 lettera lettera cifra Corso di Programmazione - DIB 47/47 16