# GNU Compiler Collection

GCC, wat staat voor GNU Compiler Collection is een verzameling compilers, die onder de GPL wordt verspreid door de Free Software Foundation. Oorspronkelijk stond de afkorting voor de GNU C Compiler, maar nu kan GCC ook andere programmeertalen dan C aan, zoals C++, Fortran, Java en Ada.
GCC is een belangrijk hulpmiddel voor vrije software. De oorspronkelijke GCC is geschreven door Richard Stallman in 1987. Nu wordt GCC beheerd door een groep programmeurs verspreid over de hele wereld. GCC is geporteerd naar meer processoren en besturingssystemen dan enige andere compiler.

## Structuur

GCC-compilers bestaan uit een frontend, een middle-end en een backend. Het programma gcc is zelf geen compiler, maar zorgt ervoor dat de juiste onderdelen van GCC worden aangeroepen, afhankelijk van de brontaal die gecompileerd wordt.
De frontend is taalspecifiek: iedere taal die door GCC gecompileerd kan worden heeft een eigen frontend. Tot de taken van de frontend behoren het parsen van de broncode en uitvoeren van taalspecifieke controles zoals type checking. De frontend creëert een abstracte syntaxisboom (abstract syntax tree, AST) van de broncode in een interne representatie (IR) die GENERIC wordt genoemd.
Nadat de frontend een GENERIC-representatie van het programma heeft gecreëerd wordt deze doorgegeven aan de middle-end. Alle GCC-compilers gebruiken dezelfde middle-end en backend: deze twee zijn volledig taalonafhankelijk en werken op taalonafhankelijke IRs.
De GENERIC-representatie gecreëerd door een frontend wordt doorgegeven aan de middle-end. Deze converteert de GENERIC AST naar een andere IR, GIMPLE genoemd. GIMPLE is een subset van GENERIC, maar legt een aantal restricties op. Zo hebben bijvoorbeeld expressies in GIMPLE niet meer dan drie operands. Deze GIMPLE wordt vervolgens geoptimaliseerd.
Vervolgens wordt de geoptimaliseerde GIMPLE-representatie omgezet naar SSA (Static Single Assignment). Het belangrijkste kenmerk van SSA is dat er aan iedere variabele slechts één keer een waarde wordt toegewezen. Variabelen veranderen dus nooit van waarde. Bij het omzetten naar SSA wordt op iedere plek waar een waarde aan een bestaande variabele wordt toegewezen een nieuwe variabele geïntroduceerd. Door deze eigenschap is SSA bijzonder geschikt voor een aantal optimalisaties.
De geoptimaliseerde SSA wordt vervolgens omgezet in RTL (Register Transfer Language). RTL is een interne representatie die bestaat uit instructies voor een virtuele machine met een oneindig aantal registers. In tegenstelling tot de andere IRs is de representatie van een programma in RTL afhankelijk van de processor waarvoor gecompileerd wordt. Dit maakt een aantal processor-specifieke peephole-optimalisaties mogelijk.
Omdat deze optimalisaties processorafhankelijk zijn, vindt deze optimalisatiefase plaats in de backend van GCC: de backend krijgt de RTL-representatie van de broncode aangeleverd door de middle-end. Na optimalisatie gebruikt de backend deze RTL om assembler te genereren.
Op dit punt heeft GCC zijn werk gedaan, en wordt de gegenereerde assembler doorgegeven aan een assembleerprogramma, dat zelf geen deel uitmaakt van GCC, om machinetaal te produceren. Om van deze machinetaal een uitvoerbaar bestand te maken moet deze eerst nog gelinkt worden door de linker.

## Functies

* Ondersteunde processorarchitecturen: AArch64, ARM, i386, x86-64, IBM POWER8, RS/6000, PowerPC, SPARC en andere
* Code-optimalisatie