Fáze kompilátoru s příkladem: Proces kompilace a kroky
Jaké jsou fáze návrhu kompilátoru?
překladač pracuje v různých fázích, každá fáze transformuje zdrojový program z jedné reprezentace do druhé. Každá fáze přebírá vstupy ze své předchozí fáze a dodává svůj výstup do další fáze kompilátoru.
V kompilátoru je 6 fází. Každá z těchto fází pomáhá při převodu jazyka vysoké úrovně na strojový kód. Fáze kompilátoru jsou:
- Lexikální analýza
- Syntaktická analýza
- Sémantická analýza
- Mezilehlý generátor kódu
- Optimalizátor kódu
- Generátor kódů

Všechny tyto fáze převádějí zdrojový kód rozdělením do tokenů, vytvářením stromů analýzy a optimalizací zdrojového kódu podle různých fází.
Fáze 1: Lexikální analýza
Lexikální analýza je první fází, kdy kompilátor skenuje zdrojový kód. Tento proces lze zleva doprava, znak po znaku, a seskupovat tyto znaky do žetonů.
Zde je proud znaků ze zdrojového programu seskupen do smysluplných sekvencí pomocí identifikace tokenů. Provede zápis odpovídajících tipů do tabulky symbolů a předá tento token 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, vyhrazená slova, a zadejte je do různých tabulek. Bude ignorovat komentáře ve zdrojovém programu
- Identifikujte token, který není součástí jazyka
Příklad:
x = y + 10
žetony
X | identifikátor |
= | Operátor přiřazení |
Y | identifikátor |
+ | Operátor sčítání |
10 | Číslo |
Fáze 2: Analýza syntaxe
Analýza syntaxe je o objevování struktury v 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ý nebo ne.
Syntaktická analýza je založena na pravidlech vycházejících z konkrétního programovacího jazyka pomocí konstrukce stromu analýzy pomocí tokenů. Určuje také strukturu zdrojového jazyka a gramatiku nebo syntaxi jazyka.
Zde je seznam úkolů provedených v této fázi:
- Získejte tokeny z lexikálního analyzátoru
- Zkontroluje, zda je výraz syntakticky správný nebo ne
- Nahlásit všechny syntaktické chyby
- Vytvořte hierarchickou strukturu, která je známá jako strom analýzy
Příklad
Jakýkoli identifikátor/číslo je výraz
Jestliže x je identifikátor a y+10 je výraz, pak x= y+10 je příkaz.
Zvažte strom analýzy pro následující příklad
(a+b)*c
V Parse Tree
- Vnitřní uzel: záznam u operátora a dva soubory pro děti
- List: záznamy se 2/více poli; jeden pro token a další informace o tokenu
- Ujistěte se, že komponenty programu do sebe smysluplně zapadají
- 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 neshody typu, nekompatibilní operandy, funkci volanou s nesprávnými argumenty, nedeklarovanou proměnnou atd.
Funkce fáze sémantické analýzy jsou:
- Pomáhá vám ukládat shromážděné informace o typu a ukládat je do tabulky symbolů nebo stromu syntaxe
- Umožňuje provádět kontrolu typu
- V případě neshody typu, kde neexistují žádná přesná pravidla pro opravu typu, která splňují požadovanou operaci, se zobrazí sémantická chyba
- Shromažďuje informace o typech a kontroluje kompatibilitu typů
- Zkontroluje, zda zdrojový jazyk povoluje operandy nebo ne
Příklad
float x = 20.2; float y = x*30;
Ve výše uvedeném kódu sémantický analyzátor přetypuje celé číslo 30 na plovoucí 30.0 před násobením
Fáze 4: Mezilehlé generování kódu
Jakmile je fáze sémantické analýzy u konce, kompilátor vygeneruje mezikód pro cílový počítač. Představuje program pro nějaký abstraktní stroj.
Mezilehlý kód je mezi jazykem vysoké úrovně a jazykem na úrovni stroje. Tento mezikód musí být generován takovým způsobem, aby bylo snadné jej přeložit do cílového strojového kódu.
Funkce při generování přechodného kódu:
- Měl by být generován ze sémantické reprezentace zdrojového programu
- Obsahuje hodnoty vypočítané během procesu překladu
- Pomáhá vám přeložit přechodný kód do cílového jazyka
- Umožňuje zachovat pořadí priority zdrojového jazyka
- Obsahuje správný počet operandů instrukce
Příklad
Například,
total = count + rate * 5
Mezilehlý kód s pomocí metody kódu adresy je:
t1 := int_to_float(5) t2 := rate * t1 t3 := count + t2 total := t3
Fáze 5: Optimalizace kódu
Další fází je optimalizace kódu neboli Intermediate code. Tato fáze odstraní zbytečný řádek kódu a uspořádá 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 zlepšit přechodný kód, aby se vygeneroval kód, který běží rychleji a zabírá méně místa.
Primární funkce této fáze jsou:
- Pomůže vám vytvořit kompromis mezi rychlostí provádění a kompilace
- Zlepšuje dobu běhu cílového programu
- Generuje zjednodušený kód stále ve střední reprezentaci
- Odstranění nedostupného kódu a zbavení se nepoužívaných proměnných
- Odstranění příkazů, které nejsou změněny, ze smyčky
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: Generování kódu
Generování kódu je poslední a poslední fází kompilátoru. Získává vstupy z fází optimalizace kódu a jako výsledek vytváří kód stránky nebo objektový kód. Cílem této fáze je přidělit úložiště a vygenerovat přemístitelný strojový kód.
Také přiděluje paměťová místa pro proměnnou. Instrukce v mezikódu jsou převedeny na strojové instrukce. Tato fáze překrývá optimalizační nebo přechodný kód do cílového jazyka.
Cílovým jazykem je strojový kód. Proto jsou během této fáze také vybrána a přidělena všechna paměťová místa a registry. Kód generovaný touto fází se provádí tak, aby přijal vstupy a generoval očekávané výstupy.
Příklad
a = b + 60.0
Mohl by být přeložen do registrů.
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ání záznamu identifikátoru a jeho rychlé načtení. Tabulka symbolů vám také pomůže se správou rozsahu. Tabulka symbolů a obsluha chyb spolupracují 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 může dojít k chybě ve všech níže uvedených fázích:
- Lexikální analyzátor: Špatně napsané tokeny
- Analyzátor syntaxe: Chybějící závorka
- Generátor mezilehlého kódu: Neshodné operandy pro operátora
- Code Optimizer: Když příkaz není dosažitelný
- Kód Generator: Když je paměť plná nebo nejsou přiděleny 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 analýza 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 fáze musí s chybami vypořádat, aby mohla pokračovat v procesu kompilace. Tyto chyby je třeba nahlásit obsluze chyb, která chybu zpracovává, aby mohl provést proces kompilace. Obecně jsou chyby hlášeny ve formě zprávy.
Shrnutí
- Kompilátor pracuje v různých fázích, každá fáze transformuje zdrojový program z jedné reprezentace do druhé
- Šest fází design kompilátoru jsou 1) Lexikální analýza 2) Syntaktická analýza 3) Sémantická analýza 4) Mezilehlý generátor kódu 5) Optimalizátor kódu 6) Kód Generator
- Lexikální analýza je první fází, kdy kompilátor skenuje zdrojový kód
- Analýza syntaxe je o objevování struktury v textu
- Sémantická analýza kontroluje sémantickou konzistenci kódu
- Jakmile je fáze sémantické analýzy u konce kompilátoru, vygenerujte přechodný kód pro cílový počítač
- Fáze optimalizace kódu odstraňuje nepotřebný řádek kódu a uspořádává posloupnost příkazů
- Fáze generování kódu získává vstupy z fáze optimalizace kódu a jako výsledek vytváří kód stránky nebo objektový kód
- Tabulka symbolů obsahuje záznam pro každý identifikátor s poli pro atributy identifikátoru
- Rutina zpracování chyb zpracovává chyby a hlásí během mnoha fází