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.

  • 🔤 Lexikální analýza: Skener seskupuje znaky do tokenů a zaznamenává je do tabulky symbolů.
  • ???? Analýza syntaxe: Analyzátor kontroluje gramatiku a z tokenů sestavuje hierarchický parsovací strom.
  • ✔️ Sémantická analýza: Tato fáze ověřuje kompatibilitu a význam typů pomocí syntaktického stromu.
  • ⚙️ Code Generace: Mezikód je generován, optimalizován a nakonec přeložen do cílového strojového kódu.
  • ???? Podpůrné postupy: Tabulka symbolů a rutina pro ošetření chyb interagují s každou fází kompilace.

Fáze kompilátoru s příkladem: Proces a kroky kompilace

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:

  1. Lexikální analýza
  2. Syntaktická analýza
  3. Sémantická analýza
  4. Mezilehlý generátor kódu
  5. Code optimalizátor
  6. Code generátor

Fáze kompilátoru

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

Příklad syntaktické analýzy

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.

Nejčastější dotazy

Ano. Asistenti s umělou inteligencí dokážou vysvětlit každou fázi, tracjak se vzorový kód přemění na tokeny a parsovací stromy a jak poukázat na to, kde dochází k syntaktické nebo sémantické chybě. Jsou to užitečné studijní pomůcky, ale ověřte si vysvětlení s ohledem na studijní materiály.

Strojové učení dokáže předpovědět, které optimalizační průchody vytvoří nejrychlejší kód pro daný program a stroj, a vyladit tak volby, které byly dříve ručně vytvářenými heuristikami. Kompilátor však musí i nadále zaručit, že se optimalizovaný program bude chovat přesně jako originál.

Front-end se stará o lexikální, syntaktickou a sémantickou analýzu a také o mezikód a závisí na zdrojovém jazyce. Back-end se stará o optimalizaci a generování kódu a závisí na cílovém počítači. Toto rozdělení zjednodušuje retargeting.

Ne. Lexikální analýza (skenování) seskupuje znaky do tokenů, zatímco parsování (analýza syntaxe) uspořádává tyto tokeny do stromu analýzy podle gramatických pravidel. Lexikální analýza se spustí jako první a předá své tokeny analyzátoru.

Shrňte tento příspěvek takto: