Il compilatore

La traduzione in linguaggio macchina

Supponiamo per un momento di essere davanti ad un estratto di testo e di doverne leggere e memorizzarne il contenuto. Qual è la prima cosa che i nostri occhi notano dinanzi ad un testo? Ovviamente, che il testo scritto sia in un linguaggio comprensibile al nostro (nel nostro caso in Italiano). In gergo, effettuiamo un'analisi lessicale. Per comrpenderne il significato dobbiamo leggere l'estratto e capirne le frasi di cui è composto, ovvero ne facciamo un'analisi sintattica. Tutte le frasi devono essere in una forma del tipo «Soggetto + Verbo + Complemento», altrimenti non riusciremmo a comprendere la natura della frase. Immaginate di non trovare ad esempio verbi nelle frasi! Tuto risulterebbe incomprensibile. Una volta conclusa, cerchiamo di memorizzare l'estratto attraverso l'analisi semantica. A quel punto possiamo dire di poterlo leggere e comprendere. Ma soprattutto, una volta memorizzato nella nostra mente quel testo assumerà una forma molto differente, senza spazi né virgole né punti!

Ecco, tutto quello che facciamo noi davanti ad un testo, è esattamente quello che viene fatto da un compilatore per un programma. Quando si scrive un programma in codice informatico, per permettere alla macchina di comprenderlo, esso deve passare per un'analisi lessicale, sintattica e semantica così che la macchina possa comprenderlo, memorizzarlo ed eseguirlo. Il Compilatore è quindi quel modulo software che permette tutto questo. Un programma che subisce una «traduzione in linguaggio macchina» viene detto «programma compilato».


Ora ci chiediamo... se il programma subisce questa traduzione dal compilatore, allora una volta compilato tutte le macchine possono comprenderlo ed eseguirlo? E' qui che arriva la brutta notizia! Purtroppo il compilatore è strettamente legato alla macchina, nel senso che traduce quel programma solo per la macchina sulla quale si trova. Se ad esempio spostiamo il programma già compilato, su un'altra macchina cercando di eseguirlo, esso non funzionerà e bisognerà ricompilarlo di nuovo. Questo è un limite molto grosso. Esistono infatti i cosiddetti linguaggi «compilati», che necessitano del compilatore, e i linguaggi «interpretati» (Java, HTML, XML etc..) che non hanno bisogno di compilazione. Ma di questo ne parleremo in un altro articolo.

Il compilatore come vedremo in un altro articolo si avvale della collaborazione poi di un altro modulo software detto Linker o Collegatore, che ha il compito di unire al programma tradotto le librerie esterne necessarie per farlo funzionare. Ad ogni modo il Compilatore è composto da tre elementi fondamentali: 

1. Lexer (Lexical Analyser):  è l'analizzatore lessicale del Compilatore, il cui compito è quello di "leggere" il programma e verificare che essosia scritto in un linguaggio comprensibile per essere tradotto ovvero che tutte le parole riservate al linguaggio siano scritte correttamente.

2. Parser: è l'analizzatore sintattico. Il suo compito è quello di controllare che le istruzioni del programma siano scritte correttamente e di segnalare eventuali errori sintattici, ovvero quelli relativi alla corretta costruzione delle istruzioni, segnalando eventualmente errori in caso contrario.

3. Generatore del Codice: è il vero e proprio memorizzatore di codice. Il suo compito è quello di generare il codice e la traduzione in linguaggio macchina che permetterà di eseguire il programma.