Definícia a účel kompilátora

Globálne dáta, konceptuálne umenie

ANDRZEJ WOJCICKI / Getty Images





A kompilátor je a program to znamená čitateľné pre ľudí zdrojový kód do počítačom spustiteľného strojového kódu. Aby to bolo možné úspešne vykonať, ľudsky čitateľný kód musí byť v súlade s syntax pravidlá akéhokoľvek programovacieho jazyka, v ktorom je napísaný. Kompilátor je iba program a nemôže za vás opraviť váš kód. Ak urobíte chybu, musíte opraviť syntax, inak sa neskompiluje.

Čo sa stane, keď kompilujete kód?

Zložitosť kompilátora závisí od syntaxe jazyka a miery abstrakcie ten programovací jazyk poskytuje. Kompilátor C je oveľa jednoduchší ako kompilátor pre C++ alebo C#.



Lexikálna analýza

Pri kompilácii kompilátor najprv načíta prúd znakov zo súboru zdrojového kódu a vygeneruje prúd lexikálnych tokenov. Napríklad kód C++:

|_+_||_+_|

možno analyzovať ako tieto tokeny:



  • napíš 'int'
  • premenná 'C'
  • rovná sa
  • ľavá zátvorka
  • premenná 'A'
  • krát
  • premenná 'B'
  • pravá zátvorka
  • plus
  • doslovné '10'

Syntaktická analýza

Lexikálny výstup ide do časti syntaktického analyzátora kompilátora, ktorá používa pravidlá gramatiky na rozhodnutie, či je vstup platný alebo nie. Pokiaľ premenných A a B boli predtým deklarované a boli v rozsahu, kompilátor by mohol povedať:

  • „A“ : nedeklarovaný identifikátor.

Ak boli deklarované, ale neboli inicializované. kompilátor vydá varovanie:

  • lokálna premenná 'A' použitá bez toho, aby bola inicializovaná.

Nikdy by ste nemali ignorovať varovania kompilátora. Môžu prelomiť váš kód zvláštnymi a neočakávanými spôsobmi. Vždy opravte upozornenia kompilátora.

Jeden prechod alebo dva?

Niektoré programovacie jazyky sú napísané tak, že kompilátor môže prečítať zdrojový kód iba raz a vygenerovať strojový kód. Pascal je jedným z takýchto jazykov. veľa kompilátorov vyžadujú aspoň dva prechody. Niekedy je to kvôli predčasným vyhláseniam o funkcie alebo triedy.



V C++ môže byť trieda deklarovaná, ale definovaná až neskôr. Kompilátor nie je schopný zistiť, koľko pamäte trieda potrebuje, kým neskompiluje telo triedy. Pred vygenerovaním správneho strojového kódu si musí znovu prečítať zdrojový kód.

Generovanie strojového kódu

Za predpokladu, že kompilátor úspešne dokončí lexikálne a syntaktické analýzy, poslednou fázou je generovanie strojového kódu. Ide o komplikovaný proces, najmä pri moderných CPU.



Rýchlosť zostavenia spustiteľný kód by mal byť čo najrýchlejší a môže sa výrazne líšiť v závislosti od kvality generovaného kódu a množstva požadovaných optimalizácií.

Väčšina kompilátorov vám umožňuje špecifikovať množstvo optimalizácie – zvyčajne známe pre rýchle ladiace kompilácie a úplnú optimalizáciu pre uvoľnený kód.



Generovanie kódu je náročné

Autor kompilátora čelí problémom pri písaní generátora kódu. Mnoho procesorov urýchľuje spracovanie použitím

Ak sú všetky pokyny v kóde slučka možno držať v CPU cache, potom táto slučka beží oveľa rýchlejšie, ako keď musí CPU načítať inštrukcie z hlavnej RAM. Cache CPU je blok pamäte zabudovaný do CPU čipu, ku ktorému sa pristupuje oveľa rýchlejšie ako k dátam v hlavnej RAM.



Vyrovnávacie pamäte a fronty

Väčšina CPU má front na predbežné načítanie, kde CPU načíta inštrukcie do vyrovnávacej pamäte pred ich vykonaním. Ak dôjde k podmienenej vetve, CPU musí znovu načítať front. Kód by sa mal vygenerovať, aby sa to minimalizovalo.

Mnoho CPU má samostatné časti pre:

  • Celočíselná aritmetika (celé čísla)
  • Aritmetika s pohyblivou rádovou čiarkou (zlomkové čísla)

Tieto operácie môžu často prebiehať paralelne, aby sa zvýšila rýchlosť.

Kompilátory zvyčajne generujú strojový kód do objektových súborov, ktoré sú potom spojený spoločne pomocou linkerového programu.