E programma che ha lo scopo di tradurre i! codice sorgente in programmi scritti dai programmatori in linguaggi ad alto livello, nel codice macchina eseguibile da un calcolatore. E’ importante notare che un dato compilatore accetta programmi di un solo ben preciso linguaggio di programmazione e li traduce in programmi eseguibili da un dato modello di calcolatori. Se il calcolatore per cui viene effettuata la traduzione è diverso da quello su cui “gira” il compilatore, si dice che si tratta di un compiler, cioè di un compilatore trasposto.
Le informazioni prodotte dai compilatori
I compilatori producono in uscita, oltre al codice oggetto, anche altre informazioni:
- stato (,listing flistir) del programma sorgente, con la numererazione delle linee ed impaginatura;
- messaggi diagnostici che indicano i punti in cui il compilatori ha riscontrato errori nell’uso del linguaggio di programma. Questi messaggi sono solitamente in inglese e piuttosto KT.ietici e hanno lo scopo di aiutare il programmatore a indivi-feire il tipo di errore per correggerlo;
- tabella dei simboli, cioè elenco in ordine alfabetico di tutti i o: ■mi di variabili, costanti e sottoprogrammi che il program-cciitore ha utilizzato, riportando in alcuni casi anche gli indirizzi di memoria in cui quegli elementi verranno a trovarsi il programma verrà caricato in memoria per essere séguito:
- Tabella di cross reference, cioè di riferimenti incrociati, che Irx» na per ogni simbolo i numeri di tutte le righe di program-| Ito* che fanno riferimento a quel simbolo.
il compilatori sono in genere composti delle seguenti parti principali: lo scanner, il parser e il generatore di codice:
- : scanner legge il programma sorgente carattere per carattere ed esegue l’analisi lessicale, cioè riconosce se i caratteri so-rc ‘tati utilizzati correttamente e quali simboli, parole chiave : Te operazioni stanno ad indicare:
- il parser riceve dallo scanner le indicazioni sui tipi di elementi che e ha individuato, e su di essi esegue l’analisi sintattica che ha lo scopo di individuare la correttezza e la struttura dei prc cramina. Il parser produce una descrizione interna dei programma sotto forma di “albero sintattico” cioè una particolare struttura che rappresenta “concettualmente” il programma:
- il generatore di codice, partendo dalla descrizione interna, se non \ ì sono errori cosiddetti “fatali”, produce una sequenza di i perazioni espresse in codice macchina, che corrispondono a tale descrizione.
Nei compilatori più sofisticati, la generazione del codice viene effettuata mediante successivi passi di ottimizzazione, nei quali si eliminano le operazioni ridondanti e si individuano sequenze più compatte, ma equivalenti, di istruzioni.
La “bontà” di un compilatore si riconosce dalla generazione di messaggi diagnostici chiari e pertinenti, dalla compattezza ed efficienza del codice oggetto generato, dalla ricchezza di comandi opzionali per l’uso di iibrerie di sottoprogrammi, dall’impaginazione dei tabulati, dalla generazione di riferimenti incrociati, ecc.
È importante notare che non tutti i compilatori sono perfettamente corretti, come pure non tutti interpretano totalmente e correttamente il linguaggio di programmazione per cui sono destinati.