Vyšlo na www.mediaserver.cz dne 10. června 1997
Vytištěno z adresy: http://www.earchiv.cz/axxxk160/a706k161.php3

JIT

JIT (Just-In-Time): v souvislosti s jazykem Java způsob práce s applety na cílové platformě, v rámci uživatelova browseru. Spočívá v tom, že tzv. mezikód (též: byte kód) je místo interpretování nejprve přeložen a ihned poté spuštěn. K překladu přitom dochází až při prvním konkrétním požadavku na volání příslušné části mezikódu, odsud překlad "just in time" (ve smyslu: "na poslední chvíli").

Osobně velmi nerad dělám věci až na poslední chvíli, protože to znamená pracovat pod neúprosným tlakem časových limitů, a tudíž většinou ve stresu, kterému často jde na vrub i kvalita výsledného díla (alespoň pokud jde o psaní článků). Jsou ovšem i takové oblasti lidské činnosti, pro které je "dělání věcí na poslední možnou chvíli" kýženou metou, ke které je záhodno směřovat. Příkladem může být výroba a následná distribuce: pokud se zde dělají věci "do foroty", pak to sice umožňuje jednoduchým způsobem optimalizovat výrobní kapacity a dosáhnout jejich rovnoměrného vytížení, ale na druhé straně to vyžaduje existenci nejrůznějších skladovacích kapacit, které by vyrovnaly časové rozdíly mezi okamžikem dokončení výroby a okamžikem odběru zboží koncovým odběratelem. Možnost výroby "na poslední chvíli", tak aby vše bylo dokončeno přesně v okamžiku kdy to odběratel chce převzít, by umožnila zcela eliminovat tyto drahé skladovací kapacity. Háček je ale v tom, že dosáhnout takovéhoto stavu není vůbec jednoduché, zejména po organizační stránce (i stránce "plánování"), a také to nemusí vést na rovnoměrné vytížení výrobních kapacit. V praxi proto může být optimální řešení někde uprostřed mezi výrobou "do foroty", a výrobou "přesně na čas", pro kterou se v angličtině vžil přívlastek "just in time".

Ve světě počítačů se přívlastek "just in time" začal používat v souvislosti s jazykem Java a s programy, které jsou psány v tomto jazyce, jsou "přibalovány" k WWW stránkám a prováděny přímo u uživatelů (jako tzv. applety). Jelikož není předem známo, na jaké výpočetní platformě bude uživatel spouštět tyto applety (a jelikož mu autoři Javy nechtěli nadiktovat, že to musí být nějaká konkrétní platforma, například pouze MS Windows), jsou applety jazyka Java řešeny tak, aby mohly být prováděny na různých platformách. Konkrétně to znamená, že nejsou tzv. kompilovány, neboli překládány do takového tvaru (tzv. binárního tvaru, či strojového kódu), který je specifický pro určitý typ procesoru a operačního systému (například pro procesory Intel a MS Windows), a který může být v tomto prostředí přímo spuštěn a proveden. Místo toho jsou Javovské applety tzv. interpretovány – což znamená, že jsou napsány ve tvaru, který není vázán na žádné specifické prostředí, a je ve své podstatě pouze specifikací toho, co má být uděláno. Na cílové platformě se takto koncipovaný program dostává "do rukou" jinému programu (tzv. interpreteru), který postupně zpracovává jednotlivé požadavky – konkrétně tak, že si vždy domyslí (interpretuje), co každý jednotlivý požadavek obnáší, a pak požadované aktivity zajistí takovými prostředky, jaké má on sám k dispozici. Konkrétně v případě jazyka Java a jeho appletů je interpretující program součástí ucelenějšího prostředí, kterému se říká Java Virtual Machine (to proto, že kromě interpretace zajišťuje appletům i jednotné "pracovní prostředí" týkající se například hospodaření s pamětí apod.).

Obecnou výhodou interpretace (oproti kompilaci) je nezávislost interpretovaných programů na konkrétní platformě (specifické pro konkrétní platformu jsou až interpretující programy, tj. interpretry). Právě díky interpretaci pak Java dosahuje své nezávislosti na konkrétní platformě, zatímco například alternativní technologie ActiveX firmy Microsoft pracuje s malými programy (tzv. Active X Controls), které jsou kompilovány do cílového kódu, a tudíž jsou pevně vázány na příslušnou platformu. Nevýhodou interpretace pak je nižší rychlost v provádění toho, co má být provedeno: konkrétní hodnoty rozdílů sice velmi závisí na druhu činností, ale obecně může jít až třeba o dvacetinásobný rozdíl v rychlostech. A to už je opravdu hodně, dost na to aby se hledaly cesty jak takovýto výrazný rozdíl zmenšit.

Pro správné pochopení dvou hlavních řešení, které se již používají resp. rýsují na obzoru, je třeba si nejprve poněkud poopravit výše naznačenou představu o způsobu interpretace appletů psaných jazyku Java. Bylo by totiž chybou myslet si, že jednotlivé applety cestují po síti až ke koncovým uživatelům ve svém zdrojovém tvaru, přesně v takové podobě v jaké je jejich autor napsal (tj. v jazyku Java, který koncepčně vychází z jazyka C++), a že to je tento zdrojový tvar, který je na cílových platformách interpretován. Ve skutečnosti jsou i Javovské applety svým autorem nejprve "prohnány" skrz překladač, tj. přeloženy. Ovšem nikoli do takového tvaru, ve kterém by již mohly být na nějaké konkrétní platformě přímo spuštěny, ale pouze do určitého mezitvaru, který usnadňuje jejich přenos a následnou interpretaci na různých platformách. Tento mezitvar, kterému se říká "byte code", je stále ještě nezávislý na konkrétní platformě. Mimochodem, podobné řešení s "mezitvarem" se s oblibou používá i uvnitř klasických překladačů: ty také nejprve přeloží zdrojový tvar programu do svého mezitvaru, a teprve z něj je pak vytvářen (generován) spustitelný kód. Zde, v případě Javy, tento poslední krok chybí: místo generování spustitelného kódu z mezitvaru se vezme přímo tento mezitvar, přenese se po síti (v rámci WWW stránek), a zde je vhodným interpreterem (zabudovaným do prostředí Java Virtual Machine) interpretován.

První možný přístup k tomu, jak výrazně zrychlit interpretaci byte kódu na cílových platformách, je zabudovat potřebný interpret do hardwaru. Lze se na to dívat také tak, že se vyvine nový druh procesoru, který bude jako svůj "nativní jazyk" (strojový kód) mít přímo zmíněný byte kód Javy a bude schopen jej přímo provádět (a ne pouze interpretovat). Firma Sun již ohlásila své čipy jménem Microjava a PicoJava, které by měly právě takto fungovat.

Druhým možným přístupem ke zrychlení interpretace javovského byte kódu je kompilace – tedy myšlenka nenechat mezikód na cílové platformě interpretovat, ale bezprostředně po jeho "příchodu" ho nejprve přeložit do takového tvaru, jaký je na dané platformě přímo spustitelný, a pak jej také spustit. Efekt bude největší pro opakované činnosti, například pro cykly: kompilace přímo na cílové platformě sice nějakou dobu trvá, ale výsledný kód je pak opravdu výrazně rychlejší. Čistý výsledný efekt proto opět velmi závisí na konkrétních programech (appletech), a v praxi může dosahovat například až desetinásobného rozdílu v rychlostech.

Zajímavý je i konkrétní způsob právě naznačeného překladu mezikódu (Javovského byte kódu) na cílové platformě: vzhledem k celkovému charakteru tohoto mezitvaru a jeho zaměření na snadnou interpretaci není možné celý mezikód jednoduše přeložit naráz celý, a pak jej spustit. Místo toho je nutné jej překládat až skutečně "na poslední chvíli", v okamžiku kdy má být skutečně volán, resp. když mají být volány jeho jednotlivé části. Proto se také příslušné strategii práce s mezikódem v angličtině říká "just-in-time compilation". Příslušné překladače, označované přívlastkem JIT (Just In Time Compilers), jsou již dnes běžně k dispozici, a jsou standardní součástí tzv. Java Virtual Machines nejoblíbenějších WWW browserů.


Další zdroje informací:
Populárně laděné články o problematice kompilace Javy a JIT překladačích lze nalézt např. zde a zde. Techničtěji zaměřený článek, popisující konkrétní mechanismy a postupy JIT kompilace, lze nalézt zde.
Seznam odkazů, věnovaných problematice zrychlování běhu javovských appletů, najdete zde.
Oficiální stránku firmy Sun, která popisuje jejich strategii Java-procesorů (čipů microJava a picoJava) najdete zde. Popis JIT překladače, zabudovaného do browseru Internet Explorer firmy Microsoft, najdete zde.