Linguaggi e Traduttori:Introduzione al corso
Armando Tacchella
Sistemi e Tecnologie per il Ragionamento Automatico (STAR-Lab)Dipartimento di Informatica Sistemistica e Telematica (DIST)
Università di Genova
A.A. 2006/2007 - Primo semestre
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Docenti e loro reperibilità
Mauro Villa Bonino - Piano AmmezzatoDi Manzo Tel. 010-3532818
Riceve su appuntamentoe-mail: [email protected]
Armando Villa Bonino - Ultimo PianoTacchella Tel. 010-3532782
Ricevo Lunedì dalle 16.00 alle 17.00e-mail: [email protected]: www.star.dist.unige.it/~tac
Modalità di esame
Progetto didattico (50%)I Sviluppato in gruppi di 2-3 personeI Argomento scelto da una lista di proposte (FCFS)I Supporto dei membri di STAR-LabI Elaborato: sorgenti, documentazione e relazione finale
Esame orale (50%)I Prerequisito: conclusione del progetto didatticoI Discussione del progettoI Argomenti teorici del corso inerenti al progetto
Riferimenti e materiale didattico
Sito web ufficiale del corso:
www.star.dist.unige.it/~tac/LT-GE
Contiene il seguente materiale:I Programma dettagliatoI Dispense (inclusa questa introduzione) in formato PDFI Bibliografia del corsoI Reperibilità dei docenti
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Competenze teoriche
I Principali modelli di computazioneI Formalismi per la descrizione dei linguaggiI Algoritmi per l’analisi sintatticaI Algoritmi per la traduzione guidata dalla sintassiI Elementi di semantica dei linguaggi di programmazione
Competenze pratiche
I Struttura di un compilatoreI Strumenti per l’analisi lessicaleI Strumenti per l’analisi sintatticaI Gestione del contesto semanticoI Gestione della rappresentazione intermediaI Astrazione proceduraleI Generazione di codice
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Struttura del corso
Il corso si divide in due parti:I Linguaggi formali e traduttoriI Tecnologia dei compilatori
Linguaggi formali e traduttori
I Teoria dei linguaggi e grammaticheI Linguaggi deterministiciI Trattamento degli errori sintatticiI Traduzioni sintatticheI Grammatiche ad attributiI Valutazione degli attributiI Cenni sulla semantica denotazionale
Tecnologia dei compilatori
I Generazione (automatica) di analizzatori lessicali esintattici
I Gestione del contesto semantico e traduzione basata sullasintassi
I Rappresentazioni intermedie: grafiche, lineari, SSAI Gestione dei simboli (dizionario)I Astrazione proceduraleI Generazione di codice: espressioni aritmetiche e logiche,
vettori, stringhe, strutture, iterazioni, chiam ate a procedura
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Traduttori, interpreti e compilatori
Traduttore Elabora un programma traducendolo in uno dipari significato espresso in un diverso linguaggio.
Interprete Produce gli effetti relativi all’esecuzione di un datoprogramma.
Compilatore Un traduttore, solitamente da un programma inlinguaggio di alto livello (sorgente) in uno inlinguaggio più vicino all’hardware (codiceintermedio, assembly, codice macchina).
EsempiI I programmi in C e C++ sono tipicamente compilatiI I programmi PERL e PHP sono tipicamente interpretatiI I programmi in Java vengono compilati (in bytecode) e il
risultato è interpretato dalla JVM
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Perché studiare i compilatori?
I I compilatori sono importanti in quanto responsabili permolti aspetti dell’efficienza di un sistema
I I compilatori sono interessantiI Includono molte applicazioni pratiche dell’informatica
teoricaI Comportano problematiche a livello algoritmico e
ingegneristicoI I compilatori sono molto diffusi
I Linguaggi all’interno dei programmi applicativi (macro)I Formati grafici (per es. Postscript e PDF)I Linguaggi special-purpose
Aspetti salienti
I I compilatori svolgono diversi compiti per i quali l’efficienzarappresenta un requisito fondamentale
I Le prestazioni in fase di esecuzione di un programma sonoinfluenzate pesantemente dal compilatore
I Dai compilatori dipende la possibilità di utilizzareefficacemente i costrutti messi a disposizione dai linguaggi
I La crescente complessità delle architetture dei sistemi dielaborazione rende necessari compilatori sempre piùsofisticati
Discipline coinvolte
Lo sviluppo dei compilatori richiede diversi contributi
Intelligenza ArtificialeAlgoritmi di ricerca stocasticiTecniche euristiche
AlgoritmiAlgoritmi su grafi, DizionariProgrammazione Dinamica
Informatica TeoricaAutomi a stati finiti e a pilaGrammatiche
Sistemi OperativiGestione della memoriaSincronizzazione, Località
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Schema funzionale di un compilatore
............................
........................................................
eseguibilecodice
errori
sorgentecodice
COMPILATORE
Principi fondamentali:I Il compilatore deve preservare il significato del codice
sorgenteI Il compilatore deve migliorare il codice sorgente in modo
che gli effetti siano misurabili sul codice eseguibile
Architettura di un compilatore (I)
............................ ........................................................
............................
errori
sorgentecodice
eseguibilecodice
IRFront End Back End
I Utilizzo di una rappresentazione intermedia (IR)I È possibile prevedere molteplici Front EndI Il Front End svolge computazioni in O(n), O(nlogn), . . .
I Il Back End svolge computazioni potenzialmente in O(2n)
Architettura di un compilatore (II)
............................ ............................
............................
............................ ............................
sorgentecodice
IRFront End
errori
codiceeseguibile
Back EndIR
Optimizer
I L’Optimizer è un insieme di moduli (passate)I Migliora il codice IR in qualche sensoI Nomenclatura diffusa ma imprecisa: non esiste una
definizione di ottimalità sufficientemente generale
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Elementi del Front End
............................
............................
............................ ............................
errori
sorgentecodice
Scanner Parser
IRtokenstream
I Riconoscere programmi corretti (errati)I Emettere messaggi di errore fruibiliI Effettuare analisi lessicali, sintattiche, semanticheI Produrre codice intermedio e dizionario dei simboli
Elevato grado di automazione
Analizzatore lessicale (Scanner)
I Converte uno stream di caratteri in uno stream di tokenI Il token è una coppia (parte del discorso, lessema)I Esempio:
x = x + y ⇒< id , x >< iseq, =>< id , x >< plus, + >< id , y >
I Nel caso di “=” e “+” è superfluo memorizzare il lessemac’è corrispondenza biunivoca con la parte del discorso
I Invece un identificatore (id) può corrispondere a più lessemiI Lo scanner “distilla” spazi bianchi, ritorni a capo, ecc.I La velocità è un fattore cruciale
Analizzatore sintattico (Parser)
I Riconosce la sintassi indipendente dal contesto e lerelative violazioni
I Guida l’analisi “semantica” dipendente dal contesto, ad es.controllo dei tipi, numero di parametri, dichiarazione degliidentificatori
I Costruisce la rappresentazione intermedia del sorgente
Grammatiche libere dal contesto (Context-free)
I La sintassi indipendente dal contesto è specificata con unagrammatica; ad esempio:1. goal:=expr2. expr:=expr op term | term3.term:=NUM | ID4. op:=+ | -
I Formalmente, una grammatica G = (S, N, T , P)I S è il simbolo inizialeI N è l’insieme di simboli non terminaliI T è l’insieme di simboli terminali (o parole)I P è un insieme di produzioni o regole di riscrittura
I Nell’esempio S=goal, N={expr,op,term},T={NUMBER, ID, +, -} e P={1,2,3,4}
Utilizzo di grammatiche context-free (CFG)
Data una CFG possiamo derivare espressioni utilizzandosostituzioni ripetute; ad esempio:
Produzione Risultatogoal
1 expr2 expr op term3 expr op y4 expr - y2 expr op term - y3 expr op 2 - y4 expr + 2 - y2 term + 2 - y3 x + 2 - y
1. goal:=expr2. expr:=expr op term | term3.term:=NUM | ID4. op:=+ | -
Alberi sintatticiData un’espressione possiamo interpretarla utilizzando unaCFG: tale procedimento può essere rappresentato con unalbero sintattico
goal
��expr
sshhhhhhhhhhhhh
�� &&MMMMMMM
expr
xxqqqqqqq
�� &&MMMMMMM op
��
term
��expr
��
op
��
term
��
- <ID,y>
term
��
+ <NUM,2>
<ID,x>
Alberi sintattici astratti (AST)
I Racchiudono le stesse informazioni degli alberi sintatticima eliminano l’informazione ridondante
I Costituiscono una tipologia di rappresentazione intermedia
-
xxqqqqqqq
&&MMMMMMM
+
xxqqqqqqq
&&MMMMMMM <ID,y>
<ID,x> <NUM,2>
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Elementi del Back End
............................ ............................
............................
............................ ............................
errori
codiceeseguibile
IRIRIR Selezionedelle Allocazione
dei registri
Schedulingdelle
istruzioniistruzioni
I Tradurre codice IR in codice eseguibileI Scegliere le istruzioni per realizzare le operazioniI Decidere i valori da conservare nei registriI Assicurare il rispetto delle interfacce di sistema
Basso grado di automazione
Selezione delle istruzioni
Obbiettivo: produrre codice veloce e compattoI Utilizzare proficuamente le caratteristiche dell’HWI Il “problema del futuro” agli inizi degli anni ’80
I Architetture CISC sempre più complesseI L’ortogonalità delle architetture RISC ha semplificato il
problema
Allocazione dei registri
Obbiettivo: caricare i valori necessari nei registri primadell’utilizzo
I Gestione di un numero limitato di risorseI Può influenzare la scelta delle istruzioniI Può inserire operazione di LOAD e STOREI L’allocazione ottima é un problema NP-completoI I compilatori usano soluzioni approssimate
Riordino delle istruzioni (Scheduling)
Obbiettivi:I Minimizzare stalli e bolle nella pipelineI Utilizzare tutte le unità funzionali efficacemente
Lo scheduling ottimale è un problema NP-completo in quasitutti i casi di interesse pratico, pertanto i compilatori utilizzanotecniche euristiche
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Schema di compilatore con ottimizzazioni
............................ ............................
............................
............................ ............................
sorgentecodice
IRFront End
errori
codiceeseguibile
Back EndIR
Optimizer
Obbiettivi:I Analizzare il codice intermedio e trasformarloI Ridurre il tempo di esecuzione (primario)I Preservare la semantica del codice iniziale
Le dimensioni del codice e il consumo di risorse sono altriobbiettivi che possono essere di prioritari in casi specifici
Esempi di ottimizzazioni possibili
I Scoprire e propagare valori costantiI Minimizzare il numero di esecuzioni di una computazione
dispendiosaI Specializzare computazioni sulla base del contestoI Scoprire computazioni ridondantiI Rimuovere codice inutile o irraggiungibileI Codificare un idioma in qualche forma particolarmente
efficiente
Outline
Informazioni sul corsoDocenti, modalità di esame, riferimentiObbiettivi del corsoProgramma del corso
Introduzione ai compilatoriTerminologiaMotivazioniArchitettura
Elementi di un compilatoreInterfaccia verso il sorgente (Front End)Interfaccia verso l’eseguibile (Back End)OttimizzazioneAmbiente di esecuzione
Ruolo dell’ambiente di esecuzione
I Gestione della memoriaI allocazione dinamica (heap) e static (stack frame)I deallocazioneI garbage collection
I Controllo dei tipi a run-timeI Gestione degli errori a run-timeI Interfaccia con il sistema operativoI Eventualmente, gestione di thread, comunicazione,
sincronizzazione