Víceprůchodový překladač
Víceprůchodový překladač (anglicky multi-pass compiler) je v informatice specifický typ překladače, který zpracovává zdrojový kód nebo abstraktní syntaktický strom programu několika průchody (na rozdíl od jednoprůchodového překladače). Mezi jednotlivými průchody generuje mezikód, který v následujícím průchodu opět přijímá jako svůj vstup. Víceprůchodové zpracování umožňuje jednodušeji zpracovat kód po menších částech, přičemž posledním průchod vydá finální podobu programu.
Víceprůchodové kompilátory jsou někdy nazývány jako rozsáhlé překladače, mají větší oblast využití a umožňují lepší generování kódu (např.: menší velikost kódu nebo rychlejší kód). Ve srovnání s výstupem jednoprůchodového kompilátoru mají vyšší nároky na alokovanou paměť a zpracovávání zdrojového kódu trvá delší dobu. Některé jazyky nemohou být z důvodu struktury jejich kódu zpracovávány pouze jedním průchodem.
Typický víceprůchodový překladač
Lexikální analýza
První fáze víceprůchodového překladače odstraňuje z kódu zbytečné informace, které nejsou při syntaktické analýze zapotřebí. Mezi ně patří například komentáře a prázdná místa v kódu. Lexikální analýza identifikuje ve vstupních datech tokeny (lexémy, lexikální symboly).
Syntaktická analýza
Syntaktická analýza je zodpovědná za pravidla použitého programovacího jazyka (často jako bezkontextová gramatika) a další stavební prvky jazyka. Kontroluje, zda program je zapsán správným způsobem a dále určuje například pořadí provádění příkazů. Výsledek této části reprezentuje abstraktní syntaktický strom nebo orientovaný acyklický graf.
Sémantická analýza
Sémantická analýza reprezentuje vztahy a sémantická pravidla programovacího jazyka. Zpracovává syntaktický strom z předchozího bloku. Analyzátor vyhodnocuje, zda jsou operace zpracovávány ve správném pořadí a dále probíhá například analýza typů a jejich přiřazení. Dalším příkladem je v následující části programu ve fázi sémantické analýzy proběhne kontrola, zda uvedená podmínka [boolean] obsahuje platné (porovnatelné) výrazy.
if (podmínka) {
...
} else {
...
}
Kromě provedení sémantické analýzy se v této fázi sestavují tabulky symbolů, které slouží k usnadnění generování kódu.
Generování kódu
V závěrečné fázi překladač provede převedení mezikódu programu do spustitelného souboru instrukcí. Poslední fáze kompilování je hardwarově závislá. Zde lze také provádět optimalizaci sestavení kódu pro efektivnější chod programu.
Výhody víceprůchodového překladače
Víceprůchodové překladače mají modulární strukturu a proto je snadnější je učinit hardwarově nezávislými, protože generování kódu probíhá odděleně v několika fázích a přizpůsobení menší části překladače jinému hardware (platformě) je tak jednodušší.
Složitější programovací jazyky vyžadují víceprůchodový překladač. Například jazyk Pascal může být přeložen jednoprůchodovým překladačem pouze v případě, když jsou všechny definice proměnných, funkcí, procedur atd. definovány ještě před jejich použitím.
var x:Integer;
procedure inc;
begin
x:=x+1;
end;
x:=0;
inc;
V jednoprůchodovém kompilátoru se vytvoří nejprve odkaz na proměnnou x
a při jejím použití už kompilátor zná její deklaraci a vše proběhne sémanticky v pořádku.
- uvedení, kde je proměnná x umístěna
- datový typ
x
Jazyky, jako je například Java, vyžívají víceprůchodovou kompilaci. Na příkladu je vidět, že nejprve používáme proměnnou x
a poté následuje její deklarace.
public class Example {
public static void main(String [] args) {
assert(x==0);
x++;
assert(x==1);
}
static int x=0;
}
Víceprůchodový kompilátor alokuje místo v paměti pro proměnnou x
během sémantické fáze kompilace a při použití již bude proměnná zpracována.
Související články
Externí odkazy
- Richard Borat, Understanding and Writing Compilers: A Do It Yourself Guide, Macmillan Publishing, 1979. ISBN 0-333-21732-2
- Professeur Jean-Pierre FOURNIER, Introduction to compiler design
- Bent Thomsen, Languages and Compilers SProg og Overseattere, Department of Computer Science, Aalborg University
Média použitá na této stránce
Diagram of a multi-pass compiler