Vnitřní jazyky překladačů – druhy, použití v jednotlivých fázích překladu, překlad jednoduchých jazykových konstrukcí

Po ukončení syntaktické a sémantické analýzy generují některé překladače explicitní intermediální reprezentaci zdrojového programu (mezikód). Intermediální reprezentaci můžeme považovat za program pro nějaký abstraktní počítač. Tato reprezentace by měla mít dvě důležité vlastnosti: měla by být jednoduchá pro vytváření a jednoduchá pro překlad do tvaru cílového programu. Intermediální kód slouží obvykle jako podklad pro optimalizaci a generování cílového kódu. Může však být také konečným produktem překladu v interpretačním překladači, který vygenerovaný mezikód přímo provádí. Intermediální reprezentace mohou mít různé formy.

A B C * D + - => A – (B * C + D)

efektivní zpracování pomocí zásobníku, musíme vědět prioritu operátorů

Instrukce postfixoveho zapisu napr. Lit 0, A = uloz konstantu A do zasobniku, opr 0, A = proved instrukci A…

Tříadresový kód

Abstraktní forma mezikódu sestávající ze sekvence příkazů ve tvaru x := y op z, kde x, y a z jsou jména, konstanty nebo dočasné proměnné, op je nějaký operátor. Na levé straně je adresa, na pravé instrukce. Adresou může být název (ze zdrojového programu, je pak nahrazen pointerem do jeho tabulky symbolů), konstanta, kompilátorem generovaná dočasná proměnná (užitečné pro optimalizaci).

Překlad výrazu x+y*z na tříadresový kód:

Další formy tříadresových instrukcí: s unárním operátorem (x = -y), copy instrukce (x = y), indexované copy instrukce (x = y[0]), nepodmíněný skok (goto L), podmíněný skok (if x goto L), volání procedur (call p, n; předtím uvedeno n parameterů).

Trojice a čtveřice

Implementací tříadresového kódu jsou záznamy se třemi nebo čtyřmi poli: trojice resp. čtveřice. Následující příklady budou ukázány na výrazu: a := b * (-c) + d [ b ]

Čtveřice

Záznam má čtyři položky nazývané op, arg1, arg2 a res. Tříadresový příkaz ve tvaru x := y op z je reprezentován umístěním op do op, y do arg1, z do arg2 a x do res. Některé tříadresové příkazy nepotřebují všechny položky (např. x := y).

Výhoda čtveřic oproti trojicím – v optimalizaci kompilátoru, kdy jsou instrukce často přemísťovány; přesun čtveřic je ok (nová pozice se dá hned určit podle dočasných proměnných), u trojic je při posunu třeba změnit reference na výsledky, protože jsou určeny svou pozicí.

Jestliže se chceme vyhnout generování dočasných proměnných, je možné použít formu trojic. Trojice obsahuje op, arg1 a arg2. Místo dočasných proměnných jsou indexy do pole trojic (jejich pozice).

Příklady

Ukažme si tříadresový kód, čtveřice a trojice na příkladě výrazu:

Tříadresový kód

Čtveřice

Překlad

u čtveřic voláme metodu pro generování instrukce a předáme jí jen parametry instrukce - např. GADD(...) = generate ADD a parametry jsou levá a pravá strana + docasna promenna;

u trojic tam musí bejt rozhodovací tabulka a kód se generuje v závislosti na tom, co je aktuálně na stacku

přímo se to jmenuje Rozhodovací tabulka COMP
