1 Úvod do kompilátorů



Podobné dokumenty
Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

Interpret jazyka IFJ2011

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Další aspekty architektur CISC a RISC Aktuálnost obsahu registru

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Teoretické minimum z PJV

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

PROGRAMOVÁNÍ ŘÍDÍCÍCH SYSTÉMŮ

dovolují dělení velkých úloh na menší = dekompozice

Principy operačních systémů. Lekce 7: Souborový systém

Maturitní otázky z předmětu PROGRAMOVÁNÍ

V 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a

Struktura programu v době běhu

Operační systémy. Přednáška 8: Správa paměti II

IB111 Úvod do programování skrze Python Přednáška 13

Schopnosti překladačů vybraných objektově orientovaných jazyků

Tematická oblast: Programování 1 (VY_32_INOVACE_08_1_PR) Anotace: Využití ve výuce: Použité zdroje:

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Rozhraní pro práci s XML dokumenty. Roman Malo

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

IB109 Návrh a implementace paralelních systémů. Kolektivní komunikační primitava. RNDr. Jiří Barnat, Ph.D.

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Bayesovská klasifikace digitálních obrazů

Charakteristika dalších verzí procesorů v PC

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Programovací jazyky. Obsah. Proč používáme programovací jazyky? Programovací jazyk

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Objektově orientovaný přístup

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Zpracování deklarací a přidělování paměti

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Adresní mody procesoru

Algoritmizace I. Ak. rok 2015/2016 vbp 1. ze 132

Obsah. KAPITOLA 1 Dříve než začneme 19 Kdysi dávno aneb střípky z historie algoritmických strojů třicátá léta 22

Úvod do programování

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

Programovací jazyk Pascal

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE FORMALISMY PRO SYNTAXÍ ŘÍZENÝ PŘEKLAD: PŘEKLADOVÉ A ATRIBUTOVÉ GRAMATIKY.

5 Rekurze a zásobník. Rekurzivní volání metody

Vizuální programovací jazyk

Management procesu II Mgr. Josef Horálek

OSTRAVSKÁ UNIVERZITA V OSTRAVĚ

Databázový systém Matylda

Architektury CISC a RISC, uplatnění v personálních počítačích

Datové typy a struktury

Tabulka. Datová struktura, která umožňuje vkládat a později vybírat informace podle identifikačního klíče. Mohou být:

Lexikální analýza Teorie programovacích jazyků

Kolaborativní aplikace

Generování vnitřní reprezentace programu

Program a životní cyklus programu

Implementace A* algoritmu na konkrétní problém orientace v prostoru budov

Architektury počítačů a procesorů

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Paměti a jejich organizace

Úvod do architektur personálních počítačů

Adresace paměti. 11.přednáška

Souborový systém (File System FS) Souborové systémy. Souborová fragmentace. Disková fragmentace. Organizace dat na pevném disku

NEXIS 32 rel Generátor fází výstavby TDA mikro

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Algoritmizace prostorových úloh

Stromy, haldy, prioritní fronty

Implementace numerických metod v jazyce C a Python

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

RELAČNÍ DATABÁZOVÉ SYSTÉMY

MPASM a IDE pro vývoj aplikací MCU (Microchip)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

CZ.1.07/1.5.00/

PES lib (C + PASCAL) KNIHOVNY KOMUNIKAÈNÍCH FUNKCÍ 03/ PESlib KOMUNIKAČNÍ KNIHOVNY C, PASCAL 03/ stran 1

ADVANTA group.cz Strana 1 ze 40. Popis řešení Řízení IT projektů. group.cz

Software je ve světě IT vše, co není Hardware. Do softwaru patří aplikace, program, proces, algoritmus, ale i data (text, obrázky), operační systém

ALGORITMIZACE A PROGRAMOVÁNÍ

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů.

Systém souborů (file system, FS)

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Registrační číslo Hodnocení - část A Hodnocení - část B Hodnocení - část A+B

OSTRAVSKÁ UNIVERSITA V OSTRAVĚ Pedagogická fakulta Obor informační technologie ve vzdělávání Kombinované studium

Kapitola z diplomové práce Marie Brázdové: Využití internetu ve výuce matematiky. PedF UK v Praze, Jedna z aktivit v praxi

Helios RED a Internetový obchod

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

NPRG030 Programování I, 2018/19 1 / :25:37

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Návrh programu v Black Box Component Builderu s využitím architektury Model View Controller

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

IB111 Úvod do programování skrze Python Přednáška 13

Programování. Debugging a testování. Martin Urza

Algoritmizace prostorových úloh

NPRG030 Programování I, 2015/16 1 / :25:32

1. Programování PLC. Programovatelné automaty II - 1 -

Syntaxí řízený překlad

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

InTouch 8.0 Subsystém distribuovaných alarmů

5 Přehled operátorů, příkazy, přetypování

Testování a spolehlivost. 6. Laboratoř Ostatní spolehlivostní modely

HypEd4 Uživatelská příručka 2004 HYPEL

Šifrování/Dešifrování s použitím hesla

Principy činnosti sběrnic

POČÍTAČOVÉ SÍTĚ 1 Úvod

Transkript:

1 Úvod do kompilátorů 1.1 Úvodem několik slov Tyto texty obsahují úvod do návrhu programovacích jazyků a problematiky překladu programů. Téma pokrývá oblasti zahrnující lexikální analýzu (scanning), regulární výrazy, bezkontextové gramatiky a syntaktickou analýzu (parsing), překlad řízený syntaxí, abstraktní syntaktické stromy, úrovně-hladiny platnosti entit (scoping), tabulky symbolů a generování kódu. 1.2 Trochu historie Objem našich znalostí o tom, jak organizovat a psát kompilátory prudko narostl od doby existence prvních kompilátorů. Je těžké určit přesnější datum vzniku prvního kompilátoru, protože zpočátku se objevovalo veliké množství pokusů a implementací, na kterých se podílelo nezávisle na sobě více skupin. První kompilátory se objevovali od počátku 50-tych let 20. století. V onom období byli považované za jeden z nejtěžších a nejkomplikovanějších problémů v oblasti softvéru. Termín kompilátor vznikl právě v tomto období. Programátor-analytička Grace Murray Hopperová použila pojmenování kompilace pro posloupnost podprogramů vybraných z připravené knižnice za účelem rychlejšího sestavení programu na řešení problému za pomoci počítače. Tomuto postupu se hovořilo taktéž automatické programování. V té době vládla hluboká skepse v úspěšnost tohoto postupu, ale pozdější vývoj hlavně díky vybudování teoretického aparátu ukázal správnost nastoupené cesty. Možno diskutovat i o terminologické správnosti názvu překladače. Spíš by bylo vhodnější pojmenování translátor, ale podobně jako je tomu ve výpočetní technice i u mnohých dalších pojmech, z historických důvodů se ujal právě termín kompilátor. Jedním z prvních známých programovacích jazyků vyšší úrovně bol FORTRAN formula translation, problémově orientovaný jazyk pro řešení matematických úloh. Ve firmě IBM byl k němu vyvinutý týmem vedeným Johnem Backusem mezi lety 1954-1957 kompilátor. Jeho vývoj spotřeboval 18 člověko-let (staffyears) implementace. Stavba tohoto kompilátoru nebyla založena na nějakém teoretickém základě. Jeho struktura, komponenty a techniky vznikali ad-hoc, t.j. pro daný případ během jeho budování. Přibližně v tom čase začal Noam Chomsky svůj výzkum v oblasti struktury přirozených jazyků.. Výsledky jeho práce se výrazným způsobem odrazili ve vývoji a tvorbě moderních jazyků a jejich kompilátorů (o tom však pohovoříme později). Od těch dob vývoj velice pokročil a vyvinuli se systematické techniky pro vyřešení mnohých problémů, které se vyskytují během kompilace. Kromě samotných programovacích jazyků byli vyvinuty i kvalitnější vývojové prostředí a různé softvérové nástroje umožňující tvorbu kvalitních programů a programových systémů. Dnes už jsou kompilační techniky dobře srozumitelné a jednoduchý, ale kvalitní kompilátor může vzniknout za několik měsíců. 1.3 Co je to kompilátor? Kompilátor patří k základům moderního zpracování údajů. Při tvorbě nového softvéru se dnes už nedá pracovat bez tohoto produktu. Je spolu s programovacím jazykem základním dorozumívacím prostředkem mezi autorem programu a procesorem. Pro člověka je strojový jazyk těžko čitelný a ladění v něm je velmi náročné. Vytvoření procesoru schopného zpracovávat program přímo ve vyšším jazyku je nesmyslem. První pohled na kompilátor z hlediska běžného uživatele možno charakterizovat jako takzvanou černou skřínku, obsah které nepoznáme. Poznáme však vlastnosti této skřínky a účel, na který ho můžeme využít: Zdrojový program KOMPILÁTOR Cílový program Chybové zprávy 1.3.2007 / 2:37 Benedikovič 1/8

Koncepčně možno kompilátor rozdělit na dvě základní části: Analýza - rozpoznává nějaký zdrojový jazyk L. Syntéza - vytváří cílový kód v nějakém cílovém jazyku L'. Analýza rozloží text zdrojového programu do podstatných významových částí a vytvoří vnitřní reprezentaci programu. Syntéza vytvoří z vnitřní reprezentace cílový program ve tvaru, který potom dokáže zpracovávat cílový procesor, pro který byl použitý kompilátor. 1.4 Běžná struktura kompilátoru Kompilátor je samostatný program napsaný v nějakém hostitelském jazyku. (Například překladač jazyka Pascal s použitím jazyka C++ jako hostitelského jazyka). Typická organizace kompilátora Zdrojový (Source) kód (posloupnost znaků) Lexikální analyzátor (scanner) Syntaktický analyzátor (parser) Sémantický analyzátor Posloupnost tokenů Abstraktní syntaktický strom POPŘEDÍ Front end Rozšířený označený syntaktický strom Pomocný kód Generátor pomocného kódu POZADÍ Back end Optimalizovaný pomocný kód Optimalizátor Cílový (Object) kód (může být assemblerovský anebo strojový kód) Generátor kódu Kompilátor pracuje ve více fázích; každá fáze překládá zdrojový program z jedné reprezentace do jiné. Různé kompilátory můžou obsahovat různé fáze, dokonce můžou být i různě seřazené. 1.5 Fáze kompilátora: V procese kompilace se analýza skládá z troch fází: 1. Lineární analýza - proud znaků tvořící zdrojový program je čítaný zleva doprava, jsou vyhledávané významové posloupnosti znaků tvořící vždy nedělitelný jedno resp. víceznakový symbol - lexéma. Každé lexéme je přirazený token. Této fázi se častěji hovoří lexikální analýza, anebo scanning. 2. Hierarchická analýza - symboly anebo tokeny jsou sdružované do syntaktických celků podle přesně stanovených gramatických pravidel jazyka. Tuto fázi voláme syntaktickou analýzou - parsingem. 3. Sémantická analýza - vykonávají se určité kontroly pro zajištění správného významu příslušných komponent v celkovém kontexte programu, případně jeho částí. 1.5.1 SCANNER - lexikální analyzátor Scanner je volaný z parseru, přičemž vykonává následovní činnosti: čte jednotlivé znaky ze zdrojového programu, 1.3.2007 / 2:37 Benedikovič 2/8

seskupuje znaky do LEXÉM (jsou to posloupnosti znaků, které patří k sobě ; pojmenovávají entitu ), každý lexém odpovídá jednomu TOKEN-u (prvek jazyka s definovaným významem); scanner vrací následující token (případně další přídavnou informaci) do parseru, scanner může taktéž odhadovat lexikální chyby (např. nekorektní znaky). Definice lexém, tokenů a nekorektních znaků závisí na definici zdrojového jazyka. V následující tabulce najdete několik příkladů přirazení tokenů textovým symbolům zdrojového jazyka. Příklad v jazyce Pascal: lexéma - její text : index := tmp 37 10.2 odpovídající token COLON IDENT ASSIGN IDENT INT-LIT REAL-LIT význam dvojtečka identifikátor přirazení identifikátor celočís.literál reálný literál V prvním řádku je vždy posloupnost znaků dekódovaná jako lexéma jazyka. Ve druhém řádku je kód (=token) přirazený zjištěné lexémě. Ve skutečnosti jde o číselné vyjádření ve vnitřní reprezentaci. Pro lepší čitelnost scanningu budeme namísto takového kódu používat dohodnutý symbol složený ze znaků.. Ve vnitřním kódu mají všechny tokeny stejný rozměr, například jeden byte. Ve třetím řádku je význam lexémy v programovacím jazyku. Poznámky: - víceré lexémy můžou odpovídat stejnému tokenu, - tokeny COLON, atd. jsou v skutečnosti například jednobytové symboly (kódy), - literál je číselná hodnota zapsaná v textovém tvaru. Příklad překladu přiřazovacího příkazu v Pascalu: zdrojový kód pozice := zaklad + posun * 60 tokeny IDENT ASSIGN IDENT PLUS IDENT TIMES INT-LIT význam identifikátor přiřazení identifikátor operátor + identifikátor krát celočís. literál Příklady nekorektních znaků v Pascalu: Např.. znaky!? ctrl-a mimo řetězce. 1.5.2 PARSER - syntaktický analyzátor seskupuje tokeny do "gramatických vět-frází", vyšetřuje gramatickou strukturu zdrojového programu, hledá syntaktické chyby, například v Pascalu: jestli je zdrojový text pozice := * 5 posloupnost tokenů je IDENT ASSIGN TIMES INT-LIT!!! Všechno jsou to legální tokeny, ale jejich posloupnost je chybná!!! může hledat i některé "statické sémantické" chyby, Např.. nedeklarované proměnné, případně víckrát deklarované proměnné, generuje vnitřní reprezentaci programu vyjádřenou ve tvaru abstraktního syntaktického stromu a buduje program ve vnitřním jazyku. Zdrojový kód Příklad syntaktického stromu: vnitřní uzly stromu jsou OPERÁTORY, synové uzlu jsou jeho OPERANDY, každá část podstromu je samostatnou "logickou jednotkou", například: podstrom s operátorem * i s jeho kořenem ukazuje, že násobení má vyšší prioritu jako součet, t.j. tato operace musí být vybrána jako významová jednotka, tedy ne: zaklad + posuv pozice := zaklad + posuv * 60 Abstraktný syntaktický strom := pozice + zaklad * posuv 60 1.3.2007 / 2:37 Benedikovič 3/8

1.5.3 Sémantický analyzátor Kontroluje do hloubky významovou stránku překládaného programu a hledá "statické sémantické" chyby, například chyby typů. Sbírá typové informace pro fázi generování kódu. Jako vstup používá hierarchickou strukturu vytvořenou fází syntaktické analýzy. Zjišťuje kompatibilitu typů jednotlivých elementů a v případě, že specifikace dovoluje určitou kompatibilitu mezi typy (například integer a real), doplňuje uzly do syntaktického stromu o možnost konverze typu hodnoty na kompatibilní typ. Hovoříme tomu typová kontrola. Výsledkem činnosti sémantiky může být označení uzlů vlastnostmi, případně i změna celého abstraktního syntaktického stromu. Abstraktní syntaktický strom před sémantickou analýzou: Abstraktní syntaktický strom po sémantické analýze: := := pozice + zaklad stupen * 60 pozice real zaklad real stupen real + * inttoreal() 60 1.5.4 Generátor vnitřního kódu Překládá zápis z abstraktního syntaktického stromu do pomocného vnitřního kódu. Jde vlastně o vnitřní reprezentaci zdrojového programu jako jakýsi program pro abstraktní počítač. Táto reprezentace má dvě velmi důležité vlastnosti: je ho možné lehčeji vytvořit, než konkrétní cílový program, je lehčeji přeložitelný do cílového jazyka, než původní zdroj ve vyšším programovacím jazyce. Bez vnitřní reprezentace: S vnitřní reprezentací: PASCAL procesor 1 PASCAL procesor 1 C++ procesor 2 C++ procesor 2 FORTRAN procesor 3 FORTRAN Vnitřní jazyk procesor 3 BASIC procesor 4 BASIC procesor 4 LOGO procesor 5 LOGO procesor 5 25 možností 10 možností Vzniká tím koncepce, která určitým způsobem odděluje od sebe fáze analýzy a syntézy. Efektivněji je potom možné vyvíjet kompilátory mezi různými zdrojovými jazyky a cílovými jazyky. Vnitřní jazyk, kód může mít více forem. Jednou z nejpoužívanějších forem je tzv. tříadresový kód podobný assemblerovskému jazyku. V tomto kódu každá operace potřebuje ke své činnosti nejvíce tři operandy (dva pro zpracovávané hodnoty, jeden pro výsledek operace), jeden operátor pro vykonání operace a operátor přiřazení pro uložení. 1.3.2007 / 2:37 Benedikovič 4/8

Příklad zápisu v dohodnutém vnitřním jazyce: temp1 := inttoreal(60) temp2 := stupen * temp1 temp3 := zaklad + temp2 pozice := temp3 Tímto způsobem může být definována jednotná šablona pro vykonávání akcí. Vytvoří se posloupnost operací, která jednoznačně určí posloupnost instrukcí určující pořadí, v jakém se budou vykonávat akce programu. Nemusí se už například uvažovat priorita aritmetických operací.. Generují se dočasné jména pro hodnoty pro potřeby dalšího překladu.. Některé instrukce můžou mít, samozřejmě, méně než tři operandy. Kromě uvedených operací musí reprezentace vykonávat i jiné typy instrukcí, jako jsou řídící instrukce, volání procedur a podobně. Tato část kompilátoru vytváří vnitřní kód, který by měl být nezávislý na cílovém kódu. Je určený pro výstup informace z popředí kompilátoru ve všeobecném tvaru, který možno zpracovat do konečného tvaru různými způsoby. Poznámka: Tuto část (generátor vnitřního kódu) možno někdy nahradit přímo generátorem cílového kódu, jestli tvoříme cílový kód kompilátorem přímo na míru bez potřeby jeho dalších úprav. Zanikne tím struktura popředí a pozadí kompilátoru. Takovýto kompilátor však není je přenositelný na jiný typ procesoru. 1.5.5 Optimalizátor Pokouší se vylepšit kód vytvořený generátorem pomocného kódu na základě znalostí cílového jazyka. Cílem může být vytvoření kódu rychleji pracujícího programu, anebo kódu zabírajícího méně místa. Přijímá pomocný kód z popředí a analyzuje možnosti jeho vylepšení vzhledem na rychlost a na úsporu paměti. Výsledkem je optimalizovaný vnitřní kód. Například k předcházejícímu příkladu: temp2 := stupen * 60.0 pozice := zaklad + temp2 Problematika tvorby optimalizátoru je složitým samostatným problémem, kterým se na tomto místě nebudeme podrobněji zaobírat! 1.5.6 Generátor cílového kódu Generuje cílový kód z (optimalizovaného) pomocného kódu. Je úplně závislý na cílovém prostředí, ve kterém má pracovat přeložený program. Například: LOADF rate,r1 MULF #60.0,R1 LOADF zaklad,r2 ADDF R2,R1 STOREF R1,pozice Důležitá je i volba cílového jazyka podle účelu. Jazyk symbolických adres - assemblerovský jazyk. Používá se v případě existence kvalitního překladače Asembleru. V našem případě bude vhodným cílovým jazykem pro potřeby výuky. Čistý strojový kód - generování kódu pro speciální instrukční množinu bez předpokladu existence operačního systému a knižnic. Funguje nezávisle na jiném softvéru. Rozšířený strojový kód - používané jsou rutiny OS a podporné rutiny (V/V operace, alokace paměti, matematické funkce apod.). Během vykonávání programu musí být tyto prostředky k dispozici. Virtuální strojový kód - složený je úplně z takzvaných virtuálních instrukcí.. Hovoříme tomu technika tvorby přenositelného počítače. 1.6 Kontext kompilátora Už jsme hovořili o tom, že koncepčně pracuje kompilátor v jednotlivých fázích, přičemž v každé z nich je transformovaný zdrojový program postupně z jedné reprezentace do následující.. 1.3.2007 / 2:37 Benedikovič 5/8

Na následujícím obrázku je uvedena dekompozice kompilátoru: V praxi jsou některé fáze sloučeny. Například syntaktický a sémantický analyzátor se často považují za jeden komponent kompilátoru. Vnitřní reprezentace se v mnohých implementacích dokonce nevyskytuje. Optimalizátor kódu taktéž není nevyhnutný, ale dnes je velmi důležitou součástí kompilátoru. Dvě aktivity: Dekompozice kompilátoru Zdrojový program Lexikální analyzátor - Správce tabulky symbolů (Symbol Table Manager) a - Správce hlášení chyb (Error Reporting) jsou přepojené se všemi fázemi. Přijímají a udržují informace o entitách programu během celého procesu kompilace. Správce tabulky symbolů Syntaktický analyzátor Sémantický analyzátor Gener. vnitřního kódu Optimalizátor kódu Správce hlášení chyb Generátor cílového kódu Cílový program 1.6.1 Řízení tabulky symbolů Důležitou součástí kompilátora je záznam identifikátorů použitých ve zdrojovém programu a sběr informací o různých atributech o každém z nich. Jako si později uvedeme, všechny identifikátory v programu mají ve vnitřním kódu přirazený jeden společný kód - token. Z důvodu rozlišitelnosti různých identifikátorů musíme po výskyte každého identifikátoru ve zdrojovém programu vést o něm potřebné informace, aby byla zabezpečena jednoznačnost. Atributy můžou obsahovat a poskytovat informace například o paměti nutné pro její alokaci, o druhu identifikátoru a typu odpovídající hodnoty, o počtu a typu argumentů procedury, funkce, o propojení na jiné identifikátory, a podobně... Tabulka symbolů (Symbol Table) je datová struktura obsahující záznam o každém identifikátoru programu s položkami pro jeho atributy. Umožňuje rychle nalézt potřebné informace a doplnit je, případně využít v dalším průběhu kompilace. Jestli je v programu lexikálním analyzátorem detekovaný nový identifikátor, potom je vložený do tabulky s minimální počáteční informací, protože během lexikální analýzy není možné určit další informace.. Atributy jsou do tabulky postupně přidávané během dalších fází kompilace.. Během generování vnitřního a cílového kódu jsou tyto informace využívané například pro alokaci proměnné, anebo konstanty do paměti.. 1.6.2 Detekce chyb a správy o chybách Po vzniku libovolné chyby během kompilace, či už lexikální, syntaktické anebo sémantické je potřebné vydat o tom správu a je třeba zajistit určité činnosti související s příslušnou chybou. Například: V první řade je třeba zjistit o jakou chybu jde a oznámit druh chyby. Je samozřejmostí podat správu o místě, kde byla chyba zjištěna. Důležité je zajistit v kompilátoru způsob pokračování činnosti kompilátoru po vydání příslušné správy. Existuje více druhů chyb, které ovlivňují způsob další činnosti kompilátoru. Krom samotné chyby jako takové kompilátor může rozeznávat i váhu chyby a rozhodne se například nepokračovat v kompilaci (tzv. fatální chyba v Borland Pascale - Error), anebo na chybu pouze upozornit a pokračovat v kompilaci (tzv. varovná chyba - Warning). Možno tu vysledovat i dva způsoby chování kompilátoru po zjištění fatální chyby: zastavení překladu po fatální chybě - Borland Pascal, po oznámení pokračování v kompilaci a vyhledávání dalších chyb - Borland C++, Delphi,... 1.3.2007 / 2:37 Benedikovič 6/8

První případ je triviální. V druhém případě je nutné aby se počítač nezbláznil a nezačal vypisovat lavinovitě chyby, které v programu vlastně nejsou, ale vznikly tým, že kompilátor je po výskytu dezorientovaný a tím může považovat část textu omylem za chybný. V kompilátoru se to řeší postupem. který nazýváme zotavení - Recovery. 1.3.2007 / 2:37 Benedikovič 7/8

1.7 Obsah: 1 ÚVOD DO KOMPILÁTORŮ... 1 1.1 ÚVODEM NĚKOLIK SLOV... 1 1.2 TROCHU HISTORIE... 1 1.3 CO JE TO KOMPILÁTOR?... 1 1.4 BĚŽNÁ STRUKTURA KOMPILÁTORU... 2 1.5 FÁZE KOMPILÁTORA:... 2 1.5.1 SCANNER - lexikální analyzátor... 2 1.5.2 PARSER - syntaktický analyzátor... 3 1.5.3 Sémantický analyzátor... 4 1.5.4 Generátor vnitřního kódu... 4 1.5.5 Optimalizátor... 5 1.5.6 Generátor cílového kódu... 5 1.6 KONTEXT KOMPILÁTORA... 5 1.6.1 Řízení tabulky symbolů... 6 1.6.2 Detekce chyb a správy o chybách... 6 1.7 OBSAH:... 8 1.3.2007 / 2:37 Benedikovič 8/8