venerdì 28 novembre 2008

Architettura di un Compilatore


Il comportamento di un compilatore può essere schematizzato in due fasi: front end e back end.

Prendiamo per esempio il seguente programma.
int main(){
int i = 0;
}
Stadio di front end
Analisi lessicale : Attraverso un'analizzatore lessicale, spesso chiamato scanner o lexer, il compilatore divide il codice sorgente in tanti pezzetti chiamati token.
Lo scanner legge una sequenza di caratteri ('i','n','t',' ','m','a','i','n','(',')','{',etc.)
rimuove i commenti e spazi bianchi e crea una sequenza di tokens('int','main','(',')','{','int',etc.)
I token sono gli elementi minimi (non ulteriormente divisibili) di un linguaggio, ad esempio parole chiave (for, while), nomi di variabili (pippo), operatori (+, -, <<).
Analisi sintattica :
L'analisi sintattica prende in ingresso la sequenza di token generata nella fase precedente ed esegue il controllo sintattico che verifica se i la grammatica(insieme di regole) definita per un linguaggio e' rispettata.
Es.le keyword devono precedere gli identificatori
Analisi semantica :
L'analisi semantica si occupa di controllare il significato del progranna. Es. riconosce le occorenze di uno stesso identificatore, viene effettuato il type checking,controllare che gli identificatori siano stati dichiarati prima di essere usati,etc.
Come supporto a questa fase viene creata una tabella dei simboli (symbol table) che contiene informazioni su ogni identificatore presente nel programma,es. nome, scope, tipo etc.
Non tutte le regole semantiche sono applicate a compile time. Per esempio riferimenti a oggetti validi deve essere fatto a run-time
Questo processo di cotnrollo statico della semantica produce l'albero sintattico astratto (AST).
Ogni nodo dell' AST è arricchito con delle informazioni chiamate annotazioni, quali i puntatori a identificatori alla Symbol Table.
In questo stadio può essere presente una prima fase di ottimizzazione

Stadio di back end
Anche lo stadio di back end si divide in più fasi:
Generazione del codice intermedio: Dall'albero di sintassi viene generato il codice intermedio.
Possono essere fatti ottimizazioni al codice intermedio.
Generazione del codice target: In questa fase il compilatore traduce il codice intermedio nella forma del linguaggio target(assembly o macchina).
Per generare codice assembly o il linguaggio macchina il generatore di codice accede alla symbol table per assegnare locazioni a variabili e attraversando l'albero sintattico astratto genera le istruzioni(load,store,aritmetico-logiche,etc) relative al programma.

Ref.
Programming Launguage Pragmatics, Michael L. Scott, University of Rochester


Daniele Licari

Nessun commento: