Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
— | pitel:isz:prekladac [30. 12. 2022, 13.43:01] (aktuální) – vytvořeno - upraveno mimo DokuWiki 127.0.0.1 | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ====== Struktura překladače a charakteristika fází překladu ====== | ||
+ | [[wp> | ||
+ | |||
+ | Překladač čtě zdrojový program (napsaný ve zdrojovém jazyce) a překládá ho na cílový program (napsaný v cílovém jazyce -- zpravidla nějaký asembler). Zdrojový a cílový program jsou vzájemně funkčně ekvivalentní. | ||
+ | |||
+ | ^ Lexikální anaýza | ||
+ | | Zdrojový kód | Řetězec tokenů | ||
+ | ((Některé browsery tu tabulku vykreslují divně)) | ||
+ | |||
+ | ===== Lexikální analýza ===== | ||
+ | [[wp> | ||
+ | |||
+ | Vstup: Zdrojový program | ||
+ | |||
+ | Výstup: Řetězec tokenů | ||
+ | |||
+ | V podstatě jde o to rozsekat tok znaků na jednotlivé tokeny (slova) a přiřadit jim význam (2 je číslo, //x// je proměnná, + je operátor, ...). Často se k tomu používají regulární výrazy. | ||
+ | ===== Syntaktická analýza ===== | ||
+ | [[wp> | ||
+ | |||
+ | Vstup: Řetězec tokenů | ||
+ | |||
+ | Výstup: Derivační strom | ||
+ | |||
+ | Cílem je zkontrolovat, | ||
+ | |||
+ | ==== Shora dolů ==== | ||
+ | [[wp> | ||
+ | |||
+ | Probíhá tak, že se symboly v gramatice postupně rozgenerovávají, | ||
+ | |||
+ | * [[wp>LL parser]] | ||
+ | * [[wp> | ||
+ | |||
+ | ==== Zdola nahoru ==== | ||
+ | [[wp> | ||
+ | |||
+ | Naopak, z posloupnosti symbolů se snažíme udělat počáteční symbol. | ||
+ | |||
+ | ===== Sémantická analýza ===== | ||
+ | Vstup: Derivační strom | ||
+ | |||
+ | Výstup: Abstraktní syntaktický strom | ||
+ | |||
+ | Sémantický analyzátor kontroluje sémantické aspekty programu: | ||
+ | * kontrola typů, při které může provádět implicitní konverze (např. int-to-real) | ||
+ | * kontrola deklarací proměnných | ||
+ | |||
+ | ===== Generování vnitřního kódu ===== | ||
+ | Vstup: Abstraktní syntaktický strom | ||
+ | |||
+ | Výstup: Vnitřní kód | ||
+ | |||
+ | Generátor vnitřního kódu vytváří vnitřní reprezentaci programu nazývanou vnitřní kód (většinou tří adresný) z následujících důvodů: | ||
+ | * jednotnost | ||
+ | * přímý překlad do cílového programu je složitý a " | ||
+ | * vnitřní kód lze snadno optimalizovat | ||
+ | |||
+ | ===== Optimalizátor ===== | ||
+ | Vstup: Vnitřní kód | ||
+ | |||
+ | Výstup: Optimalizovaný vnitřní kód | ||
+ | |||
+ | Optimalizátor upraví vnitřní kód tak, aby byl efektivnější. Příklady úprav: | ||
+ | * **Šíření konstanty: | ||
+ | * **Šíření kopírováním: | ||
+ | * **Eliminace mrtvého kódu:** (while false do ... ⇒ odstranit) | ||
+ | |||
+ | Některé překladače optimalizátor nemají. | ||
+ | |||
+ | ===== Generování cílového kódu ===== | ||
+ | [[wp> | ||
+ | |||
+ | Vstup: Optimalizovaný vnitřní kód (popř. neoptimalizovaný) | ||
+ | |||
+ | Výstup: Cílový program | ||
+ | |||
+ | Cílový program je zapsán v cílovém jazyce. V praxi je cílovým jazykem většinou asembler nebo strojový kód. | ||
+ | ===== Shrnutí ===== | ||
+ | * překladač: | ||
+ | * jednotlivé kroky: viz tabulka nahoře | ||
+ | * syntaktická analýza: shora dolů: máme první neterminál a snažíme se z něj postupně odvodit větu na vstupu, zdola nahoru: postupně se z věty snažíme dostat ke kořenu | ||
+ | * zdola nahoru: je potřeba rozšířený zásobníkový automat, používá se třeba na výrazy (bezkontextové, | ||
+ | * shora dolů: je potřeba běžný zásobníkový automat, používá se na zpracování nevýrazových kusů klasického procedurálního jazyka | ||
+ | * tříadresový kód: cíl, 2 operandy, operátor | ||
+ | * optimalizátor: | ||