GNU Compiler Collection o in breve GCC (in origine GNU C Compiler) è un compilatore ottimizzantemultipiattaforma creato inizialmente dal fondatore della Free Software Foundation, Richard Matthew Stallman, come parte del Progetto GNU. Disponibile per vari linguaggi, architetture e sistemi operativi, GCC è distribuito in forma libera dalla Free Software Foundation tramite la licenza GPL. Le versioni recenti sono incluse nelle principali distribuzioni del sistema operativo GNU/Linux, e di molti altri sistemi, mentre su macOS non è installato di base, ma è parte del pacchetto Xcode, che dalla versione 5.0 comprende un altro compilatore, llvm, che sostituisce gcc.
GCC è stato creato nel 1987 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 dalla Free Software Foundation.
Nel 1997 un gruppo di sviluppatori insoddisfatti dalla natura chiusa degli sviluppi e dal loro ritmo troppo lento ha creato il progetto EGCS (Experimental/Enhanced GNU Compiler System), che incorporava diversi fork sperimentali in una linea di sviluppo unica, separata da GCC. Lo sviluppo di EGCS si è dimostrato sufficientemente vitale e nell'aprile del 1999 EGCS è stato promosso al rango di versione ufficiale di GCC.[1][2]
GCC viene oggi sviluppato da programmatori di ogni parte del mondo ed è stato portato su più tipi di processori e sistemi operativi di qualsiasi altro compilatore.
Oltre a essere il compilatore ufficiale del sistema GNU, incluse le varianti di GNU/Linux, GCC è stato adottato come compilatore principale per la creazione e lo sviluppo di diversi altri sistemi operativi, come i vari BSD, macOS, NeXTSTEP e BeOS e DOS tramite il suo porting DJGPP.
Linguaggi
La versione standard del compilatore comprende i front end per i linguaggi:
L'SDCC (Small Devices C Compiler) è un portingopen source per i microcontrollori delle sole famiglie Z80, 8051, 68HC11, Pic è stato separato dal progetto GCC per poter ottimizzare meglio il lavoro dei microcontrollori, dove serve una grande efficienza del compilatore e contemporaneamente vivere in un ambiente molto povero di risorse RAM e ROM, 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 file main.c (.c è l'estensione standard dei file contenenti codice C) e compilarlo. Poiché non è stato specificato nessun nome per il file di output tramite il parametro -o, il file eseguibile viene chiamato a.out.
La compilazione avviene in tre fasi:
il file da compilare viene trattato dal preprocessore, 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 nuovo file oggetto, che non è ancora eseguibile;
a questo punto entra in funzione il linker che produce un unico file eseguibile, contenente il tutto, unendo tra loro tutti i file oggetto e i file delle librerie. Se si desidera non incorporare il codice delle librerie nel file eseguibile, si può usare il collegamento dinamico.