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č

Multi-passcompiler.png

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.

  1. uvedení, kde je proměnná x umístěna
  2. 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

Média použitá na této stránce

Multi-passcompiler.png
Diagram of a multi-pass compiler