Generování kódu

Generování kódu je v informatice proces, při kterém překladačem generovaný kód je převáděn na mezijazyk, jenž reprezentuje zdrojový kód náležité formy (např. strojový kód), kterou lze snadno realizovat pomocí stroje.

Sofistikované kompilátory obvykle provádějí vícenásobné průchody přes různé přechodné formy. Tento vícestupňový proces, je nutný proto, že mnoho algoritmů pro optimalizace kódu je jednodušší použít jeden po druhém nebo proto, že vstup na jeden optimalizaci závisí na zpracování prováděné jinou optimalizací. Tato organizace také usnadňuje vytvoření jednotného kompilátoru, který může cílit na více architektur. Pouze jako poslední z etap generování kódu (backend), se musí změnit od cíle k cíli. (Pro více informací o konstrukci kompilátorů viz překladač.)

Vstup do generátoru kódu se obvykle skládá z derivačního stromu nebo syntaktického stromu. Strom je převeden na lineární posloupnost instrukcí. Obvykle v mezijazyku, jako je tříadresní kód. Další fáze kompilace může nebo nemusí být nazývána jako generování kódu podle toho, zda zahrnuje či ne významné změny v zastoupení programu.

Hlavní úkoly při generování kódu

Kromě základního převodu z meziproduktu reprezentace do lineární sekvence strojových instrukcí, se typický generátor kódu snaží optimalizovat nějakým způsobem generovaný kód.

Mezi úkoly, které jsou obvykle součástí sofistikovaného kompilátoru, patří:

  • Výběr instrukce: která instrukce bude použita.
  • Instrukce plánování: v jakém pořadí budou instrukce kompilovány. Plánování je optimalizace rychlosti, která může mít zásadní vliv na zřetězených strojích.
  • Alokace registrů: přidělení proměnných do registrů procesoru[1]
  • Ladění generování dat v případě potřeby, takže kód může být laděn při překladu.

Výběr instrukce se obvykle provádí rekurzivním průchodem syntaktického stromu metodou postorder, kterému odpovídá konkrétní strom konfigurace. Pro příklad lze uvést strom W := ADD(X,MUL(Y,Z)) může být přeměněn na lineární posloupnost instrukcí v rekurzivně generované sekvenci pro t1 := X a t2 := MUL(Y,Z), a potom následuje instrukce ADD W, t1, t2.

V kompilátoru, který používá mezijazyk, mohou být použity dvě fáze překladu – první se snaží převést derivační strom do mezikódu a druhá fáze později převede mezikó do sady instrukcí z instrukční sady procesoru cílového počítače. Tato druhá fáze nevyžaduje průchod stromem. Může být provedena lineárně a typicky zahrnuje jednoduchou výměnu mezijazyka s jejich odpovídajícím operačním kódem. Nicméně v případě, když je překladač jazykovým překladačem (například překladač, který převádí jazyk Eiffel do jazyka C), pak druhá fáze pro generování kódu může zahrnovat vytváření stromu z lineárního mezikódu.

Generování kódu za běhu

Při generování kódu za běhu, stejně jako v just-in-time kompilaci (JIT), je důležité, aby celý proces mohl být efektivní, pokud jde o prostor a čas. Například pokud regulární výrazy jsou interpretovány a použity ke generování kódu za běhu, je často generován nedeterministický konečný automat namísto deterministického. Protože obvykle je rychlejší vytvořit více jednoduchých automatů, které zabírají i méně paměti nežli jeden složitý. Přes toto obecně méně efektivní generování kódu, můžete JIT generování kódu využít pro profilování informací, které jsou k dispozici pouze za běhu.

Související pojmy

Základním úkolem je, při vstupu v jednom jazyce, produkovat výstup v netriviálním jiném jazyce. Což lze chápat jako základní operaci transformační gramatiky formálních jazyků. V důsledku toho některé techniky, které byly původně vyvinuty pro použití v kompilátorech, jsou využity i v běžném životě. Příkladem může být YACC (Yet Another Compiler Compiler), jenž má vstup na Backusově–Naurově formě a převádí jej na analyzátoru jazyka C. I když byl původně vytvořen pro automatické generování parseru pro kompilátor, je YACC také často používán k automatizaci psaní kódu, kterou je třeba změnit pokaždé, když dojde ke změně specifikace. (Příklad zde [1].)

Mnoho integrovaných vývojových prostředí (IDE) podporuje nějakou formu automatického generování zdrojového kódu. Často s použitím algoritmů společného s generátory kódu překladače, ačkoli obyčejně méně komplikované.

Reference

  1. AHO, Alfred V., Ravi Sethi and Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. [s.l.]: Addison-Wesley, 1987. Dostupné online. ISBN 0-201-10088-6. S. 15. (anglicky)