# 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:

### 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:

### 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

### 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.

### 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:
Sovint s'utilitza la compacta i més ràpida en la que s'executen totes les etapes alhora per compilar el nostre codi:

## 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

* ↑ «¿Qué es un programa compilador - Base de Conocimientos - ICTEA». [Consulta: 7 abril 2020].
* ↑ «GCC Development Mission Statement (1999-04-22) - GNU Project - Free Software Foundation (FSF)». [Consulta: 7 abril 2020].
* ↑ Gough, Brian. An Introduction to GCC for the GNU Compilers gcc and g++ (en anglès). Anglaterra: Network Theory Limited, 7/03/2004. ISBN 0-9541617-9-3.
* ↑ «El compilador GCC - Tutorial». [Consulta: 7 abril 2020].
* ↑ «GCC Front Ends - GNU Project - Free Software Foundation (FSF)». [Consulta: 7 abril 2020].
* ↑ «El compilador GCC - Tutorial». [Consulta: 7 abril 2020].
* ↑ «GCC - EcuRed». [Consulta: 7 abril 2020].
* ↑ «GCC 9 Release Series - GNU Project - Free Software Foundation (FSF)». [Consulta: 29 març 2020].
* ↑ «GCC 9.3 Compiler Released With Over 150 Bug Fixes - Phoronix». [Consulta: 29 març 2020].

## Bibliografia

* Arthur Griffith, GCC: The Complete Reference. McGrawHill/Osborne. ISBN 0-07-222405-3.
* Brian J. Gough, Richard M. Stallman, An Introduction to GCC: for the GNU Compilers GCC and G++ . ISBN 978-0954161798.
* Richard M. Stallman: Using and Porting the GNU Compiler Collection, Free Software Foundation, ISBN 0-595-10035-X
* Richard M. Stallman: Using Gcc: The Gnu Compiler Collection Reference, Free Software Foundation, ISBN 1-882114-39-6

## Enllaços externs

* Manual (anglès)
* Building and Testing gcc/glibc cross toolchains (anglès)
* Wendling's overview of trees Arxivat 2005-02-08 a Wayback Machine. (anglès)
* GCC Wiki (anglès)
* Article "Linux C and C++ Compilers - A comparison via benchmarks on Opteron and Pentium Arxivat 2005-04-15 a Wayback Machine." de Scott Robert Ladd (anglès)