170 likes | 277 Views
CAP.1 INTRODUZIONE. 1.1 I compilatori 1.2 L'analisi dei dati iniziali 1.3 Le fasi del compilatore 1.4 I cugini del compilatore 1.5 Il raggruppamento delle fasi 1.6 Alcuni altri softwares per la compilazione. 1.1 I compilatori. programma iniziale. programma finale. compilatore. messagi
E N D
CAP.1 INTRODUZIONE • 1.1 I compilatori • 1.2 L'analisi dei dati iniziali • 1.3 Le fasi del compilatore • 1.4 I cugini del compilatore • 1.5 Il raggruppamento delle fasi • 1.6 Alcuni altri softwares per la compilazione
1.1 I compilatori programma iniziale programma finale compilatore messagi di errore
• Linguaggi iniziali: Fortran, Pascal, C Cobol Linguaggi specializzati: TeX, Maple, Java, Script shell • Linguaggi finali: Codice eseguibile Codice intermedio Altro linguaggio di programmazione
Programma iniziale Analisi = piuttosto ben teorizzato Rappresentazione intermedia (albero) Sintesi = molto più specializzato Programma finale
• Aiuti per l'analisi: Edizione del programma Aiuto per la scrittura del programma Messa in forma del programma Controllo statico Detezione degli errori statici Interpretatori Normalmente per linguaggi specifici Come aiuto per la verificazione dei programmi Pascal o C interpretati "passo a passo"
scheletro del programma Vicinanza del compilatore preprocessore programma iniziale compilatore programma finale (assembly language) biblioteche, altri oggetti in codice relativo assembler codice relativo collegamento codice assoluto
1.2 L'analisi dei dati iniziali Divisione in tre fasi: i) Analisi lessicale flusso di caratteri raggruppati in unità lessicali ii) Analisi sintattica unità lessicali raggruppate in unità grammaticali iii) Analisi semantica controllo e stabilimento della coerenza semantica
area := base * altezza / 2 assegnamento := identificatore espressione * area espressione espressione identificatore espressione espressione / base identificatore numero altezza 2 Esempio d'analisi area:=base*altezza/2 analisi lessicale analisi sintattica
:= Albero astratto area * base / altezza 2 analisi semantica Controllo di tipo, coercizione integer_to_real 2
1.3 Le fasi del compilatore programma iniziale analizzatore lessicale analizzatore sintattico analizzatore semantico tabella dei simboli gestione degli errori generatore di codice intermedio ottimizzatore di codice generatore di codice finale programma finale
• Tabella dei simboli: Informazione sul tipo, la portata, l'indirizzo in memoria degli identificatori. Inizializzata dall'analizzatore lessicale, completata e utilizzata dalle altre fasi. • Gestione degli errori: Errori lessicali (caratteri proibiti). Errori sintattici (regole strutturali non rispettate). Errori semantici (incoerenza delle operazioni: controllo statico). Diverse continuazioni possibili, secondo la finalità del compilatore: fermata al primo errore; sincronizzazione sulla costruzione corretta seguente; tentativi di correzione.
area := base * altezza / 2 • Analisi lessicale := id1 := id2 * id3 / nb2 id1 * sintattica id2 / id3 nb2 := semantica id1 * Tabella dei simboli id2 / area base id3 integer_to_real altezza nb2
generatore di codice intermedio • Sintesi temp1 := integer_to_real(2) temp2 := id3 / temp1 temp3 := id2 * temp2 id1 := temp3 ottimizzatore di codice temp1 := id3 / 2.0 id1 := id2 * temp1 generatore di codice MOVF id3, R1 DIVF #2.0, R1 MOVF id2, R2 MULF R1, R2 MOVF R2, id1
1.4 I cugini del compilatore • I preprocessori (estenzioni del linguaggio di programmazione) Producono linguaggio iniziale: macros, inclusione di file, costruzioni non prevviste Esempio: CWEB di D. Knuth source CWEB = C + macros + costruzione modulare + commande TeX weave tangle Programma TeX Programma C TeX C Eseguibile Documentazione stampata del programma messo in forma e commentato
• Gli assemblers: Tradurre il codice prodotto in codice relativo (indirizzi relativi) MOVF id3, R1 DIVF #2.0, R1 MOVF id2, R2 MULF R1, R2 MOVF R2, id1 0001 01 00 00001000 0101 01 10 00000010 0001 10 00 00000100 0100 10 01 00000001 0010 10 00 00000000 0001 caricare 0010 riporre 0100 moltiplicare 0101 dividere 00 modo assoluto 01 modo registro 10 modo litterale indirizzo num. di registro valore numerico • Il collegamento: amministra le referenze esterne; trasforma i codici relativi in codice assoluto; mette quel codice al posto adeguato.
1.5 Il raggruppamento delle fasi • Parte frontale e parte finale: linguaggio iniziale parte frontale = dipende solamente dal linguaggio iniziale codice intermedio parte finale = dipende solamente dalla macchina fisica linguaggio finale • Passi: Vantaggi della riduzione del loro numero (velocità, spazio), più facile in parte frontale (traduzione diretta dalla sintassi). Impossibilità di determinare certe caratteristiche finali: collegamento verso indirizzi situati più avanti (ripresa indietro).
1.6 Alcuni altri softwares per la compilazione Attrezzi efficaci per l'aiuto alla realizzazione di compilatori: • Costruttori di analizzatori lessicali (LEX); • Costruttori di analizzatori sintattici; • Traduttori guidati dalla sintassi (YACC); • Generatori di codice automatici; • Analizzatori e ottimizzatori di codice.