Il compilatore

Il funzionamento

«Il Software nasce dai software e si scrive attraverso i software!». In questa affermazione, è racchiuso tutto ciò che c'è da sapere su come vengono realizzati i software. In genere i software vengono scritti attraverso cosiddetti Ambienti di Sviluppo Integrato, detti in breve IDE (Integreted Development Environment) che sono software a tutti gli effetti. Quasi tutti gli ambienti di sviluppo mettono a disposizione un pulsante detto di "Build" o "Compile", che in genere attiva il compilatore.

L'accensione del compilatore genera l'attivazione del Lexer. Il Lexer, legge il codice sorgente e ne verfiica la correttezza lessicale. Per farlo, il Lexer scompone il codice sorgente in Tokens ovvero in elementi che verificherà uno per uno. I Tokens si riferiscono generalmente alle parole riservate al linguaggio, ovvero a quelle parole usuali che si utilizzano nei programmi (cicli for, while, if... etc). 



I Tokens possono riferirsi però anche alle variabili, ovvero quelle parole identificative generate dal programmatore per immagazzinare informazioni. Il Lexer, quando per un determinato, Token non trova corrispondenze con le parole riservate al linguaggio, (sotto determinate regole) lo identifica come una variabile. A questo scopo, poiché le variabili vengono necessariamente utilizzate all'interno del programma, inserisce il Token in una Tabella degli Identificatori che associa il nome della variabile al suo valore effettivo. 


Una volta composta la Tabella, viene attivato il Parser. Il Parser scansiona di nuovo il codice ed effettua il controllo sintattico: tutte le istruzioni devono essere corrette. In caso contrario il codice non potrà essere tradotto e la compilazione non potrà essere completata. Il Parser, una volta terminato il suo lavoro, prende in considerazione la Tabella degli Identificatori e crea il cosiddetto Albero di Sintassi, ovvero una struttura ad albero che contiene dei nodi (Tokens) e che viene percorso secondo il flusso logico del programma, tenendo conto anche dei punti decisionali e dei cicli iterativi. Il nodo principale da cui inizia il percorso è il nodo centrale denominato main().


Una volta che il Parser ha concluso il suo compito, il Generatore di codice macchina è quello che effettua la traduzione vera e propria esaminando l'Albero di Sintassi ramo per ramo (ogni ramo rappresenta l'esecuzione di un particolare passo del programma). Ogni ramo di esecuzione diventa un'istruzione in linguaggio macchina elementare, che si riferisce a quella determinata macchina. Una volta tradotto, il programma compilato può essere memorizzato ed eseguito. In gergo informatico il file tradotto prende il nome di file «oggetto» che viene identificato con estensione *.o oppure *.obj

In alcuni moderni Compilatori, esiste anche un elemento definito Ottimizzatore che esamina il file oggetto ed elimina sezioni di codice che per qualche ragione si ripetono (ridondanti) snellendo il file e favorendo la velocità di esecuzione.