Il processo di compilazione

Gli aspetti di dettaglio di come funziona il processo sono piuttosto complessi che qua vengono omessi.

Il compilatore utilizzato nel corso è il GNU Compiler Collection (gcc), uno dei più diffusi (sito).

gcc compie una serie di passi per creare il programma eseguibile partendo dal codice sorgente, integrando elementi propri del C (gli elementi color ocra).

Più precisamente gcc invoca per prima cosa il preprocessore, che processa le direttive # (include gli header ed espande le macro) e produce il file intermedio.

È possibile vedere come lavora il preprocessore con il seguente comando: gcc -E file.c. Il processo di creazione dell'eseguibile viene interrotto dopo la chiamata del preprocessore e il risultato è mandato a video (quindi non viene prodotto il file file.i).

Dopo l'invocazione del preprocessore, gcc invoca il compilatore, che traduce il file intermedio in assembly se non ci sono errori di sintassi. La compilazione produce un file con estensione .s

È possibile vedere come lavora il compilatore con il seguente comando gcc -S file.c, che produce il file file.s. Il processo viene interrotto dopo la fase di compilazione, partendo dal file sorgente iniziale.

Il passo successivo viene realizzato l'assembler, che prende in ingresso il file assembly e lo traduce in codice macchina, generando il file oggetto, con estensione .o.

È possibile vedere come lavora l'assembler con il seguente comando gcc -c file.c, che produce il file file.o, interrompendo il processo prima della fase di link.

L'ultimo passo è quello di link che partendo dal file oggetto generato dall'assembler e utilizzando le librerie standard che contengono le definizioni e realizzazioni dei sottoprogrammi di libreria (ad esempio scanf e printf) compone e crea il file eseguibile, il cui nome predefinito è a.out. È possibile specificare il nome del file eseguibile che si vuole ottenere, utilizzando l'opzione -o nomefileeseguibile.

Opzioni

In questo corso facciamo riferimento allo standard ANSI C 89, quindi specificheremo in fase di compilazione di verificare che le scelte sintattiche fatte siano allineate a questo standard. L'opzione che ci consente di indicare questa scelta è -std=c89
$ gcc -std=c89 -Wall -pedantic -o file_eseguibile file_sorgente.c
In alcuni contesti (ad esempio il gcc installato in Ubuntu per Windows 10) non è possibile specificare le opzioni, per cui la compilazione può essere fatta esclusivamente con il comando:
$ gcc -o file_eseguibile file_sorgente.c
In questo caso è lo sviluppatore che dovrà assicurarsi di avere adottato tutte e sole le linee guida dello standard C 89.