Co je to návrh kompilátoru? Typy, Stavební nářadí, Příklad
⚡ Chytré shrnutí
Fáze kompilátoru popisují šest fází, které transformují zdrojový kód do strojového kódu: lexikální analýza, syntaktická analýza, sémantická analýza, generování mezikódu, optimalizace kódu a generování kódu, podporované správou tabulek symbolů a ošetřením chyb.
Jaké jsou fáze návrhu kompilátoru?
A překladač pracuje v různých fázích a každá fáze transformuje zdrojový program z jedné reprezentace do druhé. Každá fáze přijímá vstupy z předchozí fáze a svůj výstup předává do další fáze kompilátoru. V kompilátoru existuje 6 fází. Každá z těchto fází pomáhá při převodu jazyka vyšší úrovně do strojového kódu. Fáze kompilátoru jsou:
- Lexikální analýza
- Syntaktická analýza
- Sémantická analýza
- Mezilehlý generátor kódu
- Code optimalizátor
- Code generátor
Fáze kompilátoru
Všechny tyto fáze převádějí zdrojový kód jeho rozdělením na tokeny, vytvářením parsovacích stromů a optimalizací zdrojového kódu v různých fázích.
Fáze 1: Lexikální analýza
Lexikální analýza je první fází, kdy kompilátor prohledává zdrojový kód. Tento proces může probíhat zleva doprava, znak po znaku, a tyto znaky seskupuje do tokenů.
Zde je proud znaků ze zdrojového programu seskupen do smysluplných sekvencí identifikací tokenů. Provede se zápis odpovídajících tokenů do tabulky symbolů a tento token se předá do další fáze.
Primární funkce této fáze jsou:
- Identifikujte lexikální jednotky ve zdrojovém kódu.
- Klasifikujte lexikální jednotky do tříd, jako jsou konstanty, rezervovaná slova, a zadejte je do různých tabulek. Komentáře ve zdrojovém programu budou ignorovány.
- Identifikujte token, který není součástí jazyka.
Příklad: x = y + 10
| Známka | Typ |
|---|---|
| X | identifikátor |
| = | Operátor přiřazení |
| Y | identifikátor |
| + | Operátor sčítání |
| 10 | Číslo |
Fáze 2: Analýza syntaxe
Syntaktická analýza se zabývá objevováním struktury kódu. Určuje, zda text odpovídá očekávanému formátu. Hlavním cílem této fáze je ujistit se, že zdrojový kód napsaný programátorem je správný, či nikoli.
Syntaktická analýza je založena na pravidlech specifického programovacího jazyka konstrukcí parsovacího stromu s pomocí tokenů. Také určuje strukturu zdrojového jazyka a gramatiku neboli syntaxi jazyka.
Zde je seznam úkolů prováděných v této fázi:
- Získejte tokeny z lexikálního analyzátoru.
- Zkontrolujte, zda je výraz syntakticky správný, či nikoli.
- Nahlásit všechny syntaktické chyby.
- Vytvořte hierarchickou strukturu, která je známá jako parsovací strom.
Příklad
Libovolný identifikátor/číslo je výraz. Pokud je x identifikátor a y+10 je výraz, pak x = y+10 je příkaz. Uvažujme syntaktický strom pro následující příklad:
(a+b)*c
V analyzačním stromu:
- Vnitřní uzel: záznam s polem operátoru a dvěma poli pro podřízené položky.
- List: záznamy se 2 nebo více poli; jedno pro token a další informace o tokenu.
- Zajistěte, aby jednotlivé složky programu do sebe smysluplně zapadly.
- Shromažďuje informace o typech a kontroluje kompatibilitu typů.
- Kontrolní operandy jsou povoleny zdrojovým jazykem.
Fáze 3: Sémantická analýza
Sémantická analýza kontroluje sémantickou konzistenci kódu. K ověření, zda je daný zdrojový kód sémanticky konzistentní, používá syntaktický strom předchozí fáze spolu s tabulkou symbolů. Kontroluje také, zda kód vyjadřuje vhodný význam.
Sémantický analyzátor zkontroluje neshodu typů, nekompatibilní operandy, funkci volanou s nesprávnými argumenty, nedeklarovanou proměnnou atd.
Funkce fáze sémantické analýzy jsou:
- Pomáhá ukládat shromážděné informace o typech a ukládat je do tabulky symbolů nebo syntaktického stromu.
- Umožňuje provádět kontrolu typů.
- V případě neshody typů, kdy neexistují přesná pravidla pro korekci typů, která by splňovala požadovanou operaci, se zobrazí sémantická chyba.
- Shromažďuje informace o typech a kontroluje kompatibilitu typů.
- Zkontroluje, zda zdrojový jazyk povoluje operandy, či nikoli.
Příklad
float x = 20.2; float y = x*30;
Ve výše uvedeném kódu sémantický analyzátor před násobením převede celé číslo 30 na číslo s plovoucí čárkou 30.0.
Fáze 4: Střední Code Generace
Jakmile je fáze sémantické analýzy ukončena, kompilátor vygeneruje pro cílový počítač mezikód. Ten představuje program pro nějaké abs...tracstroj.
Mezikód se nachází mezi programovacím jazykem vysoké úrovně a strojovým jazykem. Tento mezikód musí být generován tak, aby bylo snadné ho přeložit do cílového strojového kódu.
Funkce meziproduktu Code generace:
- Měl by být generován ze sémantické reprezentace zdrojového programu.
- Uchovává hodnoty vypočítané během procesu překladu.
- Pomáhá vám přeložit mezikód do cílového jazyka.
- Umožňuje zachovat pořadí priorit zdrojového jazyka.
- Obsahuje správný počet operandů instrukce.
Příklad
Například:
total = count + rate * 5
Mezikód s pomocí metody adresního kódu je:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
Fáze 5: Code Optimalizace
Další fází je optimalizace kódu mezilehlého kódu. Tato fáze odstraňuje nepotřebné řádky kódu a uspořádává posloupnost příkazů tak, aby se urychlilo provádění programu bez plýtvání zdroji. Hlavním cílem této fáze je vylepšit mezilehlý kód a vygenerovat kód, který běží rychleji a zabírá méně místa.
Primární funkce této fáze jsou:
- Pomáhá vám najít kompromis mezi rychlostí provádění a rychlostí kompilace.
- Zlepšuje dobu běhu cílového programu.
- Generuje zjednodušený kód stále v mezilehlé reprezentaci.
- Odstranění nedostupného kódu a zbavení se nepoužívaných proměnných.
- Odebrání příkazů, které se ze smyčky nemění.
Příklad: Zvažte následující kód:
a = intofloat(10)
b = c * a
d = e + b
f = d
Může se stát:
b = c * 10.0
f = e + b
Fáze 6: Code Generace
Code Generování kódu je poslední a závěrečná fáze kompilátoru. Získává vstupy z fáze optimalizace kódu a jako výsledek vytváří kód stránky nebo objektový kód. Cílem této fáze je alokovat úložiště a generovat přemístitelný strojový kód.
Také alokuje paměťové adresy pro proměnné. Instrukce v mezikódu jsou převedeny na strojové instrukce. Tato fáze převádí optimalizovaný nebo mezikód do cílového jazyka.
Cílovým jazykem je strojový kód. Proto jsou v této fázi také vybrány a přiděleny všechny paměťové adresy a registry. Kód vygenerovaný v této fázi je prováděn tak, aby přijímal vstupy a generoval očekávané výstupy.
Příklad
a = b + 60.0 by se do registrů pravděpodobně přeložilo jako:
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Správa tabulky symbolů
Tabulka symbolů obsahuje záznam pro každý identifikátor s poli pro atributy identifikátoru. Tato komponenta usnadňuje kompilátoru vyhledávání záznamu identifikátoru a jeho rychlé načtení. Tabulka symbolů vám také pomáhá se správou rozsahu platnosti. Tabulka symbolů a obslužná rutina chyb interagují se všemi fázemi a tabulka symbolů se odpovídajícím způsobem aktualizuje.
Rutina zpracování chyb
V procesu návrhu kompilátoru se mohou chyby vyskytnout ve všech níže uvedených fázích:
- Lexikální analyzátor: Špatně napsané žetony.
- Syntaktický analyzátor: Chybí závorka.
- Generátor mezilehlého kódu: Neshodující se operandy pro operátor.
- Code Optimalizátor: Když je výpis nedosažitelný.
- Code Generator: Když je paměť plná nebo nejsou alokovány správné registry.
- Tabulky symbolů: Chyba více deklarovaných identifikátorů.
Nejčastějšími chybami jsou neplatné sekvence znaků při skenování, neplatné sekvence tokenů v typu, chyba rozsahu a parsování v sémantické analýze.
K chybě může dojít v kterékoli z výše uvedených fází. Po nalezení chyb se musí fáze s nimi vypořádat, aby mohla pokračovat kompilace. Tyto chyby je třeba nahlásit obsluze chyb, která je zpracuje a provede kompilaci. Chyby jsou obvykle hlášeny ve formě zprávy.



