prekladač je a program čo prekladá ľudsky čitateľné zdrojový kód do počítačového spustiteľného strojového kódu. Aby to bolo možné úspešne urobiť, musí byť ľudsky čitateľný kód v súlade s syntax pravidlá ktoréhokoľvek programovacieho jazyka, v ktorom je napísaný. Kompilátor je iba program a nedokáže opraviť váš kód za vás. Ak urobíte chybu, musíte opraviť syntax, inak sa nebude kompilovať.
Čo sa stane, keď kompilujete kód?
Zložitosť kompilátora závisí od syntaxe jazyka a od abstrakcie tento 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 najskôr načíta prúd znakov zo súboru zdrojového kódu a vygeneruje tok lexikálnych tokenov. Napríklad kód C ++:
int C = (A * B) +10;
môžu byť analyzované ako tieto tokeny:
- napíšte „int“
- premenná "C"
- rovní
- leftbracket
- premenná "A"
- doba
- premenná "B"
- rightbracket
- plus
- doslovný „10“
Syntaktická analýza
Lexikálny výstup ide do syntaktickej analyzátorovej časti kompilátora, ktorá používa gramatické pravidlá na rozhodnutie, či je vstup platný alebo nie. Pokiaľ
premenné A a B boli predtým deklarované a boli v rozsahu, kompilátor môže povedať:- „A“: neohlásený identifikátor.
Ak boli vyhlásené, ale neboli inicializované. kompilátor upozorní:
- lokálna premenná „A“ použitá bez inicializácie.
Nikdy by ste nemali ignorovať varovania kompilátora. Môžu zlomiť váš kód zvláštnymi a neočakávanými spôsobmi. Upozornenia kompilátora vždy opravujte.
One Pass or Two?
Niektoré programovacie jazyky sú napísané, takže kompilátor dokáže načítať zdrojový kód iba raz a vygenerovať strojový kód. pascal je jedným takým jazykom. veľa prekladače vyžadujú najmenej dva prihrávky. Niekedy je to kvôli predbežným vyhláseniam o funkcie alebo triedy.
V C ++ môže byť trieda deklarovaná, ale nedefinovaná neskôr. Kompilátor nedokáže zistiť, koľko pamäte potrebuje trieda, kým nezkompiluje telo triedy. Pred vygenerovaním správneho strojového kódu musí znova prečítať zdrojový kód.
Generovanie strojového kódu
Za predpokladu, že kompilátor úspešne dokončí lexikálnu a syntaktickú analýzu, záverečnou fázou je vygenerovanie strojového kódu. Toto je komplikovaný proces, najmä s modernými procesormi.
Rýchlosť zostavenia spustiteľný kód by mal byť čo najrýchlejší a môže sa značne líšiť podľa kvality vygenerovaného kódu a požadovanej optimalizácie.
Väčšina kompilátorov vám umožňuje určiť mieru optimalizácie - zvyčajne známa pre rýchle ladenie kompilácií a úplnú optimalizáciu vydaného kódu.
Generovanie kódu je náročné
Spisovateľ kompilátora čelí problémom pri písaní generátora kódu. Mnoho procesorov urýchľuje spracovanie pomocou
- Potrubné vedenie
- interný cache.
Ak sú všetky pokyny v kóde slučka sa môže konať v CPU vyrovnávacej pamäte, potom táto slučka beží oveľa rýchlejšie, ako keď procesor musí načítať pokyny z hlavnej pamäte RAM. Pamäť CPU je blok pamäte zabudovaný do CPU čipu, ku ktorému sa pristupuje oveľa rýchlejšie ako k údajom v hlavnej pamäti RAM.
Caches and Queues
Väčšina CPU má front predbežného načítania, kde CPU pred ich vykonaním načíta pokyny do vyrovnávacej pamäte. Ak dôjde k podmienenej vetve, CPU musí front znova načítať. Kód by sa mal vygenerovať, aby sa to minimalizovalo.
Mnoho CPU má samostatné časti pre:
- Celá aritmetika (celé čísla)
- Aritmetika s pohyblivou rádovou čiarkou (zlomkové čísla)
Tieto operácie môžu často prebiehať súbežne, aby sa zvýšila rýchlosť.
Kompilátory zvyčajne generujú strojový kód do objektových súborov, ktoré sú potom spojený spolu pomocou programu linker.