Vyšlo na www.mediaserver.cz dne 1. července 1997
Vytištěno z adresy: http://www.earchiv.cz/axxxk160/a706k164.php3

JVM

Java Virtual Machine: Označení pro jednotné prostředí, ve kterém jsou provozovány applety jazyka Java. Toto jednotné prostředí zahrnuje vlastnosti a chování procesoru, hospodaření s pamětí, vstupy a výstupy, základní grafické a zobrazovací schopnosti, a pamatuje i na otázky bezpečnosti a další aspekty běhu appletů. Jde tedy o prostředí, které odpovídá celému počítači, který ale nemá žádný reálný vzor, a musí být předstírán (proto je označován jako virtuální). Dnes je na nejrůznějších platformách předstírán (emulován) programovými prostředky, což mj. znamená, že jednotlivé instrukce appletů jsou zde tzv. interpretovány. Do budoucna však lze počítat i s faktickou realizací tohoto počítače hardwarovými prostředky (zejména jeho procesorové části).

Ve světě počítačů je poměrně snadné něco předstírat: příkladem může být předstírání větší paměti, než jakou je počítač ve skutečnosti vybaven – kde by byly dnešní osobní počítače, jejich operační systémy a náročné aplikace bez mechanismů stránkování a tzv. odkládacích souborů (swap files), které dokáží vytvořit iluzi dostatečně velké paměti, navíc uspořádané takovým způsobem, že si každá aplikace může myslet, že má celou paměť jen a jen pro sebe. Ne bezdůvodně je takováto paměť označována přívlastkem "virtuální" (ve smyslu: předstíraná).

Jiným příkladem úspěšného předstírání ve světě počítačů může být způsob práce s takovými periferiemi, které nelze sdílet, ale které ve víceúlohovém či víceuživatelském prostředí chce využívat více úloh současně. Jde například o tiskárnu, na kterou skutečně nemůže posílat své výstupy více úloh najednou – vždyť by pak došlo k nesmyslnému promíchání jednotlivých znaků, které tyto úlohy chtějí tisknout. Řešením je v tomto konkrétním případě mechanismus tzv. spoolingu, který každé úloze dokáže přidělit její vlastní, byť předstíranou (virtuální) tiskárnu, a poté korektním a koordinovaným způsobem vytisknout dokončené tiskové sestavy na skutečné, fyzicky nesdílitelné tiskárně. Ještě dalším příkladem úspěšného předstírání pak mohou být nejrůznější druhy simulací a emulací, které mohou například předstírat jiný druh procesoru, než jakým je daný počítač skutečně osazen.

Všechny tyto techniky předstírání se přitom týkají jednotlivých komponent počítačových systémů, a mají za cíl předstírat jejich existenci, resp. měnit některé jejich vlastnosti, chování, velikost atd. Zajímavou otázkou je ale to, zda by mělo smysl podobným způsobem předstírat úplně celý počítač, se vším všudy – včetně procesoru, paměti i vstupně/výstupních zařízení.

Jednou možnou motivací pro takovýto krok může být snaha provozovat programy, určené pro jeden druh počítače (včetně práce s pamětí a periferiemi), na počítači jiném. Například provozovat hry pro oblíbené ZX Spectrum na běžném PC (k tomuto účelu slouží emulátory ZX Spectra na PC). Další možnou motivací může být snaha vytvořit jednotné pracovní prostředí všem úlohám a aplikacím, které mají být provozovány na určitém konkrétním typu počítače (resp. jedné konkrétní platformě) – příkladem může být operační systém VM (od: Virtual Machine), vyvinutý pro střediskové počítače (mainframy) firmy IBM. Konečně další možnou motivací je snaha zajistit takovéto jednotné pracovní prostředí na počítačích různých typů, neboli na různých platformách. A právě to potřebuje k naplnění svého poslání jazyk Java a jeho applety (i servlety).

Jedním ze základních cílů jazyka Java je jeho nezávislost na konkrétní platformě – programy napsané v tomto jazyku (ať již ve formě appletů či servletů) by měly běžet přesně stejným způsobem na kterékoli platformě (která jazyku Java vychází vstříc). To ale znamená, že na všech takovýchto platformách musí být javovským appletům a servletům předstíráno stejné prostředí, odpovídající celému virtuálnímu počítači: od předstíraného procesoru, včetně jeho sestavy registrů, souboru instrukcí, způsobů adresování, přes organizaci operační paměti, až po "styk s okolím" prostřednictvím vstupně výstupních zařízení (zejména pro potřeby zobrazování). V konkrétním případě Javy se nešlo cestou převzetí či přizpůsobení nějakého již existujícího typu počítače – místo toho byl vytvořen koncept zcela nový, odpovídající počítači který zatím "existuje pouze na papíře". V praxi to pak znamená, že takovýto Javovský počítač musí být na reálných počítačích předstírán, a proto si také on zaslouží přezdívku "virtuální" – v angličtině tedy jeho plné jméno zní "Java Virtual Machine", zkratkou JVM (doslova: Javovský virtuální stroj).

V současné době je "Java Virtual Machine" na nejrůznějších platformách předstírán prostřednictvím programových prostředků, tj. emulací. To znamená, že příslušnou iluzi "Javovského virtuálního počítače" vytváří program, běžící na dané hostitelské platformě, a uzpůsobený specificky pro tuto platformu. Tento emulační program pak jako svůj vstup dostává program, přeložený do cílového (strojového) kódu "Javovského virtuálního počítače" (což je tzv. Javovský byte kód, obsažený v souborech s příponou .class), a předstírá jejich provádění - což po věcné stránce znamená, že jednotlivé instrukce tzv. byte kódu interpretuje. Právě v tomto smyslu je tedy Java interpretovaným jazykem. Alternativou je tzv. just-in-time kompilace, kterou jsme se zabývali v jednom z předchozích dílů této rubriky.

Program, který emuluje chování "Javovského virtuálního počítače", je dnes typicky zabudováván do nejrůznějších WWW browserů (které pak díky tomu dokáží provádět "uvnitř sebe sama" Javovské applety). Stejně tak ale může být příslušný emulátor zcela samostatným programem, který není nijak vázán na žádný WWW browser.

Do budoucna bude častou alternativou k předstírání "Javovského virtuálního počítače" prostřednictvím programové emulace jeho faktická hardwarová realizace – to se týká především samotného Javovského procesoru, na jehož vývoji (v podobě tzv. Javovských čipů) se již pilně pracuje. Podstatné zde bude zejména zrychlení, vyplývající z přímého provádění Javovského byte kódu (který je zatím interpretován).

Pokud jde o konkrétní architekturu procesoru "Javovského virtuálního počítače" (tj. o architekturu Javovského čipu), pak tato je poměrně jednoduchá. Předpokládá minimum registrů (4 včetně čítače instrukcí), a na rozdíl od většiny stávajících procesorů (orientovaných na práci s registry) se důsledně orientuje na práci se zásobníkem – veškeré operandy i výsledky operací jsou umisťovány na zásobník, a nikoli do registrů. Zajímavou odlišností například od Intelských mikroprocesorů je používání konvence zvané Big Endian: zatímco Intelské procesory umisťují vícebytové struktury do paměti tak, že vyšší (významnější) byty jsou na číselně vyšších adresách (což odpovídá konvenci zvané Little Endian), Javovský procesor umisťuje jednotlivé byty v opačném gardu (jako to dělají např. procesory firmy Motorola).

Pro úplnost je ještě vhodné dodat, že celá architektura Javovského procesoru, který tvoří základ "Javovského virtuálního počítače", je 32-bitová, což znamená že i jednotlivé registry jsou 32-bitové, a jsou tudíž schopné adresovat až 4 gigabyty paměti. Celá koncepce "Javovského virtuálního počítače" pak kromě procesoru zahrnuje i konkrétní představu o hospodaření s pamětí (na principu haldy a tzv. garbage collectoru, tj. applety samy explicitně neuvolňují paměť). Pamatováno je i na otázky bezpečnosti a její dodržování, a na základní zobrazovací ("okenní") funkce. Zcela záměrně naopak není pamatováno na přístup Javovského virtuálního počítače k místním souborům a dalším obdobným zdrojům svého reálného hostitelského počítače (z důvodů bezpečnosti).


Další zdroje informací:
Přesnou specifikaci Java Virtual Machine lze nalézt na WWW serveru firmy Sun.