Kompilátor (programovanie)

Kompilátor alebo kompilujúci program (anglicky: compiler) je počítačový program, ktorý dokáže preložiť zdrojový kód napísaný v jednom programovacom jazyku (tzv. zdrojovom jazyku) do iného programovacieho jazyka (tzv. cieľového jazyka). Kompilátory sú špecifickým typom prekladačov (príkladom iného typu prekladaču je napr. interpreter). Pojem kompilátor sa najčastejšie používa pre prekladače, ktorých zdrojovým jazykom je vysokoúrovňový jazyk a cieľovým jazykom je nízkoúrovňový jazyk (napr. jazyk symbolických inštrukcií, objektový kód alebo strojový kód) za účelom vytvorenia spustiteľného programu.

Existuje však mnoho rôznych typov kompilátorov. Pokiaľ zkompilovaný program môže bežať na počítači, ktorého CPU alebo operačný systém sú odlišné od počítača, na ktorom beží kompilátor, hovoríme o krížovom kompilátore. Program, ktorý prekladá z jazyka nižšej úrovne do jazyka vyššej úrovne, sa nazýva dekompilátor. Program, ktorý prekladá medzi dvoma vysokoúrovňovými jazykmi sa zvyčajne nazýva transpliter.

Kompilátor musí vykonávať dve základné činnosti: analýzu zdrojového kódu a vytváranie ekvivalentného cieľového kódu (syntéza). Cieľom analýzy je získať informácie o stavbe programu, ktoré sa počas syntézy použijú na zostavenie cieľového kódu. Analýza sa najčastejšie vykonáva na troch úrovniach: lexikálna analýza, syntaktická analýza a sémantická analýza. Výstupom týchto procesov môže byť tzv. intermediárny kód. Analytická časť kompilátoru sa niekedy nazýva aj prednou časťou (angl.: front end). Samotné generovanie cieľového kódu môže byť doplnené (prípadne predchádzané) optimalizačnými operáciami.

Program preložený do strojového kódu len málokedy obsahuje všetky procedúry a funkcie potrebné na jeho spustenie. Mnohé funkcie a procedúry sa nachádzajú vo vopred preložených súboroch, ktoré nazývame knižnice. Aby bolo možné program spustiť, je potrebné prepojiť relatívne odkazy na procedúry a funkcie so skutočnými adresami. Túto činnosť vykonáva spájací program, ktorý tiež nazývame linker.

Alternatívnym spôsobom vykonávania kódu je interpretácia zdrojového kódu v čase behu programu. Program, ktorý tento preklad zabezpečuje, sa nazýva interpreter. Existujú aj kombinované riešenia, kedy sa najprv prekladá do pomocného kódu, ktorý sa interpretuje v čase behu (napr. Java).

Štruktúra kompilátoru 
Bez ohľadu na konkrétne fázy prekladu kompilátoru, je bežné sa stretnúť s rozdelením týchto fáz na tri časti: predná časť (angl. front end), stredná časť (angl. middle end) a zadná časť (angl. back end).
Predná časť overuje syntax a sémantiku špecifickú pre daný zdrojový kód. Pokiaľ je program na vstupe syntakticky nesprávny (obsahuje syntaktickú chybu), kompilátor by mal vhodným spôsobom na to reagovať v tejto fáze prekladu. Predná časť spravidla zahŕňa lexikálnu analýzu, syntaktickú analýzu a sémantickú analýzu. Výstupom prác prednej časti kompilátoru býva program v intermediárnom kóde, ktorý je poskytovaný na spracovanie nasledujúcim častiam kompilátora.
Stredná časť vykonáva optimalizácie nad intermediárnym kódom. Tieto optimalizácie sú nezávislé na architektúre cieľového počítača. Príkladom optimalizácií v strednej časti prekladu je odstraňovanie zbytočných alebo nedosiahnuteľných častí kódu, či optimalizácia cyklov. Výstupom tejto časti kompilátora je "optimalizovaný" (slovo "optimalizácia" je v kontexte prekladačov nepresné, nakoľko výsledkom optimalizácií prekladača nie je kód, ktorý je optimálny. Často je len optimálnejší oproti pôvodnému intermediárnemu kódu, ak vôbec) intermediárny kód, ktorý je následne používaný zadnou časťou kompilátora.
Zadná časť môže vykonávať dodatočnú analýzu a optimalizácie, ktoré sú špecifické pre cieľový počítač. V každom prípade je však jej hlavnou úlohou generovanie cieľového kódu. Typicky je jej výstupom strojový kód pre konkrétny procesor.

Motiváciou za rozdelením prekladu kompilátora do vyššie uvedených troch častí bola možnosť znovupoužitia jednotlivých častí pre rôzne zdrojové jazyky (je možné použiť rovnakú strednú a zadnú časť) a rôzne cieľové procesory (je možné použiť rovnakú prednú a strednú časť).

Pozri aj 
 Interpreter

Literatúra

Referencie 

Programovanie