8, GENEROVANÍ CÍLOVÉHO PROGRAMU Generátor cílového programu je poslední částí kompilační ch jpřekladačů. Jeho vstupem je program ve vnitrní formě, vytvořený při zpracování sémantiky a jeho výstupem je cílový program. 8.1 Druhy cílových programů Cílový program kompilátoru může být: ' 1) Posloupnost strojových instrukcí a absolutními adresami. 2) Posloupnost strojových instrukcí s relativními adresami. 3) Posloupnost příkazů jazyka symbolických adres. Překlad zdrojového programu do strojových instrukcí s absolutními adresami je nejefektivnějäím způsobem kompilace. Vytvořený program lze okamžitě spustit a celý proces překladu a výpočtu lze provést během krátké doby.- Hlavní nevýhodou tohoto typu překladu je skutečnost, že musí být překládán celý program-- není možné použití předem připravené knihovny. Z tohoto důvodu se generování strojových instrukcí s absolutními adresami používá jen pro' malé programy a v připadej že se jedná především o ladění programů (zejména při výuce). Překlad do strojových instrukcí s absolutními adresami provádějí inkrementální překladače. Posloupnost strojových instrukcí s relativními adresami je nejčastějším a nejběžnšjším výstupem kompilátoru. Výstupem kompilátoru jsou tzv. přemistitel-né moduly, které je ovšem nutno zpracovat sestavovacím programem. V tomto případě je.možné použití předem připravených knihoven, které obsahují jednotlivé programy opět Ve formě přemístitelných modulů. Program v jazyce symbolických adres je z hlediska konstrukce překládače nejjednodušším výstupem. Překladač v tomto případě neprovádí určování adres e v cílovém- programu-jsou obvykle zachována jména veličin zdrojového programu. Nevýhodou tohoto přístupu je nutnost použití překládače jazyka symbolických adres k překladu cílového"programu kompilátoru do strojového kódu. Tím vlastně přidáváme k celému procesu další fázi, která může být stejně časově náročná jako celá předchozí kompilace. .. .....■- 8.2 Hvpotetic^ pocítí ^ 'ÍUtíX " «*Xo th'> *&t <&) twfru-/ <> 8.4 Generování instrukcí pro program v jazyce třiadresových instrukcí Nejdříve si ukážeme, jak generovat cílový program v případě, že program ve vnitřní formě je reprezentován trojicemi. V zásadě lze použít podobného postupu jako při generování cílového programu pro postfixový zápis. Je možná dokonce použít stejných tabulek vytvářených instrukci pro jednotlivé operátory. Informace o operandech je součástí trojic. Pouze informace o operandech, které jsou výsledkem předchozích trojic je uvedena v zásobníku. 68 Algoritmus pro překlad trojic do strojového kódu hypotetického počítače můžeme zapsat takto: Algoritmus 8.2 Generování cílového programu pro trojice. Vstup: Program ve formě trojic. Výstup: Posloupnost instrukcí hypotetického počítače. Metoda; Algoritmus používá zásobník, do kterého ukládá informace o operandech, které jsou výsledkem jednotlivých trojic. 1. Přečti jednu trojici z vnitřní formy programu. 2. Vyber tabulku pro operátor uvedený v trojici a z této tabulky vyber položku podle a) operandů uvedených v trojici,,. Ou b) operandů"uvedených na vrcholu zásobníku v případě, že ve zpracovávané trojici je použit výsledek někte-ré předchozí trojice. ^vjíeA**- f*fi* "TV^í 3. Je-li některý z operandů v zásobníku uložen ve střadači - s výjimkou operandů, které vstupují do právě generovaných instrukcí - prove3 uložení střadače a v zásobníku nehraä STR označením pomocné proměnné. 4. Generuj instrukce vybrané v 2. 5. V zásobníku zruš použité operandy a na vrchol přidej označení místa, kam byl uložen výsledek. ■Příklad 8.3 Výraz (A + B) / (C - D) pomocí trojic zapíšeme takto: (1) + A, B (2) - C, D í3) / (D, (2) Proces prekladu těchto trojic do strojového kódu hypotetického počítače probíhá takto: Překládaná trojice Vybrané položka z tabulky Generovane" instrukce Obsah zásobníku (1) + A, B + (P, P) LOAD A ADD B STR uložení střadače STORE T. TI (2) - C, D - (P, P) LOAD C SUB D STR T1 (3) / (0,(2) / (STR, P) STORE T2 LOAD T, DIV T2 STR 1 69 Výsledek je úplně stejný jako v případě obráceného polského zápisu.