2.2.1 Pojmenovací model
Je užitečné mít model toho, jak jsou jména spojena s konkrétními objekty. Návrhář systému vytváří schéma pojmenování, které se skládá ze tří prvků. Prvním prvkem je jmenný prostor, který se skládá z abecedy symbolů spolu se syntaktickými pravidly, která určují, která jména jsou přípustná. Druhým prvkem je algoritmus přiřazování jmen, který spojuje některá (ne nutně všechna) jména jmenného prostoru s některými (opět ne nutně všemi) hodnotami v univerzu hodnot, což je třetí a poslední prvek jmenného schématu. Hodnota může být objekt, nebo to může být jiné jméno buď z původního jmenného prostoru, nebo z jiného jmenného prostoru. Mapování jména na hodnotu je příkladem vazby, a pokud takové mapování existuje, říká se, že jméno je vázáno na hodnotu. Ilustruje to obrázek 2.10.
Ve většině systémů je obvykle současně v provozu několik různých jmenných schémat. Systém může například používat jedno schéma pojmenování pro názvy e-mailových schránek, druhé schéma pojmenování pro internetové hostitele, třetí pro soubory a čtvrté pro adresy virtuální paměti. Když se interpret programu setká s názvem, musí vědět, které schéma pojmenování má vyvolat. Okolí, v němž je jméno použito, obvykle poskytuje dostatek informací k určení schématu pojmenování. Například v aplikačním programu autor tohoto programu ví, že by měl očekávat, že názvy souborů budou interpretovány pouze souborovým systémem a názvy internetových hostitelů budou interpretovány pouze některou síťovou službou.
Interpret, který se setká s názvem, spustí algoritmus mapování názvů příslušného schématu pojmenování. Algoritmus mapování jmen jméno překládá, což znamená, že zjistí a vrátí přiřazenou hodnotu (z tohoto důvodu se algoritmus mapování jmen nazývá také překladač). Algoritmus mapování jmen je obvykle řízen dalším parametrem, známým jako kontext. Pro dané jmenné schéma může existovat mnoho různých kontextů a jedno jméno jmenného prostoru může být mapováno na různé hodnoty, pokud resolver používá různé kontexty. Například když se v běžném diskurzu člověk odvolává na jména “ty”, “tady” nebo “Alice”, význam každého z těchto jmen závisí na kontextu, ve kterém je člověk vyslovuje. Na druhou stranu některá pojmenování mají pouze jeden kontext. Taková pojmenovací schémata poskytují tzv. univerzální jmenné prostory a mají tu příjemnou vlastnost, že jméno má v rámci daného pojmenovacího schématu vždy stejný význam bez ohledu na to, kdo ho používá. Například ve Spojených státech tvoří univerzální jmenný prostor čísla sociálního zabezpečení, která identifikují státní penzijní a daňové účty. Pokud existuje více kontextů, interpret může resolveru sdělit, který z nich má použít, nebo může resolver použít výchozí kontext.
Model pojmenování můžeme shrnout definováním následující konceptuální operace se jmény:
hodnota ← resolve (jméno, kontext)
Když interpret narazí na jméno v objektu, nejprve zjistí, o jaké schéma pojmenování se jedná, a tedy kterou verzi resolve má vyvolat. Poté identifikuje vhodný kontext, v tomto kontextu jméno resolvuje a při pokračování v interpretaci nahradí jméno resolvovanou hodnotou. Proměnná context říká resolve, který kontext má použít. Tato proměnná obsahuje jméno známé jako odkaz na kontext.
V procesoru jsou čísla registrů jmény. V jednoduchém procesoru je množina jmen registrů a registry, ke kterým jsou tato jména vázána, pevně stanovena v době návrhu. Ve většině ostatních systémů, které používají jména (včetně schématu pojmenování registrů některých výkonných procesorů), je možné vytvářet nové vazby a odstraňovat staré, vyjmenovat prostor jmen a získat seznam existujících vazeb a porovnávat dvě jména. Pro tyto účely definujeme další čtyři konceptuální operace:
stav ← bind (jméno, hodnota, kontext)
stav ← unbind (jméno, kontext)
seznam ← enumerate (kontext)
výsledek ← compare (jméno1, jméno2)
První operace mění kontext přidáním nové vazby; výsledek stavu informuje, zda se změna podařila (může selhat, pokud navržené jméno porušuje syntaktická pravidla jmenného prostoru). Po úspěšném volání bind vrátí resolve novou hodnotu jména.*Druhá operace, unbind, odstraní existující vazbu z kontextu, přičemž stav opět hlásí úspěch nebo neúspěch (třeba proto, že žádná taková vazba neexistovala). Po úspěšném volání unbind již resolve nevrátí tuto hodnotu pro name. Operace bind a unbind umožňují používat jména k vytváření spojení mezi objekty a později tato spojení měnit. Návrhář objektu může pomocí jména odkazovat na objekt komponenty, vybrat objekt, ke kterému je toto jméno vázáno, buď tehdy, nebo později voláním bind, a zrušit vazbu, která již není vhodná, voláním unbind, a to vše bez úpravy objektu, který jméno používá. Tato schopnost odkládat a měnit vazby je mocným nástrojem používaným při návrhu téměř všech systémů. Některé implementace pojmenování poskytují operaci enumerate, která vrací seznam všech jmen, která lze v kontextu rozlišit. Některé implementace operace enumerate mohou také vracet seznam všech hodnot, které jsou aktuálně vázány v kontextu. Nakonec operace compare oznámí (true nebo false), zda je jméno1 stejné jako jméno2. Význam slova “stejný” je zajímavou otázkou, kterou se zabývá kapitola 2.2.5 a která může vyžadovat dodání dalších argumentů kontextu.
Různá schémata pojmenování mají různá pravidla pro jedinečnost mapování jmen na hodnoty. Některá pojmenovací schémata mají pravidlo, že jméno musí být v daném kontextu mapováno na přesně jednu hodnotu a hodnota musí mít pouze jedno jméno, zatímco v jiných pojmenovacích schématech může být jedno jméno mapováno na několik hodnot nebo jedna hodnota může mít několik jmen, a to i ve stejném kontextu. Jiným druhem pravidla jedinečnosti je pravidlo jedinečného identifikátoru jmenného prostoru, který poskytuje množinu jmen, která nebudou nikdy znovu použita po celou dobu existence jmenného prostoru a po navázání zůstanou vždy vázána na stejnou hodnotu. O takovém jménu se říká, že má stabilní vazbu. Pokud má jmenný prostor jedinečných identifikátorů také pravidlo, že hodnota může mít pouze jedno jméno, stávají se jedinečná jména užitečná pro sledování objektů po dlouhou dobu, pro porovnávání odkazů, zda se vztahují ke stejnému objektu, a pro koordinaci více kopií v systémech, kde jsou objekty replikovány kvůli výkonu nebo spolehlivosti. Například číslo zákaznického účtu většiny fakturačních systémů představuje jedinečný identifikátor jmenného prostoru. Číslo účtu bude vždy odkazovat na stejný účet zákazníka, dokud tento účet existuje, navzdory změnám adresy, telefonního čísla nebo dokonce osobního jména zákazníka. Pokud je účet zákazníka smazán, číslo účtu tohoto zákazníka nebude jednou znovu použito pro účet jiného zákazníka. Pojmenovaná pole v rámci účtu, například splatný zůstatek, se mohou čas od času měnit, ale vazba mezi číslem zákaznického účtu a účtem samotným je stabilní.
Algoritmus mapování jmen plus jeden kontext nemusí nutně mapovat všechna jména jmenného prostoru na hodnoty. Proto může být možným výsledkem provedení resolve výsledek nenalezení, který může resolve sdělit volajícímu buď jako rezervovanou hodnotu, nebo jako výjimku. Na druhou stranu, pokud jmenné schéma umožňuje mapovat jedno jméno na několik hodnot, může být možným výsledkem seznam hodnot. V takovém případě může operace unbind vyžadovat další argument, který určuje, která hodnota má být unbindována. A konečně, některá schémata pojmenování umožňují zpětné vyhledávání, což znamená, že volající může zadat hodnotu jako argument algoritmu mapování jmen a zjistit, jaké jméno nebo jména jsou s touto hodnotou svázána.
Obrázek 2.10 znázorňuje model pojmenování a ukazuje prostor jmen, odpovídající univerzum hodnot, algoritmus mapování jmen a kontext, který řídí algoritmus mapování jmen.
V praxi se lze setkat se třemi často používanými algoritmy mapování jmen:
Tabulkové vyhledávání
■
Rekurzivní vyhledávání
■
Vícenásobné vyhledávání
Nejběžnější implementací kontextu je tabulka dvojic {jméno, hodnota}. Pokud je implementací kontextu tabulka, je algoritmus přiřazování jmen pouze vyhledáváním jmen v této tabulce. Samotná tabulka může být složitá, může zahrnovat hashování nebo B-stromy, ale základní myšlenka je stále stejná. Vazba nového jména na hodnotu spočívá v přidání této dvojice {jméno, hodnota} do tabulky. Obrázek 2.11 znázorňuje tuto běžnou implementaci modelu pojmenování. Pro každý kontext existuje jedna taková tabulka a různé kontexty mohou obsahovat různé vazby pro stejné jméno.
Reálných příkladů obecného pojmenovacího modelu i implementace tabulkového vyhledávání je mnoho:
Telefonní seznam je kontext tabulkového vyhledávání, který váže jména osob a organizací na telefonní čísla. Stejně jako v příkladu datové komunikační sítě jsou telefonní čísla sama o sobě jmény, která telefonní společnost převádí na fyzické podoby linek pomocí algoritmu mapování jmen, který zahrnuje kódy oblastí, ústředny a fyzické ústředny. Telefonní seznamy pro Boston a San Francisco jsou dva kontexty stejného schématu pojmenování; konkrétní jméno se může objevit v obou telefonních seznamech, ale pokud ano, je pravděpodobně vázáno na různá telefonní čísla.
Malá celá čísla pojmenovávají registry procesoru. Hodnotou je samotný registr a mapování ze jména na hodnotu se provádí pomocí zapojení.
Paměťové buňky jsou podobně pojmenovány čísly, která se nazývají adresy, a mapování ze jména na hodnotu se opět provádí pomocí zapojení. Kapitola 5 popisuje mechanismus přejmenování adres známý jako virtuální paměť, který váže bloky virtuálních adres na bloky sousedících paměťových buněk. Pokud systém implementuje více virtuálních pamětí, je každá virtuální paměť samostatným kontextem; daná adresa může odkazovat na jinou paměťovou buňku v každé virtuální paměti. Paměťové buňky mohou být také sdíleny mezi virtuálními paměťmi; v takovém případě může mít stejná paměťová buňka stejné (nebo různé) adresy v různých virtuálních pamětech, jak je určeno vazbami.
Typický souborový systém počítače používá několik vrstev názvů a kontextů: diskové sektory, diskové oddíly, soubory a adresáře jsou pojmenované objekty. Adresáře jsou příkladem kontextů s vyhledáváním v tabulkách. Konkrétní název souboru se může vyskytovat v několika různých adresářích, vázaných buď na stejné, nebo na různé soubory. V části 2.5 je uvedena případová studie pojmenování v souborovém systému unix.
Počítače se připojují k datovým komunikačním sítím v místech známých jako body připojení k síti. Body připojení k síti se obvykle pojmenovávají pomocí dvou různých schémat pojmenování. První z nich, používané uvnitř sítě, zahrnuje jmenný prostor sestávající z čísel v poli pevné délky. Tyto názvy jsou vázány, někdy trvale a někdy pouze krátkodobě, na fyzické vstupní a výstupní body sítě. Druhé jmenné schéma, používané klienty sítě, mapuje uživatelsky přívětivější univerzální jmenný prostor znakových řetězců na jména prvního jmenného prostoru. Kapitola 4.4 je případovou studií systému doménových jmen, který poskytuje uživatelsky přívětivé pojmenování přípojných bodů pro internet.
Programátor identifikuje proměnné procedury pomocí jmen a každá aktivace procedury poskytuje odlišný kontext, v němž je většina takových jmen řešena. Některá jména, označená jako “statická” nebo “globální jména”, mohou být místo toho přeložena v kontextu, který je sdílen mezi aktivacemi nebo mezi různými procedurami. Při kompilaci procedury mohou být některé z původních uživatelsky přívětivých názvů proměnných nahrazeny celočíselnými identifikátory, které jsou pro stroj pohodlnější pro manipulaci, ale model pojmenování stále platí.
Uniform Resource Locator (URL) World Wide Webu je mapován na konkrétní webovou stránku poměrně složitým algoritmem, který rozkládá URL na několik složek a tyto části překládá pomocí různých schémat pojmenování; výsledek nakonec identifikuje konkrétní webovou stránku. Případovou studií tohoto schématu pojmenování je oddíl 3.2.
Systém účtování zákazníkům obvykle udržuje nejméně dva druhy názvů pro každý zákaznický účet. Číslo účtu pojmenovává účet v jedinečném jmenném prostoru identifikátoru, ale existuje také odlišný jmenný prostor osobních jmen, který lze rovněž použít k identifikaci účtu. Obě tato jména jsou obvykle databázovým systémem mapována na záznamy o účtu, takže účty lze vyhledávat buď podle čísla účtu, nebo podle osobního jména.
Tyto příklady také zdůrazňují rozdíl mezi “pojmenováním” a vazbou. Některé, ale ne všechny kontexty “pojmenovávají” věci v tom smyslu, že mapují jméno na objekt, který je běžně považován za objekt s tímto jménem. Telefonní seznam tedy “nepojmenovává” ani lidi, ani telefonní linky. Někde jinde existují kontexty, které vážou jména k lidem a které vážou telefonní čísla ke konkrétním fyzickým telefonům. Telefonní seznam váže jména lidí na jména telefonů.
.