Generování kódu (kompilátor) - Code generation (compiler)

Při výpočtu , generování kódu je proces, při kterém kompilátor je generátor kódu převádí určitou střední reprezentace ve zdrojovém kódu do formy (např, strojový kód ), který může být snadno prováděn strojem.

Sofistikované kompilátory obvykle provádějí více průchodů přes různé přechodné formy. Tento vícestupňový proces se používá proto, že mnoho algoritmů pro optimalizaci kódu lze snadněji aplikovat po jednom, nebo proto, že vstup do jedné optimalizace závisí na dokončeném zpracování provedeném jinou optimalizací. Tato organizace také usnadňuje vytvoření jediného kompilátoru, který může cílit na více architektur, protože pouze poslední z fází generování kódu ( backend ) se musí změnit z cíle na cíl. (Další informace o návrhu kompilátoru najdete v části Kompilátor .)

Vstup do generátoru kódu se obvykle skládá ze stromu analýzy nebo stromu abstraktní syntaxe . Strom je převeden na lineární posloupnost instrukcí, obvykle v přechodném jazyce, jako je například tříadresový kód . Další fáze kompilace mohou, ale nemusí být označovány jako „generování kódu“, podle toho, zda zahrnují významnou změnu v reprezentaci programu. (Například průkaz pro optimalizaci kukátka by pravděpodobně nebyl nazýván „generováním kódu“, ačkoli generátor kódu může zahrnovat průkaz pro optimalizaci kukátka.)

Hlavní úkoly

Kromě základního převodu z mezilehlé reprezentace na lineární sekvenci strojových instrukcí se typický generátor kódu pokouší nějakým způsobem optimalizovat generovaný kód.

Mezi úkoly, které jsou obvykle součástí fáze „generování kódu“ sofistikovaného kompilátoru, patří:

Výběr instrukcí se obvykle provádí tak, že se provede rekurzivní přechod po pořadí na abstraktním stromě syntaxe, který odpovídá konkrétním konfiguracím stromu proti šablonám; například strom W := ADD(X,MUL(Y,Z))může být transformován do lineární sekvence instrukcí rekurzivním generováním sekvencí pro t1 := Xa t2 := MUL(Y,Z)a poté vysláním instrukce ADD W, t1, t2.

V kompilátoru, který používá středně pokročilý jazyk, mohou existovat dvě fáze výběru instrukcí - jedna pro převod stromu analýzy na přechodný kód a druhá fáze mnohem později pro převod meziproduktu na instrukce ze sady instrukcí cílového počítače. Tato druhá fáze nevyžaduje procházení stromem; lze to provést lineárně a obvykle to zahrnuje jednoduchou náhradu mezijazykových operací odpovídajícími operačními kódy . Pokud je však kompilátor ve skutečnosti překladač jazyků (například ten, který převádí Javu na C ++ ), pak druhá fáze generování kódu může zahrnovat sestavení stromu z lineárního přechodného kódu.

Generování kódu za běhu

Když ke generování kódu dochází za běhu , jako při kompilaci just-in-time (JIT), je důležité, aby byl celý proces efektivní s ohledem na prostor a čas. Když jsou například regulární výrazy interpretovány a používány ke generování kódu za běhu, často se místo deterministického generuje nedeterministický stroj konečných stavů , protože obvykle lze první vytvořit rychleji a zabírá méně místa v paměti než druhý. Navzdory obecně generujícímu méně efektivnímu kódu může generování kódu JIT využívat informace o profilování, které jsou k dispozici pouze za běhu.

Související pojmy

Základní úkol přijímat vstupy v jednom jazyce a produkovat výstup v netriviálně odlišném jazyce lze chápat z hlediska základních transformačních operací formální jazykové teorie . V důsledku toho se některé techniky, které byly původně vyvinuty pro použití v kompilátorech, začaly používat i jinými způsoby. Například YACC (ještě jeden kompilátoru kompilátor ) se vstupy v Backus-Naur forma a převádí jej na analyzátoru C . Ačkoli byl původně vytvořen pro automatické generování analyzátoru pro kompilátor, yacc se také často používá k automatizaci psaní kódu, který je třeba upravit při každé změně specifikací.

Mnoho integrovaných vývojových prostředí (IDE) podporuje nějakou formu automatického generování zdrojových kódů , často využívajících společné algoritmy s generátory kódů kompilátoru, i když obvykle méně komplikované. (Viz též: Program transformace , transformace dat .)

Odraz

Analyzátor syntaxe a sémantiky se obecně pokouší načíst strukturu programu ze zdrojového kódu, zatímco generátor kódu využívá tyto strukturní informace (např. Datové typy ) k vytváření kódu. Jinými slovy, první přidává informace, zatímco druhý některé informace ztrácí . Jedním z důsledků této ztráty informací je, že reflexe se stává obtížnou nebo dokonce nemožnou. Aby se tomuto problému dalo čelit, generátory kódu často kromě kódu nezbytného pro spuštění vkládají také syntaktické a sémantické informace.

Viz také

Reference