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

Rozměr: px
Začít zobrazení ze stránky:

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

Transkript

1 Vazba (binding) Tabulka symbolů Miroslav Beneš Dušan Kolář vazba = spojení mezi entitou a vlastností okamžik vazby (binding time) při návrhu jazyka při implementaci jazyka během překladu/spojování/zavádění programu za běhu programu statická vazba / dynamická vazba dynamická vazba vznikne nebo se může změnit po spuštění programu Tabulka symbolů 2 Vazba - příklad int count;...; count = count + 5; množina typů proměnné count typ count množina hodnot count hodnota count množina významů symbolu + význam symbolu + v tomto příkazu interní reprezentace literálu 5 Deklarace a definice Deklarace (proměnné, funkce) specifikuje pouze atributy explicitní / implicitní deklarace Definice proměnné specifikuje atributy a způsobuje alokaci paměti Definice funkce specifikuje atributy a tělo funkce Tabulka symbolů 3 Tabulka symbolů 4 1

2 Proměnné abstrakce buňky nebo kolekce buněk v paměti počítače absolutní adresování LOAD 100 ADD 101 STORE 100 jazyk symbolických adres X DS F LOAD X vyšší programovací jazyky var x: Integer; Základní vlastnosti proměnné jméno adresa hodnota typ doba života rozsah platnosti Tabulka symbolů 5 Tabulka symbolů 6 Adresa a hodnota proměnné L:= R proměnná na levé straně představuje adresu = L-hodnota proměnná na pravé straně představuje hodnotu = R- hodnota Jméno může být spojeno s různými adresami lokální proměnné v různých podprogramech lokální proměnná v rekurzivní funkci Adresa může být spojena s různými jmény aliasing parametry předávané odkazem, ukazatele komplikuje optimalizaci programů Adresa a hodnota proměnné Statická vazba adresa: statické proměnné hodnota: konstanty Dynamická vazba proměnné alokované na zásobníku proměnné alokované na hromadě (heap) alokace proměnné malloc(), new, explicitní dealokace free(), delete, implicitní dealokace garbage collector (GC) Tabulka symbolů 7 Tabulka symbolů 8 2

3 Typ proměnné Typ proměnné určuje množinu hodnot proměnné množinu aplikovatelných operací Statická vazba většina klasických jazyků součást deklarace možnost implicitní deklarace typu (BASIC, FORTRAN) Dynamická vazba typická pro skriptovací a interpretované jazyky vyžaduje dynamickou typovou kontrolu možnost odhalení chyb až při běhu programu, časově náročné Rozsah platnosti (scope) Rozsah platnosti = úsek programu, ve kterém je entita známá a je tedy možné s ní manipulovat Viditelnost (visibility) proměnná není zakrytá jinou proměnnou téhož jména v zanořeném rozsahu int x, y; float f(float x) { return x * 1.22; proměnná x typu int je platná v celém programu, ale viditelná jen mimo funkci f Tabulka symbolů 9 Tabulka symbolů 10 Rozsah platnosti (scope) Statická vazba rozsahu platnosti rozsah platnosti je dán lexikální strukturou programu (pozicí zápisu v textu programu) používá se v převážné většině jazyků Dynamická vazba rozsahu platnosti rozsah platnosti definován prováděním programu (až do další deklarace) APL, LISP (starší verze), SNOBOL4 jednoduše implementovatelná v interpretech, nevhodná z hlediska čitelnosti programů a jejich efektivity Př.: p(x) + q(y) - může záležet na pořadí vyhodnocení Tabulka symbolů 11 Doba života proměnné = časový interval, v němž má proměnná přidělenou paměť pro uložení hodnoty (je alokována) Statická alokace před spuštěním programu Dynamická alokace automatická - při vstupu do rozsahu platnosti proměnné provedením příkazu pro vytvoření např. new Tabulka symbolů 12 3

4 Tabulka symbolů Reprezentace pojmenovaných entit explicitně pojmenovaných uživatelem implicitně pojmenovaných standardní entity (typy, funkce, třídy,...), dočasné proměnné Účel: řešení kontextových vazeb (deklarace -> použití) typová kontrola ukládání informací pro generování kódu Tabulka symbolů Interakce s lexikálním analyzátorem ukládání identifikátorů během lexikální analýzy využití kontextových informací Expr -> IdVar Index IdProc Args IdCon PASCAL: P(x,y) kontextově závislá syntaxe Write(x:3,y:2:5) Tabulka symbolů 13 Tabulka symbolů 14 Model programovacího jazyka Program můžeme modelovat obecným grafem, jehož uzly jsou jednotlivé sémantické entity: deklarace typy výrazy příkazy Model programovacího jazyka atributy entit informace dané zdrojovým jazykem (druh entity, jméno, hodnota konstanty,...) informace dané cílovým jazykem (velikost a zarovnání, relativní adresa,...) vztahy mezi entitami agregace (funkce - parametr) asociace (proměnná typ) Tabulka symbolů 15 Tabulka symbolů 16 4

5 Model programovacího jazyka Návrh struktury modelu class Entity { set<attribute> attributes; string name; class Package extends Entity { list<entity> contents; Tabulka symbolů 17 class Class extends Entity { list<variable> fields; list<method> methods; Tabulka symbolů 18 Návrh struktury modelu class Method extends Entity { list<variable> parameters; list<variable> locals; Type returns; Statement body; class Variable extends Entity { Type type; Expr initial; class LocalVariable extends Variable { int index; Tabulka symbolů 19 Funkce tabulky symbolů Operace: init - inicializace insert - vkládání lookup - vyhledávání (častější) Inicializace vytvoření prázdné tabulky naplnění implicitními deklaracemi Tabulka symbolů 20 5

6 Funkce tabulky symbolů Vkládání nejprve vyhledá klíč v tabulce není nalezen vytvoří se nová položka nalezen obvykle chyba deklarace / definice implicitní deklarace (návěští a funkce v C) Vyhledávání vyhledá klíč v tabulce nalezen vrátí odpovídající entitu nenalezen obvykle ohlásí chybu Implementace tabulky symbolů Neseřazené tabulky jen pro malý počet prvků O(n) Seřazené tabulky s binárním vyhledáváním O(log 2 n) pro statické tabulky (např. klíčová slova) Tabulka symbolů 21 Tabulka symbolů 22 Implementace tabulky symbolů Vyhledávací stromy O(n) - O(log 2 n) doba vyhledávání závisí na vyvážení stromu časová náročnost vkládání není kritická optimálně vyvážené stromy příliš komplikované suboptimální řešení např. AVL stromy Implementace tabulky symbolů Tabulky s rozptýlenými položkami mapovací funkce: klíč index řešení kolizí seznamy/stromy synonym rozptylovací funkce: index index rychlost závisí na zaplnění tabulky problematický průchod položkami podle klíče obtížně se řeší přetečení tabulky O(1) Tabulka symbolů 23 Tabulka symbolů 24 6

7 Blokově strukturovaná tabulka Vhodná pro jazyky se zanořenými deklaracemi (hierarchické struktury) Řeší rozsah platnosti a viditelnost jména v zanořených blocích Nové operace: otevření rozsahu platnosti (open) uzavření rozsahu platnosti (close) Blokově strukturovaná tabulka Vkládání pracuje pouze s aktuální úrovní tabulky jména na vyšších úrovních se neuvažují Vyhledávání klíč se vyhledává nejprve v aktuální úrovni, pokud se nenajde, hledá o úroveň výš neúspěch se hlásí až po prohledání nejvyšší úrovně (globální jména) explicitní přístup na globální úroveň ::x Tabulka symbolů 25 Tabulka symbolů 26 Implementace blokově strukturované tabulky symbolů Založena na některé z metod pro nestrukturovanou tabulku vyhledávací stromy tabulky s rozptýlenými položkami Přirozenou datovou strukturou pro reprezentaci hierarchie je ZÁSOBNÍK Úrovně se nemohou překrývat Zásobníková tabulka Položky se ukládají v pořadí deklarací na vrchol zásobníku Druhý zásobník obsahuje odkazy na začátky jednotlivých úrovní Vyhledávání se provádí od konce zásobníku zpět při vkládání pouze na aktuální úrovni Neseřazená tabulka pro malý počet položek Tabulka symbolů 27 Tabulka symbolů 28 7

8 Příklad Kombinace zásobníku a stromu jméno entity 8 y 7 delta 6 max 5 num 4 x 3 fun 2 y 1 x další atributy TOP int x,y; double fun(x,num) { int max; { double delta,y; Každá úroveň je reprezentována stromem Zásobník obsahuje kořenové uzly jednotlivých úrovní Vhodné pro velký počet položek nízká spotřeba paměti (dynamická alokace) index bloku Tabulka symbolů 29 Tabulka symbolů 30 Příklad Kombinace TRP a zásobníku fun x y num x delta y Doplnění jednoduché zásobníkové tabulky o rychlé vyhledávání pomocí TRP Vkládání: deklarace se uloží na konec pole index položky se vloží do TRP Vyhledávání: deklarace se stejným jménem leží ve stejném řetězu synonym vybere se deklarace s nejvyšším indexem Tabulka symbolů 31 Tabulka symbolů 32 8

9 Příklad Jednoúrovňová blokově strukturovaná tabulka jméno entity 8 y 7 delta 6 max 5 num 4 x 3 fun 2 y 1 x další atributy 6 / 8 / / 5 4 TOP Vyhledávací tabulka odkazuje pouze na viditelné deklarace Každá entita obsahuje odkaz na entitu z vyšší úrovně, kterou její deklarace zakrývá informaci o úrovni zanoření proč? Vyhledávání probíhá pouze jednou, paralelně na všech úrovních Kam se ztratil zásobník? TRP synonyma index bloku Tabulka symbolů 33 Tabulka symbolů 34 Příklad Composite diagram tříd delta 2 fun 0 num x max y Tabulka symbolů 35 Tabulka symbolů 36 9

10 Composite diagram objektů Rozhraní tabulky identifikátorů Položka vyhledávací tabulky interface CIdent { string name; // jméno attribute CDecl meaning; // význam ; libovolná vyhledávací struktura vyhledávací strom, TRP,... může ji vytvářet již lexikální analyzátor identita jmen se nahradí identitou objektů Tabulka symbolů 37 Tabulka symbolů 38 Rozhraní tabulky deklarací Deklarace pojmenovaného prvku interface CDecl { // deklarace CIdent ident; // identifikátor CDecl hides; // zakrytá deklarace CBlock parent; // rozsah platnosti Deklarace vytvářející rozsah platnosti (např. třída, funkce,...) interface CBlock { set<cdecl> contents; // obsah void insert(cdecl dcl); // vkládání void removeall(); // uzavření Tabulka symbolů 39 Implementace metod void CBlock::insert(CDecl dcl) { dcl.hides = ident.meaning; ident.meaning = dcl; contents.add(dcl); void CBlock::removeAll() { forall( dcl in contents) { dcl.ident.meaning = dcl.hides; Tabulka symbolů 40 10