Kompilace je proces, při kterém se zdrojový kód napsaný v programovacím jazyce (například C, C++, C#) převádí do jiné formy, kterou dokáže počítač přímo vykonat nebo kterou lze dále zpracovávat. Typicky se jedná o převod do:

  • strojového kódu (machine code) – instrukce přímo spustitelné procesorem,
  • mezikódu (intermediate code) – jazyk nezávislý na konkrétní architektuře,
  • bytecode – spustitelný na virtuálním stroji.

Účel kompilace:

  • detekce chyb ve zdrojovém kódu,
  • optimalizace kódu,
  • překlad do formy vhodné pro běh aplikace.

Životní cyklus aplikace zahrnuje dvě fáze:

  • Compile time – doba, kdy je aplikace překládána z programového kódu do spustitelné podoby.
  • Runtime – doba, kdy je aplikace spuštěná a vykonává svou činnost.

Kompilace v C

Kompilace v C probíhá v několika krocích:

  1. Preprocesor
    • Zpracuje příkazy začínající znakem # (například #include).
    • Vloží obsah hlavičkových souborů.
    • Nahrazuje makra.
  2. Kompilátor
    • Přeloží kód do assembleru, což je jazyk blízký strojovému kódu.
  3. Asembler
    • Převede assembler do objektového kódu (soubory s příponou .obj nebo .o).
  4. Linker
    • Spojí všechny části programu dohromady a vytvoří jeden spustitelný soubor (například .exe).

Výsledek: → Spustitelný program, který lze rovnou spustit na konkrétním systému.

Info

Zkompilovaný program je možné spustit jen na konkrétním systému, pro který byl program zkompilován.

Kompilace v C#

U jazyka C# je situace trochu jiná.

  • Kód se nepřekládá hned do strojového kódu.
  • Místo toho se překládá do CIL kódu (Common Intermediate Language), což je mezikód, který není vázaný na konkrétní procesor nebo operační systém.
  • Tento IL kód se uloží do souborů .dll nebo .exe.

Příklad IL instrukce:

ldstr "Hello world"
call void [System.Console]System.Console::WriteLine(string)

Spuštění programu

  • Když se spustí program, JIT kompilátor (Just-In-Time) přeloží IL kód do strojového kódu až za běhu.
  • Díky tomu může být kód optimalizovaný přímo pro konkrétní počítač.
  • Pokud dochází k opětovnému běhu nějaké části programu a je vyhodnoceno, že by jí mělo být možné optimalizovat, tak se tak učiní přímo za běhu bez nutnosti restartu aplikace.

AOT kompilace

Novější verze .NET (.NET 6+) umožňují tzv. AOT kompilaci (Ahead-of-Time).

  • Překládají IL kód dopředu do nativního strojového kódu ještě před spuštěním.
  • Program pak startuje rychleji a nepotřebuje tolik .NET runtime.

Nevýhoda:

  • Některé dynamické funkce (například reflexe) mohou být omezené.