Jaké jsou fáze návrhu kompilátoru?
Kompilátor pracuje v různých fázích, přičemž každá fáze transformuje zdrojový program z jedné reprezentace na druhou. Každá fáze bere vstupy ze své předchozí fáze a přivádí 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 strojového kódu na vysoké úrovni. Fáze kompilátoru jsou:
- Lexikální analýza
- Syntaxová analýza
- Sémantická analýza
- Generátor mezilehlého 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 na tokeny, vytvářením analyzovaných stromů a optimalizací zdrojového kódu podle různých fází.
V tomto výukovém programu se naučíte:
- Jaké jsou fáze návrhu kompilátoru?
- Fáze 1: Lexikální analýza
- Fáze 2: Analýza syntaxe
- Fáze 3: Sémantická analýza
- Fáze 4: Generování mezilehlého kódu
- Fáze 5: Optimalizace kódu
- Fáze 6: Generování kódu
- Správa tabulky symbolů
- Rutina zpracování chyb:
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 seskupit tyto znaky do tokenů.
Zde je proud znaků ze zdrojového programu seskupen do smysluplných sekvencí identifikací tokenů. Provede zápis příslušných tiketů 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. Ignoruje 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 přidá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 zajistit, aby zdrojový kód napsaný programátorem byl správný či nikoli.
Analýza syntaxe je založena na pravidlech založených na konkrétním programovacím jazyce tak, že se pomocí tokenů vytvoří analyzovaný strom. Určuje také strukturu zdrojového jazyka a gramatiku nebo syntaxi jazyka.
Zde je seznam úkolů prováděný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 chyby syntaxe
- Vytvořte hierarchickou strukturu, která je známá jako parsovací strom
Příklad
Libovolný identifikátor / číslo je výraz
Pokud x je identifikátor a y + 10 je výraz, pak x = y + 10 je příkaz.
V následujícím příkladu zvažte analýzu stromu
(a+b)*c
V Parse Tree
- Vnitřní uzel: záznam s operátorem a dvěma soubory pro děti
- List: záznamy s 2 / více poli; jeden pro token a další informace o tokenu
- Zajistěte, aby komponenty programu do sebe smysluplně zapadaly
- Shromažďuje informace o typu 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. Používá strom syntaxe předchozí fáze spolu s tabulkou symbolů k ověření, že daný zdrojový kód je sémanticky konzistentní. Také kontroluje, zda kód vyjadřuje vhodný význam.
Sémantický analyzátor zkontroluje neshody typů, nekompatibilní operandy, funkci vyvolanou nesprávnými argumenty, nedeklarovanou proměnnou atd.
Funkce fáze sémantické analýzy jsou:
- Pomůže vám uložit shromážděné informace o typu a uložit je v tabulce symbolů nebo ve stromu syntaxe
- Umožňuje provádět kontrolu typu
- V případě neshody typů, kde neexistují žádná přesná pravidla pro opravu typu, která splňují požadovanou operaci, se zobrazí sémantická chyba
- Shromažďuje informace o typu 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řed vynásobením vysílá celé číslo 30 na float 30.0
Fáze 4: Generování mezilehlého kódu
Jakmile je fáze sémantické analýzy nad kompilátorem, generuje mezilehlý kód pro cílový počítač. Představuje program pro nějaký abstraktní stroj.
Mezilehlý kód je mezi jazykem na vysoké úrovni a na úrovni stroje. Tento přechodný kód je třeba vygenerovat takovým způsobem, který usnadňuje jeho převod do cílového strojového kódu.
Funkce generování přechodného kódu:
- Mělo by být generováno ze sémantické reprezentace zdrojového programu
- Zadržuje hodnoty vypočítané během procesu překladu
- Pomůže vám přeložit zprostředkující kó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
Mezilehlý kód pomocí metody kódu adresy je:
t1 := int_to_float(5)t2 := rate * t1t3 := count + t2total := t3
Fáze 5: Optimalizace kódu
Další fází je optimalizace kódu nebo přechodný kód. Tato fáze odstraní zbytečný řádek kódu a uspořádá posloupnost příkazů k urychlení provádění programu bez plýtvání prostředky. Hlavním cílem této fáze je vylepšit zprostředkující 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ůž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 v mezilehlé reprezentaci
- Odebrání nedosažitelného kódu a zbavení se nepoužívaných proměnných
- Odebírání příkazů, které se nemění ze smyčky
Příklad:
Zvažte následující kód
a = intofloat(10)b = c * ad = e + bf = d
Může se stát
b =c * 10.0f = e+b
Fáze 6: Generování kódu
Generování kódu je poslední a poslední fáze kompilátoru. Získává vstupy z fází optimalizace kódu a ve výsledku vytváří kód stránky nebo kód objektu. Cílem této fáze je alokovat úložiště a generovat přemístitelný strojový kód.
Rovněž přiděluje umístění paměti pro proměnnou. Pokyny v mezikódu jsou převedeny na strojové pokyny. Tato fáze zahrnuje 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 vygenerovaný touto fází se provede za účelem převzetí vstupů a generování očekávaných výstupů.
Příklad:
a = b + 60,0
Bylo by možné přeložit do registrů.
MOVF a, R1MULF #60.0, R2ADDF R1, R2
Správa tabulky symbolů
Tabulka symbolů obsahuje záznam pro každý identifikátor s poli pro atributy identifikátoru. Tato součást kompilátoru usnadňuje hledání záznamu identifikátoru a jeho rychlé načtení. Tabulka symbolů vám také pomůže se správou oboru. Tabulka symbolů a obslužná rutina chyb interagují se všemi fázemi a aktualizací tabulky symbolů odpovídajícím způsobem.
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
- Optimalizátor kódu: Když není příkaz dosažitelný
- Generátor kódu: Nedostupné příkazy
- Tabulky symbolů: Chyba více deklarovaných identifikátorů
Nejběžnějšími chybami jsou neplatná posloupnost 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í vypořádat s chybami, aby mohla pokračovat v procesu kompilace. Tyto chyby je třeba nahlásit obslužné rutině chyb, která chybu zpracovává, aby provedla proces kompilace. Obecně jsou chyby hlášeny ve formě zprávy.
souhrn
- Kompilátor pracuje v různých fázích, přičemž každá fáze transformuje zdrojový program z jedné reprezentace na druhou
- Šest fází návrhu kompilátoru je 1) Lexikální analýza 2) Analýza syntaxe 3) Sémantická analýza 4) Mezilehlý generátor kódu 5) Optimalizátor kódu 6) Generátor kódu
- 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 nad kompilátorem, vygenerujte mezilehlý kód pro cílový počítač
- Fáze optimalizace kódu odstraní zbytečný řádek kódu a uspořádá posloupnost příkazů
- Fáze generování kódu získává vstupy z fáze optimalizace kódu a ve výsledku vytváří kód stránky nebo kód objektu
- Tabulka symbolů obsahuje záznam pro každý identifikátor s poli pro atributy identifikátoru
- Rutina zpracování chyb zpracovává chyby a zprávy během mnoha fází