Struktura překladače

Překladač provádí dvě základní činnosti - analyzuje zdrojový kód a následně jej přeložit do cílového programu. Součástí analýzy je lexikální, syntaktická a strukturální analýza.

Činnost překladače je následující: Zdrojový kód -> pre-procesor -> lexikální analyzátor -> syntaktický analyzátor -> tvorba mezikódu -> optimalizátor -> generování výsledného kód -> optimalizace závislá na zařízení

Součástí generování cílového programu je optimalizace kódu. 

Lexikální analýza

Text zdrojového kódu přepisuje lexikální analyzátor na posloupnost lexikálních jednotek (lexémů), tedy výrazu mající význam jako identifikátor (proměnná), operátor, symbol přiřazení. apod.

Zdrojový kod:

pozice = start + rychlost * 60

Lexikální analýza:

<id,pozice><=><id,start><+><id,rychlost><*><num,60>

 

 

 

 

 

Tyto lexémy jsou reprezentovány ve formě tokenů, které jsou poskytnuty ke zpracování syntaktickému analyzátoru. Úkolem lexikálního analyzátoru je také odstranění komentářů a bílých znaků ze zdrojového programu. 

Funkce lexikálního analyzátoru:

  1. nalezení a rozpoznání lexikálního symbolu
  2. zakódování lexikálních symbolů,
  3. vynechání nepotřebných znaků a symbolů
  4. výpočet syntetizovaných atributů lexikálních symbolů.

V praxi je lexikální analyzátor realizován pomocí konečného automatu.

Syntaktická analýza

Syntaktická analýza převede lexikální jednotky na fráze. Ty se obvykle reprezentují derivačním stromem. V této fázi se využívají bezkontextové gramatiky, které z výrazu sestrojí derivační stroj.

Vstupem jsou tedy tokeny (např. závorka, literál, proměnná, klíčové slovo, symbol a pod.), což je pro parser již dále nedělitelná základní stavební jednotka, které má uloženy v listech načteného datového stromu.

Syntaktická analýza:

 





 

 

Sémantická analýza

Sémantická analýza postupně prochází symboly či skupiny symbolů získané ze syntaktické analýzy a přiřazuje se jim význam. Pokud například skupina symbolů představuje použití konkrétní proměnné, pak analyzátor zjišťuje zda je proměnná už deklarována (pokud je to požadováno, nevyžaduje například programovací jazyk Perl či PHP) a zda je správně použita vzhledem k jejímu datovému typu. Dále například u operací kontroluje zda jsou operandy správného typu, případně provede potřebnou konverzi datového typu. 

Sémantická analýza tedy zpracovává především deklarace, které ukládá do svých datových struktur dělá se zde typová kontrola a další kontroly které ověřují, zda kód odpovídá specifikaci zdrojového jazyka. 

Generování mezikódu

Generování (tříadresového) mezikódu:

temp1 = inttoreal(60)
temp2 = rychlost * temp1
temp3 = start + temp2
pozice = temp3
 

Některé překladače generují mezikód (explicitní intermediální reprezentaci kódu). Jde o jakýsi kód pro abstraktní počítač, který lze jednoduše vytvořit a zároveň jej i jednoduše převést do cílového kódu. Pro některé interpretační překladače jde o poslední fázi a mezikód už rovnou vykonávají.

Mezikódy v této fázi mohou mít různé podoby jednou z nich je tříadresový kód který vidíte v příkladu vpravo. Tříadresový kód se podobá instrukcím pro počítač a sestává se s posloupnosti instrukcí o nanejvýš třech operandech.

Optimalizace zdrojového kodu:

temp1 = rychlost * 60.0
pozice = start + temp1
 

Optimalizace kódu

Vylepšuje kód tak aby byl rychlejší nebo kratší. Některé optimalizační metody jsou triviální, například zjednodušení různých výpočtů a zredukování proměnných intermediálního kódu jak je ukázané na příkladu vpravo.

Generování cílového kódu

Generování cílového kodu:

MOVF rycholost, R2
MULF #60.0, R2
MOVF start, R1
ADDF R2, R1
MOVF R1, pozice
 

Posledním krokem překladače je vygenerování cílového kódu. Výsledkem je většinou přemístitelný strojový kód, nebo program v asembleru. V této fázi se všem proměnným přidělí místo v paměti a instrukce mezikódu se přeloží do strojových instrukcí.

Instrukce v ukázce vpravo obsahují F, protože se pracuje s hodnotami s desetinnnou čárkou. První operand instrukce je zdrojový, druhý cílový. První instrukce tedy říká přesuň proměnnou rychlost do registrů 2, další instrukce pak vynásob konstantou 60 registr 2, apod.