Překladač a jeho struktura Překladače, přednáška č. 1 Šárka Vavrečková Ústav informatiky, FPF SU Opava sarka.vavreckova@fpf.slu.cz http://fpf.slu.cz/ vav10ui Poslední aktualizace: 23. září 2008
Definice překladače Definice (Překladač) Překladač je program, který k libovolnému programu P Z (zdrojový program) v jazyku J Z (zdrojový jazyk) vytvoří program P C (cílový program) v jazyku J C (cílový jazyk) se stejným významem. Překladač tedy realizuje zobrazení z jazyka J Z do jazyka J C. P z P c nad nad J z J c
Definice překladače Definice (Překladač) Překladač je program, který k libovolnému programu P Z (zdrojový program) v jazyku J Z (zdrojový jazyk) vytvoří program P C (cílový program) v jazyku J C (cílový jazyk) se stejným významem. Překladač tedy realizuje zobrazení z jazyka J Z do jazyka J C. P z P c nad nad J z J c
Typy překladačů z hlediska existence cílového kódu kompilátor (generační překladač) interpret (interpretační překladač) hybridní
Typy překladačů z hlediska existence cílového kódu zdrojový program kompilátor data cílový program operační systém zdrojový program data interpret výsledky výsledky
Typy překladačů z hlediska existence cílového kódu Vlastnost Kompilátor Interpret Rychlost běhu cílového programu lepší Rychlost spuštění cílového programu lepší Rychlost překladu lepší Spotřeba paměti operační (při běhu) lepší Spotřeba paměti cílový soubor na pam. médiu lepší Přenositelnost kódu mezi SW platformami lepší Možnosti optimalizace lepší Nezávislost na překladači lepší
Typy překladačů z hlediska komunikace s uživatelem klasický konverzační rozlišujeme jazyk a metajazyk, dvě části: řidicí část interpretační (kompilační) část
Fáze překladu 1 lexikální analýza, 2 syntaktická analýza, 3 sémantická analýza, 4 optimalizace kódu, 5 generování cílového kódu nebo interpretace, 6 hlášení o chybách, 7 informace o překladu.
Fáze překladu 1 lexikální analýza, 2 syntaktická analýza, 3 sémantická analýza, 4 optimalizace kódu, 5 generování cílového kódu nebo interpretace, 6 hlášení o chybách, 7 informace o překladu.
Fáze překladu Přední část překladače: 1 lexikální analýza, 2 syntaktická analýza, 3 sémantická analýza, Zadní část překladače: 1 optimalizace kódu, 2 generování cílového kódu nebo interpretace.
Průchody překladu Definice (Průchod) Průchodem nazýváme krok činnosti překladače, ve kterém je zpracován celý vstupní soubor kroku na výstupní soubor kroku (vstupní soubor kroku nemusí být totožný se vstupním souborem překladače, stejně tak výstupní soubor ještě nemusí být cílový kód). Pojmy mezikód, interní kód, interní forma programu, intermediální kód, jednoprůchodový překladač, víceprůchodový překladač.
Průchody překladu Definice (Průchod) Průchodem nazýváme krok činnosti překladače, ve kterém je zpracován celý vstupní soubor kroku na výstupní soubor kroku (vstupní soubor kroku nemusí být totožný se vstupním souborem překladače, stejně tak výstupní soubor ještě nemusí být cílový kód). Pojmy mezikód, interní kód, interní forma programu, intermediální kód, jednoprůchodový překladač, víceprůchodový překladač.
Informace o chybě Překladač přijde na chybu ve zdroji: podá uživateli tyto informace: kde v programu se chyba nachází (např. číslo řádku a pozice na něm), typ chyby (např. proměnná tohoto názvu nebyla deklarována, chyba v syntaxi operátoru,... ), některé překladače dokážou navrhnout možnosti nápravy chyby. Překladač by se rozhodně neměl pokoušet chyby sám opravovat bez okamžitého informování uživatele.
Lexikální analyzátor Chyby typu neznámý symbol, například 12YT. Není problém zjistit umístění ve zdroji.
Syntaktický analyzátor Chyby v syntaktické struktuře programu, přehozená a chybějící klíčová slova nebo symboly, například 12 := x; IF x>1 ELSE x := 3; Pokud je ve stejném průchodu s lexikálním, snadno zjistíme umístění ve zdroji. Když ne, zvolíme jeden z těchto způsobů: 1 Součástí symbolu nebude jen jeho identifikace a sémantické atributy, ale také další dva atributy určující číslo řádku, na kterém se symbol nachází, a vzdálenost prvního znaku symbolu od začátku řádku. 2 Nadefinujeme speciální typ symbolu, který bude představovat přechod na nový řádek ve zdroji. Tento symbol přidá lexikální analyzátor k výstupu kdykoliv, když narazí na konec řádku ve zdroji (samozřejmě také uvnitř komentářů!). Syntaktický analyzátor má vyhrazený čítač, který zvýší o 1, když ve svém vstupu načte symbol konce řádku, takže má přehled o tom, na kterém řádku zdroje se nachází.
Sémantický analyzátor Chyby zjistitelné při překladu nedeklarovaná proměnná použitá ve výrazu, nekompatibilní datový typ, apod. Informace o umístění se zjišťují stejně jako u syntaktické analýzy. Běhové chyby dělení nulou, přetečení datového typu, nedovolený přístup do paměti, atd. Informaci o umístění ve zdroji obvykle nelze získat, u kompilačního překladače se vypisuje alespoň pozice v cílovém kódu.
Typologie chyb Chyby na straně uživatele 1 Chyby související se strukturou programu (většinou lexikální nebo syntaktické), ty lze obvykle zjistit už při překladu. 2 Chyby běhové (run-time), například dělení nulou. Souvisí obvykle s momentální hodnotou proměnných a lze je jen těžko zjistit. 3 Chyby logické (chybná posloupnost příkazů, záměna operátorů, překlep v čísle apod.), které při překladu prakticky nelze odhalit.
Reakce na chybu Překladač reaguje dvěma způsoby: při prvním výskytu chyby se zastaví, provede diagnózu, informuje uživatele a čeká na opravu chyby (Turbo Pascal), pokouší se najít co nejvíce chyb najednou, zastaví se až při určitém maximálním počtu a informuje uživatele o všech objevených chybách popř. o maximálním počtu chyb, které je schopen zobrazit (například C++). Zotavení po chybě Umožňuje opravit více chyb najednou bez nutnosti pokaždé znovu spouštět překladač. Analyzátor načítá prvky ze vstupu naprázdno bez další reakce tak dlouho, dokud se nepodaří navázat na předchozí správný průběh překladu, pak pokračuje běžným způsobem.
Reakce na chybu Překladač reaguje dvěma způsoby: při prvním výskytu chyby se zastaví, provede diagnózu, informuje uživatele a čeká na opravu chyby (Turbo Pascal), pokouší se najít co nejvíce chyb najednou, zastaví se až při určitém maximálním počtu a informuje uživatele o všech objevených chybách popř. o maximálním počtu chyb, které je schopen zobrazit (například C++). Zotavení po chybě Umožňuje opravit více chyb najednou bez nutnosti pokaždé znovu spouštět překladač. Analyzátor načítá prvky ze vstupu naprázdno bez další reakce tak dlouho, dokud se nepodaří navázat na předchozí správný průběh překladu, pak pokračuje běžným způsobem.
Jazyky překladače jazyk, ve kterém je sám napsán, zdrojový jazyk, který přijímá, cílový jazyk, ve kterém je jeho výstup.
Generátory překladačů Jak vytvořit překladač v assembleru ve vyšším programovacím jazyce s použitím generátoru překladačů dodáme popis struktury jazyka (gramatika) a popis výstupu generátory lexikálního analyzátoru Lex, Flex generátory syntaktického analyzátoru Yacc, Bison
Aplikace pro jinou platformu Programování aplikací Kompilátor překládá aplikaci do cílového jazyka pro jiný operační systém než na kterém provádí překlad. Používá se u aplikací pro mobily, PDA, roboty, herní konzole. Portování = přenos již existující aplikace nebo operačního systému na novou platformu (softwarovou nebo hardwarovou).