GCC è stato creato nel1987 da Richard Stallman come parte del sistema GNU, che aveva bisogno di un compilatore che fosse software libero. Il suo sviluppo è stato seguito da vicino dallaFree Software Foundation.
Nel1997 un gruppo di sviluppatori insoddisfatti dalla natura chiusa degli sviluppi e dal loro ritmo troppo lento ha creato il progettoEGCS (Experimental/Enhanced GNU Compiler System), che incorporava diversifork sperimentali in una linea di sviluppo unica, separata da GCC. Lo sviluppo diEGCS si è dimostrato sufficientemente vitale e nell'aprile del1999 EGCS è stato promosso al rango di versione ufficiale di GCC.[1][2]
GCC viene oggi sviluppato da programmatori di ogni parte del mondo ed è statoportato su più tipi diprocessori e sistemi operativi di qualsiasi altro compilatore.
Oltre a essere il compilatore ufficiale del sistemaGNU, incluse le varianti diGNU/Linux, GCC è stato adottato come compilatore principale per la creazione e lo sviluppo di diversi altri sistemi operativi, come i variBSD,macOS,NeXTSTEP eBeOS e DOS tramite il suo porting DJGPP.
L'SDCC (Small Devices C Compiler) è unportingopen source per i microcontrollori delle sole famiglieZ80,8051,68HC11,Pic è stato separato dal progetto GCC per poter ottimizzare meglio il lavoro deimicrocontrollori, dove serve una grande efficienza del compilatore e contemporaneamente vivere in un ambiente molto povero di risorseRAM eROM, con interfacce personalizzate e dotato di registri speciali incompatibili con l'elaborazione.
Nonostante il piccolo numero di target disponibili, il compilatore è molto quotato e nella maggior parte delle situazioni dà risultati migliori dei sistemi di sviluppo professionali a pagamento.
Ad esempio, per compilare un file di codice sorgente scritto in C, si può eseguire gcc fornendogli in input il file desiderato. Esiste un grandissimo numero di parametri che è possibile passare al compilatore per gestire i vari aspetti e i vari dettagli del processo di generazione del codice; l'unico obbligatorio è il nome del file da compilare.
Un esempio elementare di compilazione è il comando
gccmain.c
che ordina al compilatore di leggere il filemain.c (.c è l'estensione standard dei file contenenticodice C) e compilarlo. Poiché non è stato specificato nessun nome per il file di output tramite il parametro-o, il file eseguibile viene chiamatoa.out.
La compilazione avviene in tre fasi:
il file da compilare viene trattato dalpreprocessore, che analizza le direttive scritte per il compilatore (definite in alcune righe del codice, solitamente posizionate in testa al file e precedute dal carattere#). Se eseguito con il parametro-E, gcc esegue solo questo passo, fornendo in output il risultato delle attività del preprocessore;
nella seconda fase, il file dà origine a un nuovofile oggetto, che non è ancora eseguibile;
a questo punto entra in funzione illinker che produce un unicofile eseguibile, contenente il tutto, unendo tra loro tutti i file oggetto e i file dellelibrerie. Se si desidera non incorporare il codice delle librerie nel file eseguibile, si può usare ilcollegamento dinamico.