Schema che illustra il funzionamento di un compilatore ideale.
Un
compilatore
e un
programma
informatico
che traduce una serie di
istruzioni
scritte in un determinato
linguaggio di programmazione
(
codice sorgente
) in istruzioni di un altro linguaggio (
codice oggetto
): il processo di traduzione si chiama compilazione mentre l'attivita inversa - ovvero passare dal codice oggetto al codice sorgente - e chiamata
decompilazione
ed e effettuata per mezzo di un
decompilatore
.
Se tutti i compilatori aderissero esattamente alla
specifica
del linguaggio, lo stesso programma potrebbe essere compilato senza modifiche da ciascun compilatore, producendo risultati
semanticamente
uguali, ovvero programmi che producono lo stesso risultato se sottoposti agli stessi
dati di ingresso
. Nella realta, molti compilatori implementano il linguaggio in modo incompleto o aggiungono estensioni proprietarie, creando quindi dei
dialetti
del linguaggio principale. Per i linguaggi che adottano uno standard nella
decorazione
dei simboli, il codice oggetto generato da compilatori differenti puo essere collegato assieme in un unico eseguibile.
A partire dal 1950 vennero sviluppati diversi compilatori sperimentali (tra cui l'
A-0 System
di
Grace Hopper
), ma nel 1957 il team
Fortran
presso l'
IBM
, guidato da
John Backus
, fu il primo a realizzare un compilatore completo mentre, nel
1960
, il
COBOL
fu uno dei primi linguaggi a essere compilato su piu
architetture
.
[1]
L'idea della compilazione prese velocemente piede e molti dei principi di design dei compilatori vennero sviluppati negli anni sessanta. Un compilatore e esso stesso un programma scritto in un qualche linguaggio e, i primi di essi vennero scritti in
Assembly
. Il primo compilatore auto-compilato, capace cioe di compilare il suo stesso codice, fu creato per il linguaggio
Lisp
da Hart e Levin presso il
MIT
nel
1962
.
[2]
L'uso di linguaggi ad alto livello per scrivere i compilatori ebbe una accelerazione nei primi anni settanta quando i linguaggi
Pascal
e
C
furono usati per scrivere compilatori per loro stessi: ossia, ad esempio, furono scritti compilatori per il C scritti a loro volta in C.
Quando un linguaggio di programmazione viene definito per la prima volta, sorge il problema di come realizzare il relativo compilatore. In questo caso esistono due approcci possibili:
- scrivere il compilatore in un linguaggio diverso;
- oppure - se esiste gia un interprete per il nuovo linguaggio - e possibile sfruttarlo per scrivere una prima versione del compilatore, che verra usata (dandogli in input il codice sorgente di se stesso) per ottenere un primo compilatore funzionante in linguaggio macchina, che quindi rendera inutile l'uso dell'interprete. Il compilatore cosi ottenuto potra essere usato per scrivere a sua volta compilatori migliori, e cosi via.
Fasi tipiche della compilazione.
Il compilatore prende in
ingresso
un
programma
, il codice sorgente, su cui esegue una serie di operazioni in modo da ottenere, in assenza di
errori
, il codice oggetto. In generale i compilatori sono in grado di riconoscere alcune classi di errori presenti nel programma, e in alcuni casi di suggerire in che modo correggerli.
I compilatori attuali dividono l'operazione di compilazione in due stadi principali il
front end
e il
back end
. Nello stadio di
front end
il compilatore traduce il sorgente in un linguaggio intermedio (di solito interno al compilatore); nello stadio di
back end
avviene la generazione del codice oggetto.
Questo stadio si suddivide in piu fasi:
- Analisi lessicale
Attraverso un
analizzatore lessicale
, spesso chiamato
scanner
o
lexer
, il compilatore divide il codice sorgente in tanti pezzetti chiamati
token
. 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. Il controllo sintattico e effettuato attraverso una
grammatica
. Il risultato di questa fase e un
albero di sintassi
.
- Analisi semantica
L'analisi semantica si occupa di controllare il significato delle istruzioni presenti nel codice in ingresso. Controlli tipici di questa fase sono il
type checking
, ovvero il controllo di tipo, controllare che gli identificatori siano stati dichiarati prima di essere usati e cosi via. Come supporto a questa fase viene creata una
tabella dei simboli
(
symbol table
) che contiene informazioni su tutti gli elementi simbolici incontrati quali nome,
scope
, tipo (se presente) etc. Il risultato di questa fase e l'
albero sintattico astratto
(AST).
- Generazione del codice intermedio: Dall'albero di sintassi viene generato il codice intermedio.
Anche lo stadio di
back end
si divide in piu fasi:
- Ottimizzazione
del codice intermedio.
- Generazione del codice target: in questa fase viene generato il codice nella forma del linguaggio target. Spesso il linguaggio target e un
linguaggio macchina
.
- Alfred V. Aho, Ravi Sethi, e Jeffrey D. Ullman,
Compilatori. Principi, tecniche e strumenti
, Milano, Pearson, 2006.
ISBN 978-88-7192-559-2
- compilatore
, su
Treccani.it ? Enciclopedie on line
,
Istituto dell'Enciclopedia Italiana
.
![Modifica su Wikidata](//upload.wikimedia.org/wikipedia/commons/thumb/7/73/Blue_pencil.svg/10px-Blue_pencil.svg.png)
- compilatore
, su
sapere.it
,
De Agostini
.
![Modifica su Wikidata](//upload.wikimedia.org/wikipedia/commons/thumb/7/73/Blue_pencil.svg/10px-Blue_pencil.svg.png)
- (
EN
)
compiler
, su
Enciclopedia Britannica
, Encyclopædia Britannica, Inc.
![Modifica su Wikidata](//upload.wikimedia.org/wikipedia/commons/thumb/7/73/Blue_pencil.svg/10px-Blue_pencil.svg.png)
- (
EN
)
Opere riguardanti Compilers (Computer programs)
, su
Open Library
,
Internet Archive
.
![Modifica su Wikidata](//upload.wikimedia.org/wikipedia/commons/thumb/7/73/Blue_pencil.svg/10px-Blue_pencil.svg.png)
- (
EN
)
compiler
, in
Free On-line Dictionary of Computing
, Denis Howe.
Disponibile con licenza
GFDL
- Un generatore di analizzatori lessicali
, su
gnu.org
.
- Un generatore di analizzatori sintattici
, su
gnu.org
.