Introduzione a Linguaggi formali e compilazione
Upcoming SlideShare
Loading in...5
×
 

Introduzione a Linguaggi formali e compilazione

on

  • 2,198 views

 

Statistics

Views

Total Views
2,198
Views on SlideShare
2,197
Embed Views
1

Actions

Likes
1
Downloads
29
Comments
0

1 Embed 1

http://www.slideshare.net 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Introduzione a Linguaggi formali e compilazione Presentation Transcript

  • 1. LFC Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Linguaggi formali e compilazione Corso di Laurea in Informatica A.A. 2008/2009
  • 2. LFC Linguaggi formali e compilazione Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi
  • 3. LFC Linguaggi formali e compilazione Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi
  • 4. LFC Informazioni generali sul corso Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Sito web: http://algo.ing.unimo.it/people/mauro/dida/2008- 09_LFC/ Ricevimento (nel semestre di lezione): Mercoledì h 14.30-16.00, ufficio del docente Materiale didattico: si veda il sito web Modalità d’esame: scritto (orale solo su richiesta) CFU assegnati: 6
  • 5. LFC Obiettivi formativi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e Due obiettivi principali (che si riflettono nel titolo linguaggi stesso dell’insegnamento). Acquisizione di nozioni di base sulla teoria dei linguaggi formali e degli automi: una delle prime teorie “solide” sulle quali si è sviluppata l’Informatica come disciplina scientifica; fornisce basi per la costruzione di traduttori; è utile in svariati altri campi dell’Informatica. Sviluppo di conoscenze sui compilatori e della capacità di realizzare semplici parser e traduttori.
  • 6. LFC Argomenti trattati Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Alfabeti, stringhe e linguaggi formali Grammatiche e automi Analisi lessicale e analisi sintatica (parsing) Traduzione e compilazione
  • 7. LFC Linguaggi formali e compilazione Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi
  • 8. LFC Parsing Un parser (analizzatore sintattico) è uno strumento Nozioni introduttive che, in termini generali, consente di dare struttura ad Informazioni generali Parsing, traduzione e compilazione una descrizione lineare. Alfabeti, stringhe e linguaggi La struttura viene conferita in accordo a regole espresse generalmente da una grammatica. Alcuni esempi: passare dalla descrizione testuale di un grafo ad una sua rappresentazione in liste di adiacenze; dato un insieme di pagine web, creare un grafo che ne descriva la struttura dei collegamenti; dato un documento XML, creare una rappresentazione dell’informazione in esso contenuta (detta information set) da rendere disponibile all’applicazione client. In tutti i casi, il parsing include un’analisi della correttezza formale (well-formedness) delle stringhe da analizzare.
  • 9. LFC Traduzione Nozioni introduttive Informazioni generali Il parsing opera esclusivamente al livello di sintassi Parsing, traduzione e compilazione (cioè della corretta formazione delle frasi). Alfabeti, stringhe e linguaggi Un traduttore è un programma che effettua la traduzione automatica da un linguaggio ad un altro. Nella traduzione (e quindi nella compilazione) è importante che venga mantenuto il significato (semantica) delle frasi. Che cosa sia il “significato” di una frase dipende però pesantemente dall’ambito applicativo: per un’espressione aritmetica/logica il significato è un valore numerico/di verità; per un programma il significato è il “comportamento indotto” nella macchina (semantica operazionale); esempi da altri campi (Musica, Chimica, ...).
  • 10. LFC Linguaggi formali Nozioni introduttive Informazioni generali Parsing, traduzione e Pur esistendo “tentativi” di applicazione di metodi compilazione Alfabeti, stringhe e informatici alla traduzione di scritti in linguaggio linguaggi naturale, il successo della traduzione automatica è limitato all’ambito dei linguaggi formali. Esempi di linguaggi formali sono linguaggi di programmazione, come C, C++ e Java; linguaggi di descrizione e/o manipolazione di dati, come XML e SQL; in ambito non informatico, il linguaggio della Musica e quello della Chimica (genericamente intesi). È formale un linguaggio che obbedisce a precise regole formali (formalismi) di composizione delle frasi.
  • 11. LFC Compilazione ed interpretazione Nozioni introduttive Il più importante caso di traduzione in ambito Informazioni generali Parsing, traduzione e informatico è la compilazione di linguaggi di alto compilazione Alfabeti, stringhe e livello in linguaggi macchina (o comunque linguaggi linguaggi molto più vicini alla macchina). Un compilatore per un linguaggio L e una macchina M è un traduttore che, data una stringa (programma) in linguaggio L, produce un programma equivalente nel linguaggio macchina di M. Un’alternativa alla compilazione è l’interpretazione diretta dei programmi. Nel caso dell’interpretazione di L su M, un programma in esecuzione su M prende direttamente in input frasi in linguaggio L e le “esegue”, producendo in output il risultato dell’esecuzione.
  • 12. LFC Compilazione ed ed interpretazione Nozioni introduttive Informazioni generali Compilazione ed esecuzione Parsing, traduzione e compilazione Alfabeti, stringhe e Programma P in Compilatore linguaggi Programma codice eseguibile di L per il P in linguaggio L sul computer M computer M CPU di M Risultati Input per P Interpretazione pura Programma P in linguaggio L Interprete del Risultati linguaggio L Input per P
  • 13. LFC Soluzioni “miste” Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Compilazione ed intepretazione in Java Programma P in Programma Compilatore codice intermedio P in Java Java (bytecode) JRE per Risultati computer M Input per P In tutti i casi (anche nell’interpretazione “pura”), le tecniche di compilazione giocano un ruolo fondamentale.
  • 14. LFC Linguaggi compilati e linguaggi interpretati Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione In linea di principio, di uno stesso linguaggio L Alfabeti, stringhe e linguaggi potrebbero esistere implementazioni compilate ed implementazioni interpretate. Nella pratica, i linguaggi “si specializzano” in una sola delle due alternative, anche (o forse soprattutto) perché compilazione ed interpretazione offrono vantaggi e svantaggi complementari, che sono poi riflessi nei linguaggi stessi. C, C++, Fortran e Pascal sono linguaggi compilati. I linguaggi dinamici sono linguaggi interpretati. Il caso di Java.
  • 15. LFC Schema organizzativo di un compilatore Programma sorgente Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Analisi lessicale Alfabeti, stringhe e linguaggi Analisi sintattica (parsing) Gestione della Generazione del codice intermedio Gestione degli errori Symbol table Ottimizzazione del codice Generazione del codice Codice oggetto Schema tratto dal quot;Dragon bookquot; (1977)
  • 16. LFC Breve descrizione delle fasi Nozioni introduttive Analisi lessicale Un analizzatore lessicale, detto anche Informazioni generali Parsing, traduzione e scanner, raggruppa i caratteri della compilazione Alfabeti, stringhe e descrizione lineare in token, cioè “oggetti” linguaggi significativi per la successiva analisi sintattica. Esempi di token sono i numeri, gli identificatori e le parole chiave di un linguaggio di programmazione. Analisi sintattica Un analizzatore sintattico, detto anche parser, organizza gruppi di token in strutture sintattiche. Un semplice esempio di tale organizzazione è il passaggio da una sequenza di numeri, operatori aritmetici e parentesi (che sono token) ad una espressione (che è una struttura sintattica) rappresentata come albero.
  • 17. LFC Breve descrizione delle fasi Nozioni introduttive Informazioni generali Parsing, traduzione e Generazione del codice intermedio A partire dalla compilazione Alfabeti, stringhe e struttura prodotta dal parser, un generatore linguaggi di codice intermedio produce una sequenza di istruzioni in una sorta di linguaggio intermedio che, pur molto semplice, non coincide con il linguaggio macchina. Ottimizzazione del codice In questa fase operano algoritmi che manipolano il programma scritto in codice intermedio in modo da ottenere un programma equivalente che (in genere) utilizza una minore quantità di spazio e/o che “gira” più velocemente .
  • 18. LFC Breve descrizione delle fasi Nozioni introduttive Informazioni generali Generazione del codice In questa fase il programma in Parsing, traduzione e compilazione codice intermedio (eventualmente Alfabeti, stringhe e linguaggi ottimizzato) viene trasformato in codice macchina. Qui vengono prese le decisioni sull’allocazione dei dati in memoria, il codice di accesso e l’utilizzo dei registri. Gestione della tabella dei simboli È un’attività che accompagna tutte le fasi della compilazione. La tabella dei simboli è essenzialmente un dizionario che registra tutti i nomi usati nel programma e le informazioni ad esso associate (esempio, un identificatore e il suo tipo).
  • 19. LFC Breve descrizione delle fasi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Gestione degli errori Durante una qualunque delle fasi si Alfabeti, stringhe e linguaggi possono verificare degli errori, che devono essere individuati e segnalati con opportuni messaggi diagnostici. Gli esempi più facilmente comprensibili di errore riguardano le fasi di analisi lessicale (ad esempio, un identificatore che contiene un carattere non ammesso) e di analisi sintattica (ad esempio un’espressione aritmetica mal formata). In generale se vengono rilevati errori non viene prodotto il codice oggetto.
  • 20. LFC Linguaggi formali e compilazione Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi
  • 21. LFC Nozione di alfabeto Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Un alfabeto è un insieme finito di simboli, detti anche Alfabeti, stringhe e linguaggi caratteri. I simboli di un alfabeto verranno scriti usando il font typewriter. Esempi di alfabeti importanti: I set di caratteri ASCII e UNICODE; B = {0, 1}, l’alfabeto binario; D = {A, C, G, T}, l’alfabeto del DNA. La lettera greca Σ indicherà un generico alfabeto. Le lettere finali dell’alfabeto latino (x, y e z) indicheranno simboli generici di un alfabeto.
  • 22. LFC Stringhe Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Una stringa, su un dato alfabeto Σ, è una sequenza Alfabeti, stringhe e linguaggi di simboli (giustapposti) di Σ. 010110 e 1111 sono esempi di stringhe sull’alfabeto binario. AACGTCCTA è una stringa sull’alfabeto D. Linguaggi formali e compilazione è una stringa sull’alfabeto ASCII. Conviene considerare anche la stringa vuota, cioè una stringa composta da nessun carattere. La stringa vuota è definita su qualsiasi alfabeto.
  • 23. LFC Stringhe Nozioni introduttive Informazioni generali Per indicare stringhe generiche si utilizzeranno (a Parsing, traduzione e compilazione seconda dei casi) sia le ultime lettere dell’alfabeto Alfabeti, stringhe e linguaggi latino (X , Y , Z ), in maiuscolo, sia le prime lettere dell’alfabeto greco (α, β, γ), in minuscolo. La lettera verrà riservata per denotare la stringa vuota. Una stringa formata da un solo carattere è un oggetto diverso dal carattere stesso. In tutti i casi nei quali possano sorgere ambiguità, ad esempio nel caso di stringhe composte da un solo carattere, le stringhe verranno rinchiuse fra doppi apici. “0” è quindi un oggetto diverso da 0.
  • 24. LFC Stringhe Nozioni introduttive Il numero di caratteri che compongono una stringa X Informazioni generali Parsing, traduzione e compilazione è detto lunghezza di X . Alfabeti, stringhe e linguaggi La lunghezza di una stringa X si indica spesso con |X | (si noti che consideriamo solo stringhe di lunghezza finita). Se |X | = n, i singoli caratteri della stringa verranno individuati da Xi , i = 1, . . . , n. Date due stringhe X e Y , la stringa Z ottenuta giustapponendo i caratteri di Y a quelli di X è detta concatenazione di X e Y . Ad esempio se X = Linguaggi e Y = formali, risulta XY = Linguaggiformali. Se |X | = n e |Y | = m, risulta |XY | = n + m.
  • 25. LFC Stringhe Nozioni introduttive La concatenzione è associativa, ovvero Informazioni generali Parsing, traduzione e compilazione (XY )Z = X (YZ ). Alfabeti, stringhe e linguaggi La concatenazione non è commutativa: posto X = mela e Y = verde, risulta XY = melaverde = verdemela = YX . La potenza k -esima di una stringa X , indicata con X k , è la stringa ottenuta concatenando X con se k stessa k ≥ 0 volte: X k =XX . . . X . Si pone poi X 0 = . La riflessione di una stringa X = X1 X2 . . . Xn è la stringa X R = Xn Xn−1 . . . X0 ottenuta rovesciando i caratteri di X .
  • 26. LFC Stringhe Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e X è sottostringa di Y se esistono Z e W linguaggi (eventualmente vuote) tali che: Y = ZXW . Se almeno una fra Z e W è diversa dalla stringa vuota, allora X è sottostringa propria di Y . Se Z è vuota, X è un prefisso di Y . Se W è vuota, X è un suffisso di Y . La notazione Xi..j verrà utilizzata per indicare la sottostringa di X formata dai caratteri dall’i-esimo al j-esimo.
  • 27. LFC Esempi Nozioni introduttive Informazioni generali Se X = 01, risulta X 3 = 010101, se Parsing, traduzione e compilazione Alfabeti, stringhe e X = Linguaggi, allora linguaggi X 2 = LinguaggiLinguaggi Se X = Linguaggi formali e compilatori, allora Y = formali è una sottostringa propria di X , Z = Linguaggi è un prefisso di X , W = compilatori è un suffisso di X , X10..17 =“ formali”. Si noti, nell’ultimo esempio, l’uso degli apici, necessario per evitare le possibili ambiguità dovute alla presenza di un spazio ad inizio stringa. Se X = Roma, allora X R = amoR.
  • 28. LFC Linguaggi Nozioni introduttive Un linguaggio su un dato alfabeto Σ è un insieme di Informazioni generali Parsing, traduzione e stringhe su Σ. compilazione Alfabeti, stringhe e linguaggi Un linguaggio può essere specificato in molti modi (ne vedremo almeno 4). Per enumerazione: consiste semplicemente nell’elencare le stringhe che fanno parte del linguaggio. Mediante regole della teoria degli insiemi: consiste nel descrivere matematicamente come sono fatti gli elementi dell’insieme (in questo caso le stringhe). Mediante un formalismo generativo. Mediante algoritmi di riconoscimento. Gran parte di questo corso sarà dedicato alle grammatiche e agli automi riconoscitori, che rappresentano gli ultimi due modi di specifica.
  • 29. LFC Esempi Nozioni introduttive Dato Σ, l’insieme vuoto Φ e l’insieme di tutte le Informazioni generali possibili stringhe su Σ (denotato da Σ∗ ) sono Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi che rivestiranno particolare importanza. linguaggi I seguenti sono esempi di linguaggi definiti su B: L1 = {00, 01, 10, 11}; L2 = { , 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100, 101, 110, 111}; L3 = {00, 010, 0110, 01110, . . .}; L4 = {0, 1, 00, 11, 000, 010, 101, 111, . . .}. Gli stessi linguaggi, sopra definiti per enumerazione, possono essere specificati in modo più sintetico mediante il “linguaggio” della teoria degli insiemi: ∈ B∗ = {X : |X | = 2}; L1 ∈ B∗ = {X : |X | ≤ 3}; L2 ∈ B∗ : ∃k ≥ 0 t.c. X = 01k 0}; = {X L3 ∈ B∗ : X = X R }. = {X L4
  • 30. LFC Esempi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione L1 ed L2 sono esempi di linguaggi finiti, mentre L3 ed Alfabeti, stringhe e linguaggi L4 sono linguaggi infiniti. Naturalmente i linguaggi infiniti rivestono maggior interesse sia dal punto di vista teorico sia da quello applicativo. Vediamo ora alcuni linguaggi sull’alfabeto Σ = {a, b, c} che ci saranno utili nel seguito: ∈ Σ∗ = an bm , n, m ≥ 0}; = {X L5 :X ∈ Σ∗ = an bn , n ≥ 0}; = {X L6 :X ∈ Σ∗ = bn c n , n ≥ 0}; = {X L7 :X ∈ Σ∗ = an bn c m , n, m ≥ 0}; = {X L8 :X ∈ Σ∗ = an bm c m , n, m ≥ 0}. = {X L9 :X
  • 31. LFC Operazioni con i linguaggi Nozioni introduttive Innanzitutto, poiché i linguaggi sono insiemi (di Informazioni generali Parsing, traduzione e stringhe), sono definite su di essi tutte le operazioni compilazione Alfabeti, stringhe e insiemistiche: unione, intersezione, differenza, ecc. linguaggi Si definisce concatenamento (o concatenazione) di due linguaggi L ed L , definiti su un alfabeto Σ, il linguaggio L = L L le cui stringhe sono il concatenamento di una stringa di L e una di L : L = {X ∈ Σ∗ : ∃Y ∈ L , ∃Z ∈ L t.c. X = YZ } La seguente ricorrenza permette di definire, per ogni m ≥ 0, la potenza n-esima di un linguaggio L: L0 = { } Ln = Ln−1 L, n > 0.
  • 32. LFC Operazioni con i linguaggi Nozioni introduttive Informazioni generali Parsing, traduzione e La chiusura (riflessiva) di L è il linguaggio compilazione Alfabeti, stringhe e linguaggi ∞ ∗ Ln = L0 ∪ L1 ∪ L2 ∪ . . . L= n=0 Inciso: è ora chiaro perché l’insieme di tutte le possibili stringhe su un alfabeto Σ viene indicato con Σ∗ . Per ogni intero i, Σ∗ contiene infatti tutte le stringhe di lunghezza i costituite dalla concatenazione di caratteri di Σ; tale insieme coincide proprio con l’insieme di tutte le possibili stringhe su Σ.
  • 33. LFC Operazioni con i linguaggi Nozioni introduttive La chiusura (non riflessiva) di L è definita come Informazioni generali Parsing, traduzione e L+ = LL∗ , ovvero: compilazione Alfabeti, stringhe e linguaggi ∞ Ln = L1 ∪ L2 ∪ . . . + L= n=1 La riflessione di un linguaggio L su un alfabeto Σ è il linguaggio: LR = {X ∈ Σ∗ : ∃Y ∈ L t.c. X = Y R }. Il numero di stringhe di un linguaggio finito verrà indicato con la notazione |L|. Se L è infinito risulta |L| = N, con ciò intendendo che L ha la stessa cardinalità dell’insieme dei numeri naturali.
  • 34. LFC Esempi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi L5 L6 = {X ∈ Σ∗ : X = an bm , n, m ≥ 0, n = m} L5 ∪ L6 = L5 L5 ∩ L6 = L6 L6 {c}∗ = L8 L6 L7 = {X ∈ Σ∗ : X = an bm c k , n, k ≥ 0, m = n + k } L{ } = { }L = L |L1 | = 4, |L2 | = 15, |L5 | = |L6 | = |L7 | = |L8 | = N
  • 35. LFC Esempi Nozioni introduttive Informazioni generali Parsing, traduzione e compilazione Alfabeti, stringhe e linguaggi {ab, c}2 = {abab, abc, cab, cc} {ab, c}3 = {ababab, abcab, cabab, ccab, ababc, abcc, cabc, ccc} {ab, c}∗ = { , ab, c, abab, abc, cab, cc, ababab, abcab, cabab, ccab, ababc, abcc, cabc, ccc, . . .} {ab, c}+ = {ab, c}∗ { } R {ab, c}2 = {baba, cba, bac, cc}