Vyšlo v týdeníku Computerworld č. 23/93 v roce 1993
Vytištěno z adresy: http://www.earchiv.cz/a93/a323c110.php3

Virtuální terminály

Praktická implementace vzdáleného přihlašování a vzdálených terminálových relací, kterými jsme se zabývali minule, naráží na nemalé problémy. Podívejme se nejprve, v čem je podstata těchto problémů, a pak si ukažme, jaké jsou možnosti jejich řešení.

Dnešní počítačový svět není homogenní. Byl, je a zřejmě vždy bude obydlen výpočetními systémy, které vychází z odlišných filosofií, používají odlišné přístupy a metody, technologie a techniky, a v důsledku toho nejsou nikdy zcela kompatibilní. Snahy o co největší "otevřenost" však vedou alespoň k tomu, že různé systémy spolu dokáží rozumným způsobem spolupracovat. Tendence ke vzájemnému sbližování, zajišťovaná dodržováním společných standardů, se však neprosazuje ve všech oblastech stejně snadno.

Každý terminál je jiný

Oblastí, která je vůči všeobecnému trendu ke standardizaci snad nejvíce imunní, je právě výroba terminálů. Jednotliví výrobci se totiž doslova předhání v tom, jakými schopnostmi dokáží své výrobky vybavit. To by samo o sobě bylo jistě velmi vítané, ale háček je v tom, že neexistuje všeobecný konsensus o tom, jak to konkrétně dělat. Na obzoru není žádný všeobecně uznávaný a závazný standard (standard de jure), který by říkal, co všechno má takový terminál umět, jak přesně má fungovat a jak se má konkrétně ovládat. Místo toho si každý výrobce řeší věci po svém, a tak vznikají pouze standardy de facto, které svými výrobky vytvářejí nejrenomovanější výrobci, a ostatní výrobci se jim pak ve vlastním zájmu přizpůsobují. I tak se ale mohou dosti podstatně lišit i různé druhy terminálů od jednoho a téhož výrobce.

Zkusme si nyní naznačit, v čem mohou rozdíly mezi jednotlivými terminály spočívat.

Největší rozdíly mohou být již v samotné koncepci terminálu a "míře inteligence", kterou je vybaven. Z tohoto pohledu se terminály obvykle rozdělují do tří skupin, na tzv. znakové (někdy též: řádkové terminály, anglicky: scroll mode terminals), na stránkové (page mode terminals) a formulářové (form mode terminals).

Znakový terminál je nejjednodušším typem, a je charakteristický tím, že neumí pohybovat kurzorem nahoru a dolů po obrazovce. Jeho displej se chová obdobně jako tiskárna - každý znak je vytisknut (zobrazen) tam, kde se právě nachází kurzor, a ten je následně posunut doprava na následující pozici. Pokud by přitom přešel přes pravý okraj řádky, je přesunut na začátek řádky nové, a pokud by pro tuto novou řádku již nebylo na displeji místo, jsou všechny právě zobrazované řádky odrolovány (anglicky: scrolled) směrem nahoru. Znakový terminál tedy neumožňuje "vrátit" se zpět (posunout kurzor) na dříve zobrazenou řádku (ale obvykle umožňuje pohybovat kurzorem zpět v rámci dané řádky). Pro ovládání znakového terminálu jsou pak zapotřebí příkazy typu: zobraz znak (na pozici kurzoru, s následným posunutím kurzoru na další pozici), přejdi na novou řádku, případně: vrať kurzor o jednu pozici zpět (v rámci dané řádky), vymaž znaky od kurzoru do konce řádky apod.

Při určitém zjednodušení si lze představit, že znakový terminál má jen jednu jedinou řádku (zatímco na displeji je zobrazováno ještě několik "předchozích" řádek, které ale již nejsou jinak přístupné).

Naproti tomu u stránkového (page mode) terminálu si můžeme představit, že jeho displej reprezentuje dvojrozměrné pole o n řádcích a m sloupcích, a kurzor lze nastavit na libovolnou pozici v tomto dvojrozměrném poli.

Díky této možnost je pak možné pohybovat kurzorem všemi směry, a na rozdíl od znakového terminálu je již možné implementovat na stránkovém terminálu například celoobrazovkové (full-screen) editory a další aplikace, které pohyb kurzoru všemi směry vyžadují. Z pohledu ovládání pak přibývají u stránkového terminálu nezbytné příkazy pro nastavování pozice kurzoru.

Formulářový terminál je ještě "chytřejším" typem terminálu. U něj si můžeme představit, že místo jednoho dvojrozměrného pole se jeho displej dokáže chovat jako několik (menších) jedno a dvojrozměrných polí. Ty pak můžeme interpretovat jako navzájem disjunktní "políčka" formuláře, se kterými se pracuje nezávisle na sobě (tj. která se samostatně vyplňují). Formulářový terminál pak obvykle umožňuje definovat strukturu "formuláře": stanovit počet, velikost, dimenzi a druh jednotlivých polí, způsob jejich zobrazení na displeji (včetně doplnění vysvětlujícím textem) atd.

I v rámci jedné a téže kategorie (např. znakových terminálů) se však jednotlivé druhy terminálů mohou výrazně lišit, a to ve dvou základních směrech:

  • v konkrétních parametrech a dílčích schopnostech. Rozdílný může být například počet znakových pozic na řádce, počet zobrazovaných řádek, schopnost používat alternativní sady znaků a různé efekty při jejich zobrazování (podtržený text, tučné písmo, písmo dvojnásobné výšky, šířky apod.)

  • v konkrétním způsobu ovládání. Některé terminály například očekávají, že konec řádky bude vyznačen dvojicí znaků CR a LF, zatímco jiné znaky očekávají pouze znak CR, a ještě jiné pak pouze znak LF. Odlišné bývají i nejrůznější další řídící znaky, například pro nastavení kurzoru na zadanou pozici (u stránkových terminálů) či jeho posun na předchozí pozici, i samotný efekt jimi vyvolaných akcí (zda se např. při posunu kurzoru o jednu pozici zpět žádný znak nemaže, či naopak ano). Pokud terminál "umí" různé další efekty, jako například podtrhovat, psát tučně, používat jinou znakovou sadu apod., tyto jeho schopnosti se obvykle ovládají celými posloupnostmi řídících znaků (označovanými také jako tzv. escape sekvence). Snad u každého terminálu jsou ale jiné.

Terminálová emulace

Pro správné pochopení všech problémů kolem používání terminálů je vhodné si také naznačit něco o jejich vývoji. Historicky nejstarším typem terminálu bylo vlastně dálnopisné zařízení (anglicky: teletype), které místo dnešního displeje mělo tiskárnu. Každý znak, zadaný z klávesnice, byl okamžitě odeslán druhé straně, a každý znak, který od druhé strany přišel, byl ihned vytisknut. Dalším vývojovým stádiem již byly znakové terminály, namísto tiskárny vybavené displejem. Stále však to byla jednoúčelová zařízení, schopná fungovat právě a pouze jako terminál. Postupným vývojem získávaly tyto terminály nové a nové schopnosti, ze znakových se staly stránkové a posléze i formulářové terminály, ale svou jednoúčelovou povahu si držely stále.

V poslední době, zvláště pak s masovým nástupem počítačových sítí, se však začíná používat i jiné řešení: terminálová emulace (terminal emulation). Vše je postaveno na myšlence, že místo jednoúčelového zařízení s pevně danou funkcí se použije zařízení univerzální, které se pouze bude chovat stejně jako jednoúčelový terminál (bude jej tzv. emulovat, odsud: emulace). Vhodným kandidátem na tuto funkci je osobní počítač, který není obtížné naprogramovat tak, aby věrně napodoboval chování v podstatě jakéhokoli terminálu.

Výhodou terminálové emulace není jen její flexibilita - tedy schopnost přizpůsobit se podle potřeby vlastnostem více různých terminálů. Další výhodou je i to, příslušné univerzální zařízení (osobní počítač) může vystupovat v roli emulovaného terminálu jen v době, kdy si to jeho uživatel přeje, zatímco v ostatní době může sloužit jiným účelům. Aplikační programy, zajišťující emulaci terminálů, také obvykle umožňují otevírat více terminálových relací současně - jak jsme si ostatně již naznačovali v minulém dílu.

Zajímavé jsou pak i ekonomické ukazatele. Díky dnešní masové výrobě osobních počítačů se jejich cena stala srovnatelnou s cenou jednoúčelových terminálů.

Jak se s různorodostí vyrovnat

Již v minulém dílu jsme si naznačili jednu velmi důležitou skutečnost: ve víceúlohovém prostředí na počítači, vybaveném více terminály, nemohou jednotlivé úlohy předem znát, se kterým terminálem budou v rámci terminálových relací skutečně pracovat. Konkrétní typ všech terminálů daného počítače sice může být předem znám, ale připustíme-li možnost vzdálených terminálových relací, uskutečňovaných prostřednictvím počítačové sítě, není již možné předpokládat prakticky nic.

Jednotlivé aplikace, které v rámci terminálových relací pracují s terminály, je však nutně musí umět ovládat. Musí vědět, co všechno terminál "umí", jaké znaky je schopen přijímat a zobrazovat, s jakými řídícími znaky pracuje, jak mají být zakončovány jednotlivé řádky, jaké používá řídící sekvence apod.

Každá aplikace si samozřejmě může předepsat, že chce pracovat jen s takovým a takovým typem terminálu, a tomu se plně přizpůsobit. To je ale příliš omezující vůči uživatelům, kteří disponují jinými terminály, zvláště pak v prostředí sítí. Stejně tak není dost dobře možné, aby se jednotlivé úlohy přizpůsobovaly určitému konkrétnímu repertoáru terminálů - vždy se totiž najde někdo, kdo bude chtít používat ještě jiný terminál, a navíc: nové druhy terminálů, s novými schopnostmi, dokonalejšími vlastnostmi a hlavně odlišnými způsoby ovládání neustále vznikají.

Podstata virtuálních terminálů

Vzájemné přizpůsobení všech aplikací všem možným terminálům tedy není dost dobře možné (a nebylo by jistě ani příliš rozumné). Jaká je ale jiná možnost?

V podstatě jedinou schůdnou alternativou je vytvořit jednotný mezistupeň, a přizpůsobení typu "každý s každým" nahradit mnohem schůdnější variantou, při které se všechny aplikace přizpůsobují jednotnému mezistupni, kterému se na druhé straně přizpůsobují i všechny konkrétní terminály. Jak ale správně interpretovat zmíněný mezistupeň?

Z pohledu aplikací jde vlastně o terminál, který se vždy "tváří" stejně - tedy který má vždy stejné schopnosti, stejné vlastnosti, a stejný způsob ovládání. Ve skutečnosti však nejde o fyzické zařízení, ale například jen o určité konvence (formát dat a příkazů), či o objekt programové povahy (např. nějakou datovou strukturu), který skutečný terminál pouze zastupuje. Proto se také společnému mezistupni říká virtuální terminál (virtual terminal).

V prostředí počítačových sítí a vzdálených terminálových relací pak není problémem, aby se společnému mezistupni (virtuálnímu terminálu) přizpůsobily i jednotlivé konkrétní terminály. Vzpomeňme si na minulý díl, kdy jsme si ukazovali, jak všechny vstupy a výstupy z konkrétního terminálu na daném počítači zpracovává "úloha telnet", a dále je posílá po sítí do vzdáleného počítače. Není jistě těžké vytvořit tuto "úlohu telnet" tak, aby zajišťovala potřebné přizpůsobení konkrétního terminálu terminálu virtuálnímu.

Parametrický model virtuálního terminálu

Hlavním problémem právě naznačeného mechanismu je nalezení takové konkrétní formy (modelu) virtuálního terminálu, která by dokázala "pokrýt" co nejširší spektrum různých terminálů, ale současně umožňovala co nejlépe využít jejich nejrůznějších schopností. Tedy takového modelu, který by neomezoval "individualitu" jednotlivých terminálů více, než je opravdu nezbytně nutné.

Nejjednodušším modelem virtuálního terminálu je tzv. parametrický model. Zde si můžeme představit, že virtuální terminál je reprezentován tabulkou, která má pevně daný počet položek i pevně daný význam těchto položek. Tyto položky přitom mohou obsahovat například údaj o tom, kolik znakových řádek má displej terminálu, kolik znakových pozic je na jedné řádce, zda terminál očekává zakončení každé řádky dvojicí CR a LF apod. Dále zde mohou být příkazy (escape sekvence)pro ovládání nejrůznější efektů a možností (např. podtrhování, tučné písmo apod.), nastavování kurzoru (u stránkových terminálů) atd.

Vlastní aplikace se pak přizpůsobuje společnému mezistupni (virtuálnímu terminálu) tím, že skutečný terminál ovládá pouze "prostřednictvím" této tabulky. Jestliže například potřebuje nastavit kurzor na určitou pozici, najde si na příslušném místě v tabulce konkrétní řídící příkaz, a ten pak zadá terminálu. Konkrétní terminál se zase přizpůsobuje virtuálnímu terminálu tak, že jeho předem definované položky naplní konkrétnímu údaji, které přesně definují jeho vlastnosti a způsob ovládání.

Právě naznačený mechanismus se ve své nejobecnější podobě prosadil v BSD Unixu. Zde je výše naznačených tabulek více - po jedné pro každý druh terminálu, který daný operační systém zná - a jsou všechny sdruženy do jedné databáze, označované jako termcap (což je zkratka od: terminal capabilities). Aplikace, která chce korektním způsobem pracovat s terminálem, si nejprve musí zjistit, o jaký konkrétní druh terminálu se jedná. Pak si z databáze termcap "přečte" odpovídající tabulku, a příslušný terminál ovládá prostřednictvím příkazů (escape sekvencí), které v této tabulce najde. Správce systému přitom může databázi termcap doplňovat, a tím rozšiřovat repertoár terminálů, se kterými budou aplikace schopny plnohodnotně pracovat.

Za zvláštní případ parametrického modelu můžeme považovat takovou situaci, kdy bude pevně dána nejen struktura položek tabulky a jejich význam, ale bude pevně dán také jejich obsah. Tato představa odpovídá tomu, že konkrétní způsob ovládání virtuálního terminálu je fixován, po síti jsou přenášeny vždy stejné řídící příkazy, a potřebné přizpůsobení je zajišťováno až v místě, kde je připojen skutečný terminál ("úlohou telnet" z minulého dílu). Právě tato varianta je použita v síťovém modelu TCP/IP.

Objektový model virtuálního terminálu

Parametrický model je použitelný pro znakové, a do značné míry i pro stránkové terminály. Pro formulářové terminály je ovšem zapotřebí poněkud obecnější model, kterým je model objektový. Ten si můžeme představit opět jako určitou tabulku, definující schopnosti konkrétního terminálu - v případě objektového modelu je ale tato tabulka označována jako profil. Kromě profilu ovšem tvoří virtuální terminál i obecnější datová struktura (objekt), která funguje jako vyrovnávací paměť mezi aplikací a terminálem. Aplikace, která chce něco zobrazit na displeji terminálu, to jednoduše zapíše do zmíněné datové struktury, a o další se již nestará. Je pak na skutečném terminálu (resp. jeho ovladači), aby obsah této datové struktury průběžně zobrazoval.

Zmíněná datová struktura přitom zdaleka nemusí být jen dvojrozměrné pole, reprezentující znakové pozice skutečného displeje. Například u formulářového terminálu to mohou být jednotlivá dílčí pole, představující části formuláře, a jiná část datové struktury zase může definovat, jak mají být jednotlivá pole "poskládána" na skutečném displeji.

Tímto mnohem obecnějším způsobem jsou pak řešeny virtuální terminály v rámci referenčního modelu ISO/OSI.