Obsah
GCC (GNU Compiler Collection)
GCC je klíčová součást projektu GNU. Původně vznikl v roce 1987 pod taktovkou Richarda Stallmana jako „GNU C Compiler“, protože v té době dokázal překládat pouze jazyk C. Dnes je to modulární systém, který podporuje desítky jazyků a procesorových architektur.
1. Podporované jazyky a platformy
Ačkoliv se nejčastěji používá pro C a C++, GCC obsahuje front-endy pro mnoho dalších jazyků:
- C++, Objective-C, Objective-C++
- Fortran (pro vědecké výpočty)
- Ada
- Go
- D
Z hlediska hardwaru je GCC „králem přenositelnosti“. Podporuje vše od starých mainframů po moderní mobilní procesory ARM a mikrokontroléry.
2. Jak probíhá kompilace (Fáze překladu)
Přeměna lidsky čitelného kódu na binární soubor není jeden skok, ale proces o čtyřech krocích:
1. **Preprocessing (Preprocesor):** Zpracuje direktivy začínající mřížkou (např. ''#include'' nebo ''#define''). Výsledkem je jeden velký textový soubor. 2. **Compilation (Kompilace):** Přeloží kód v C/C++ do jazyka symbolických adres ([[Assembly Language]]). 3. **Assembly (Sestavení):** Assembler převede kód do strojového (binárního) kódu – vznikají tzv. **objektové soubory** (.o). 4. **Linking (Sestavení/Linkování):** Linker spojí objektové soubory a systémové knihovny (jako [[glibc]]) do jednoho spustitelného souboru.
3. Klíčové parametry a přepínače
Práce s GCC v Bashi obvykle probíhá přes příkazovou řádku. Zde jsou ty nejdůležitější parametry:
| Přepínač | Význam |
|---|---|
| -o <jmeno> | Určuje název výsledného spustitelného souboru. |
| -Wall | Zapne „všechna“ varování (velmi doporučeno pro čistý kód). |
| -O2 / -O3 | Úrovně optimalizace. Vyšší číslo znamená rychlejší program, ale delší kompilaci. |
| -g | Přidá do souboru ladicí informace (potřebné pro program gdb). |
| -std= | Určuje verzi standardu (např. -std=c++20). |
Příklad příkazu:
gcc -O2 -Wall muj_program.c -o spustitelny_soubor
4. Architektura GCC
GCC je rozděleno na tři části, což umožňuje snadné přidávání nových jazyků nebo procesorů:
- Frontend: Rozumí konkrétnímu jazyku (C, Fortran) a převede ho do univerzálního mezikódu zvaného GIMPLE.
- Middle-end: Provádí optimalizace nezávislé na procesoru.
- Backend: Generuje kód pro konkrétní procesor (x86, ARM, RISC-V).
5. GCC vs. LLVM/Clang
V posledních letech získalo GCC silnou konkurenci v podobě projektu LLVM (Clang).
| Vlastnost | GCC | LLVM / Clang |
| — | — | — |
| Licence | GPL (přísně svobodná) | Apache/BSD (volnější) |
| Rychlost kompilace | Často pomalejší | Obvykle rychlejší |
| Chybové hlášky | Historicky stručné | Velmi srozumitelné a barevné |
| Optimalizace | Špičková, často nejlepší výsledný kód | Skvělá, ale v některých případech mírně za GCC |
—
Zajímavost: GCC je „self-hosting“. To znamená, že moderní verze GCC jsou napsány v C++ a k jejich přeložení potřebujete dřívější verzi GCC. Je to klasický problém „slepice nebo vejce“, který se řeší tzv. bootstrappingem.
Související: C++, glibc, Linux, Assembly Language, Bash
