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.
GNU Compiler Collection | ||||
---|---|---|---|---|
Ontwikkelaar(s) | GNU Project | |||
Uitgebracht | 23 mei 1987 (37 jaar geleden) | |||
Recentste versie | 14.2 (1 augustus 2024)[1] | |||
Onderhoudsversie | 9.2 / 8.3 / 7.4 / 6.5 / 5.5 (12 augustus 2019 / 22 februari 2019 / 6 december 2018 / 26 oktober 2018 / 10 oktober 2017) | |||
Status | Actief | |||
Besturingssysteem | Multiplatform | |||
Geschreven in | C++[2] | |||
Categorie | Compiler | |||
Licentie(s) | GNU General Public License en GNU Lesser General Public License | |||
Versiebeheer | Officiële broncode | |||
Website | (en) Projectpagina | |||
|
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
bewerkenGCC-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
bewerkenExterne links
bewerken- (en) gcc.gnu.org Projectpagina
- (en) Redhat.com From Source to Binary: The Inner Workings of GCC, RedHat Magazine, December, 2004
- (en) Versiegeschiedenis op GNU.org
- ↑ Jakub Jelínek, GCC 14.2 Released (1 augustus 2024). Geraadpleegd op 1 augustus 2024.
- ↑ (en) GCC Moves Forward With Conversion To C++
- ↑ (en) GCC 4.8 Release Series - Changes, New Features, and Fixes. Gearchiveerd op 8 juli 2023.
- ↑ (en) GCC 4.9 Compiler Supports IBM's Super-Fast POWER8
- ↑ a b (en) 3.17.37 IBM RS/6000 and PowerPC Options. Gearchiveerd op 29 mei 2023.
- ↑ (en) Status of Supported Architectures from Maintainers' Point of View
- ↑ (en) 3.10 Options That Control Optimization. Gearchiveerd op 1 juli 2023.