Per compilare il programma si utilizza il comando cc seguito dal nome del programma C sorgente, dove "cc" e' il nome del compilatore C. Ad esempio: cc prog.c Se il compilatore trova errori (in genere syntax error, come errori di battitura, errori di sintassi delle parole chiave o ";" omessi), questi vengono identificati e visualizzati; in caso contrario, viene creato il file eseguibile a.out. Il compilatore non identifica eventuali errori di logica del programma, quindi potrebbero essere eseguite delle operazioni errate, ed e' compito dell'utente trovarle (anche con l'ausilio di appositi programmi di debugging). In fase di compilazione possono essere specificate anche ulteriori opzioni: la piu' utilizzata e' "-o nome-file", che crea l'eseguibile con il nome nome-file invece di a.out, ma ne esistono altre come ad esempio "-c" (opzione senza argomenti, per la soppressione di link). Altra opzione possibile e' "-g", con cui e' necessario compilare per poter utilizzare il debugger "dbx". Ad esempio: cc prog.c -o prog (oppure cc -o prog.c prog) cc -c prog.c -o prog cc -g prog.c -o prog Per far eseguire il programma e' sufficiente scrivere il nome dell'eseguibile creato (e' ovvio che il file eseguibile deve avere i permessi per l'esecuzione, solitamente assegnati automaticamente in fase di compilazione): si avranno visualizzati sullo schermo gli eventuali risultati. Nel momento dell'esecuzione e' possibile osservare ed identificare eventuali errori di run-time, come ad esempio le divisioni per zero; in tal caso l'esecuzione termina irregolarmente e viene generato un file core con lo stato del programma in esecuzione al momento del verificarsi dell'errore. Se il programma in esecuzione non rilascia errori ma produce output errati, e' evidente che contiene errori logici; questi andranno corretti editando il programma sorgente, questo dovra' essere ricompilato e si potra' lanciare nuovamente l'esecuzione. La compilazione del programma C avviene attraverso le seguenti fasi: - un preprocessore che accetta il codice sorgente come input ed e' resposabile della: - rimozione di commenti - interpretazione di speciali direttive per il preprocessore denotate da "#". Ad esempio: #include - include il contenuto di un determinato file (solitamente chiamato header, con suffisso ".h"). #include <math.h> - standard library maths file. #include <stdio.h> - standard library I/O file #define - definisce un nome simbolico o una costante (sostituzione di una macro). #define MAX_ARRAY_SIZE 100 - il compilatore C che traduce il codice sorgente ricevuto dal preprocessore in codice assembly. - l' assembler che crea il codice oggetto (in UNIX i file con il suffisso .o sono i file in codice oggetto, che corrispondono ai file .obj in MSDOS). - il link editor che combina le funzioni definite in altri file sorgenti o definite in librerie, con la funzione main() per creare il file eseguibile. Infatti molte delle funzioni presenti in altri linguaggi non sono incluse nel C (ad esempio, funzioni di I/O, di manipolazione di stringhe o matematiche), ma il C fornisce tali funzionalita' attraverso un ricco insieme di librerie di funzioni. Molte applicazioni C includono librerie standard di funzioni per coprire le utilita' mancanti. In questa fase vengono anche ricostruiti i riferimenti alle variabili esterne utilizzate nei sorgenti C.