GNU Compiler Collection

La GNU Compiler Collection (gcc) és un conjunt de compiladors de llenguatges de programació creat pel Projecte GNU. Així doncs, és programari lliure distribuït per la Free Software Foundation (FSF) sota la llicència GNU General Public License (GPL), i és un dels components clau de les eines de GNU. Aquest conjunt de compiladors és l'estàndard per a sistemes operatius Unix-like (com Linux), i de certs sistemes operatius propietaris derivats dels primers com podria ser el Mac OS X.

El desenvolupament de GNU ha permès que es pugui utilitzar un ordinador sense programari respectant la llibertat dels usuaris.

Objectiu/Motivació 
L'objectiu principal d'un compilador és, a partir de codi font en qualsevol dels seus llenguatges de programació compatibles, generar un programa executable binari en el llenguatge màquina on s'haurà d'executar.

El desenvolupament del GCC forma part del projecte GNU,  i té l'objectiu de millorar el compilador que s'utilitza en el sistema GNU, inclosa la variant de Linux.

Aquest desenvolupament utilitza un entorn de desenvolupament obert i suporta moltes plataformes diferents amb la intenció de fomentar l'ús d'un compilador de categoria mundial. D'aquesta manera, s'assegura que el propi compilador i els sistemes desenvolupats de GNU funcionin amb les diferents arquitectures i entorns a més de estendre i millorar-ne les característiques.

Ha estat adoptat com el compilador principal per construir i desenvolupar un gran nombre de sistemes, incloent GNU/Linux, la BSDs, OS X, NeXTSTEP i BeOS.

Un dels principals avantatges del compilador GCC és l'ús del mateix analitzador per a totes les plataformes, de manera que si el codi del programa compila correctament en una, hi ha moltes possibilitats que ho faci en totes. Encara que aquest fet pugui produir que s'executi una mica més lentament justifica el seu ús un cost de desenvolupament més baix.

Història 
La necessitat d'un compilador gratuït pels sistemes operatius basats en Unix va impulsar Richard Stallman, l'any 1985 i mitjançant el Projecte GNU, a escriure des de zero el compilador GCC, amb el nom GNU C Compiler. Es va publicar la primera versió el març de 1987 i inicialment només suportava C.

El 1992 es va publicar la versió 2.0, que admetia el llenguatge C++.

El 1997, a la versió 3.0, es va crear EGCS, una branca experimental del compilador optimitzada per a C++.

GCC s'ha ampliat per admetre altres llenguatges de programació com Fortran, ADA, Java i Objective-C. Actualment, el desenvolupament de GCC està guiat pel Comitè directiu de GCC, un grup amb representació de les diferents comunitats d'usuaris a la indústria, a la investigació i al món acadèmic.

Estructura / Disseny 
La interfície exterior de GCC és estàndard per a un sistema UNIX. Els usuaris utilitzen un controlador anomenat gcc que interpreta, decideix quin compilador fa servir i executa un assemblador amb el codi resultant.

Tots els compiladors tenen una estructura interna comú: un front end i un back end.

Front end 
Els front end varien internament, havent de produir arbres que puguin ser manejats pel back end.

Fins fa poc els arbres no eren totalment independents del processador pel que es volia generar el codi.

Recentment s'han inclòs dos nous formats d'arbre independents de llenguatge: generic i gimple.

Back end 
El back end de GCC està parcialment definit pel preprocesador de macros específiques de cada arquitectura, que s'utilitzen per generar RTL (operació utilitada per transmetre informació). La execució del back end té lloc quan el programa ocupa el temps del processador per executar les comandes definides en el codi font.

A través de la implementació del compilador s'acostuma a generar un codi màquina molt similar al llenguatge propi. Això permet que la execució del back end tingui el menor número d'instruccions per obtenir el resultat marcat en el codi font.

Funcionament 
Per aconseguir l'objectiu de convertir un programa escrit per un humà a un arxiu executable per al ordinador, el procés de compilació involucra quatre etapes consecutives: Preprocesat, Compilació, Ensamblat, Enllaçat. Aquestes 4 etapes s'implementen amb comandes i tan es poden executar per separat o utilitzant una única ordre que les executi totes simultàniament.

Un exemple de programa creat per un humà seria així:

Exemple de programa simple en llenguatge C 
Programa cercle.c, que calcula l'àrea d'un cercle a partir del seu radi:

 #include <stdio.h>
#define PI 3.1416
int main()
{
 float area, radi;
 radi = 5;
 area = PI * (radi * radi);
 printf("Cercle.\n");
 printf(" Area del cercle de radi %f: %f\n\n", radi, area);

 return 0;
}

Preprocesat 
En aquesta etapa s'interpreten les directives al preprocessador. És l'etapa on les variables inicialitzades com a constants es substitueixen pel seu valor en totes les crides del codi.

Un exemple seria la definició de la constant PI 3.1416. Cada cop que el compilador trobi la constant, hi posarà el valor respectiu. Per implementar aquesta primera etapa utilitzarem la següent comanda: 

               $ gcc -E cercle.c > cercle.pp

Compilació 
Aquest segon pas transforma el codi C en el llenguatge ensamblador propi del processador de la nostra màquina. Per implementar l'etapa de compilació utilitzarem 

               $ gcc -S cercle.c

Ensamblat 
La penúltima etapa del procés transforma el programa escrit anteriorment en llenguatge assemblador, a codi objecte, un arxiu binari en el llenguatge maquina que ja pot ser executat pel processador.

               $ as -o cercle.o cercle.s

Enllaçat 
Quarta i última etapa del procés. En aquesta, s'afegeix el codi binari de funcions ja compilades i ensamblades en les respectives llibreries del sistema (com per exemple un printf())  dins de l'executable del nostre programa. En això consisteix l'etapa d'enllaç, en unir un o més mòduls del codi objecte generat amb el que ja existeix de les biblioteques. Aquesta és la comanda per a l'enllaçat:

               $ gcc  -o cercle cercle.o 

Sovint s'utilitza la compacta i més ràpida en la que s'executen totes les etapes alhora per compilar el nostre codi: 

               $ gcc  -o cercle cercle.c

Llenguatges de programació 
Fins a la versió 4.0, el compilador estàndard inclou el següent:
 C
 Ada (GCC per a Ada o GNAT)
 C++ (GCC for C++ o G++)
 Fortran (GCC per a Fortran o GFortran)
 Java (GCC per a Java o GCJ)
 Objective-C
 Objective-C++
 Go
 D
 BRIG (HSAIL)

També és compatible amb les extensions de C OpenMP i OpenACC.

El front end per G77 es va reemplaçar pel del nou GFortran que suporta Fortran 95. També existeixen front end per Pascal, Modula-2, Modula-3, Mercury, VHDL, PL/I i Objective-C++.

El GNU Compiler Collection admet altres llenguatges de programació que encara no estan integrats a la distribució principal del compilador, alguns s'integraran al futur.

Arquitectures 
A la versió 4.2.3 es suporta:

 ARC
 ARM
 Blackfin
 CRIS
 CRX
 Darwin
 DEC Alpha
 DEC Alpha/VMS
 FRV
 GNU/Linux
 H8/300
 H8/500
 HPPA
 IA-64 "Itanium"

 M32C
 M32R/D
 MIPS
 MMIX
 MN10300
 Morpho MT
 Motorola M680x0
 Motorola M68hc1x
 Motorola 88000
 PA-RISC
 PDP-11
 PowerPC
 RS/6000
 Score

 SPARC
 SuperH
 System/370
 System 390
 System V
 TMS320C3x/C4x
 V850
 VAX
 x86
 x86-64
 Xstormy16
 Xtensa
 zSeries

També es suporten altres arquitectures menys conegudes com A29K, Atmel AVR, C4x, D30V, DSP16xx, FR-30, FR-V, Intel i960, IP2000, MN10200, NS32K i ROMP.

Desenvolupament 
L'última versió estable publicada és la 9.3, el 22 de març de 2020.

Referències

Bibliografia 
 Arthur Griffith, GCC: The Complete Reference. McGrawHill/Osborne. .
 Brian J. Gough, Richard M. Stallman, An Introduction to GCC: for the GNU Compilers GCC and G++ . .
 Richard M. Stallman: Using and Porting the GNU Compiler Collection, Free Software Foundation, 
 Richard M. Stallman: Using Gcc: The Gnu Compiler Collection Reference, Free Software Foundation,

Enllaços externs 

 Manual 
 GCC weekly news summary 
 Building and Testing gcc/glibc cross toolchains 
 Wendling's overview of trees  
 GCC Wiki 
 Article "Linux C and C++ Compilers - A comparison via benchmarks on Opteron and Pentium " de Scott Robert Ladd 

Compiler Collection
Compiladors