V dnešním přehledu implementací JavaScriptu mimo webové prohlížeče se na rozdíl od předchozí části nebudeme snažit o úplnost výčtu (článek by se jinak neúměrně natáhl), ale podíváme se především na implementace alespoň trochu známé či něčím zajímavé. Nebudeme také tolik rozebírat technické detaily.
Rhino
Pravděpodobně nejznámější implementací JavaScriptu mimo prohlížeče je Rhino. Jedná se kompilátor JavaScriptu do bajtkódu Javy, který ale umí fungovat i jako čistý interpret (obsahuje i interaktivní konzoli). Vyvíjet ho začala firma Netscape a nyní jeho vývoj probíhá pod křídly Mozilly. Podobně jako u SpiderMonkey je tato implementace open source a snaží se držet krok s vývojem JavaScriptu – implementuje jeho nové verze (aktuálně 1.7) a rozšíření (např. E4X).
Důvodem existence Rhina je především integrace s Javou jakožto platformou – tedy využití jejích knihoven a nástrojů. Do JavaScriptu spuštěného v Rhinu je možné si importovat javovské balíčky (packages) a využívat jejich třídy a další součásti tak, jako by to byly nativní objekty v JavaScriptu. Možný je i opačný směr, tzn. z Javy lze spouštět kód v JavaScriptu.
Rhino je v praxi asi nejčastěji (ale zdaleka ne výhradně) používáno jako způsob, jak s pomocí Javy dostat JavaScript na server. Java je totiž na serverech hojně nasazována a obsahuje proto spoustu nástrojů a knihoven, které tvorbu serverových aplikací v ní usnadňují. V rámci javového servletu pak už není těžké předat řízení javascriptovému kódu. Takto je například řešena platforma AppJet, ve které je napsán kolaborativní editor EtherPad.
Rhino je zajímavé tím, že jde o jednu z prvních implementaci dynamického jazyka v Javě (projekt vznikl v roce 1997). Ukázalo, že tato cesta je technicky schůdná a prošlapalo tak cestičku dalším reimplementacím existujících jazyků v Javě (jako je třeba JRuby) a jazykům pro Javu přímo vytvořeným (např. Groovy či BeanShell). I díky němu je tak dnes Java považována za velmi dobrou platformu pro implementaci dynamických jazyků. Konkurovat mu v tomto ohledu může asi jen Jython, což je javovská implementace Pythonu, která vznikla zhruba ve stejné době jako Rhino.
Rhinu v našem seriálu jako jediné neprohlížečové implementaci věnujeme samostatný článek. Než na něj dojde, můžete zkoumat dokumentaci na vývojářském wiki Mozilly. A mimochodem, Rhino je nazváno podle známé knížky o JavaScriptu s obrázkem nosorožce.
ActionScript/Tamarin
ActionScript je jazyk používaný ke skriptování aplikací vytvořených ve Flashi a má poměrně zajímavý vývoj.
První skriptovatelnou verzí Flashe byla verze 2, ale zde šlo jen o jednoduché definice akcí spouštěných při vybraných událostech. První opravdový skriptovací jazyk se objevil s verzí 4 a ve verzi 5 byl upraven do podoby založené na ECMAScriptu (nikdy s ním ale nebyl plně kompatibilní). Od té doby se mu začalo říkat ActionScript.
Ve verzi 7 přišel ActionScript 2, který přinesl řadu novinek – především volitelné typové deklarace a klasickou dědičnost pomocí tříd namísto dědičnosti prototypové. První úprava měla pomoci při optimalizaci a programování větších aplikací, cílem druhé pak bylo především přiblížit ActionScript konvenčním jazykům. Zajímavé je, že klasická dědičnost byla implementována jako vrstva nad dědičností prototypovou a také že provedené úpravy nebyly ad hoc – tehdejší představy o dalších verzích JavaScriptu s obdobnou funkcionalitou počítaly a ActionScript byl tedy jakýmsi okénkem do budoucnosti.
Flash 9 přinesl ActionScript 3 a především nový virtuální stroj na jeho interpretaci – Tamarin. Ten byl reakcí na potřebu psát ve Flashi větší a náročnější aplikace a obsahoval just-in-time kompilátor ActionScriptu do nativního kódu.
Firma Adobe zdrojový kód Tamarinu v roce 2006 otevřela a darovala Mozille. Cílem bylo doplnit just-in-time kompilaci a další optimalizace do interpretu SpiderMonkey a vytvořit tak nový a rychlejší hybridní javascriptový engine. Tato snaha ale nakonec vyšla naprázdno a s úplným sloučením kódu se nyní již nepočítá. SpiderMonkey nicméně některé izolované části experimentální větve Tamarinu využívá k implementaci tracingu ve své vývojové verzi TraceMonkey.
JScript.NET
Když Microsoft představil svůj .NET Framework, implementoval v něm hned několik různých jazyků. Jedním z nich byl i dialekt JavaScriptu JScript.NET.
Tato implementace nemá technicky nic společného s původním JScriptem v Internet Exploreru. Podobně jako ActionScript rozšiřuje JavaScript o typové deklarace a o podporu klasických tříd a dědičnosti. Důvodem pro tyto úpravy zde byl především výkon.
Na výkon dává Microsoft obecně poměrně velký důraz – existuje například volba /fast, která jazyk poněkud okleští – deklarace proměnných jsou povinné, nelze měnit vestavěné objekty ani předefinovávat existující funkce, neexistuje objekt arguments atd. Čtenáři třetího dílu si možná povšimli, že tyto úpravy řeší výkonnostní problémy, které jsme si v něm popisovali.
Technicky JScript.NET funguje podobně jako všechny ostatní jazyky na platformě .NET – kompiluje zdrojový kód do CIL a tento bajtkód je pak interpretován (případně just-in-time kompilován do nativního kódu) společným virtuálním strojem.
Další implementace
JavaScript má i několik dalších implementací, které nejsou příliš rozšířené. Jednou z těchto implementací je QtScript, který je používán ke skriptování aplikací napsaných v Qt Toolkitu. Silnou stránkou této implementace je především propojení objektů QtScriptu a nativních objektů v C++. V rámci Qt jde o relativní novinku (QtScript je k dispozici od verze 4.3 vydané v květnu 2007), ale již dříve byl v Qt k dispozici jazyk QSA (QtScript for Applications), který přinášel stejně jako několik dalších variant JavaScriptu podporu tříd a klasické dědičnosti.
Poměrně okrajovým dialektem JavaScriptu je DMDScript, který je zajímavý tím, že asi jako jediný obsahuje příkaz goto. Implementace DMDScriptu jsou dvě (jedna v C++, druhá v jazyce D) a obě pocházejí od společnosti Digital Mars.
Implementaci JavaScriptu (přesněji jeho dialektu JScript) obsahuje také projekt Wine, který se tak snaží naemulovat knihovnu jscript.dll od Microsoftu. Interpret je psán „na zelené louce“ (s výjimkou zpracování regulárních výrazů, které je převzato ze SpiderMonkey) a soudě podle změn ve vývojovém stromu se na jeho vývoji v posledních měsících intenzivně pracuje. Důvod, proč nebyla přímo využita nějaká existující implementace, zvlášť když zde už podobné pokusy dříve byly, se mi bohužel nepodařilo dohledat.
Zajímavou hříčkou je Narcissus – implementace JavaScriptu v sobě samém (odborný výraz je metacircular interpreter). Napsal ho tvůrce JavaScriptu Brendan Eich a ke svému běhu potřebuje SpiderMonkey, protože využívá několik jeho nestandardních rozšíření (některá byla dokonce do SpiderMonkey speciálně kvůli Narcissusu přidána). Praktické využití Narcissus pravděpodobně nemá, nicméně posloužil jako základ implementace JavaScriptu v Emacsu, napsané v Lispu.
JavaScript v dalších jazycích a prostředích
JavaScript je možné využívat i v některých běžných skriptovacích jazycích. Například pro Perl existuje modul JavaScript-SpiderMonkey, jedná se ale jen o tenkou vrstvu nad céčkovým rozhraním interpretu SpiderMonkey, který musí být nainstalován spolu s modulem. Podobně fungující projekty existují i pro Python a pro Ruby.
Pokud byste chtěli JavaScript používat na serveru Apache, můžete si nainstalovat modul mod_js, který opět využívá SpiderMonkey. Princip fungování je stejný jako u mod_perl, mod_php a dalších podobných modulů, které Apache rozšiřují o podporu nějakého jazyka. Jak ale sami autoři přiznávají, u mod_js se jedná spíš o technologickou ukázku než o reálně nasaditelnou technologii.
Podobné řešení nabízí také modul mod_wxjs. Ten dokonce obsahuje podporu SQLite a šablon, takže při dobré vůli je možné s ním vytvořit i reálnou webovou stránku či aplikaci. Na webu projektu se dá najít ukázka.
Závěr
Jak je z článku vidět, svět JavaScriptu je bohatý a možnosti jeho využití nejsou zdaleka omezeny jen na prostředí webových prohlížečů. JavaScript dnes máme k dispozici prakticky v každém rozšířeném prostředí či jazyce, ať už jako samostatnou implementaci nebo v podobě externího rozhraní. Nevím, jestli existuje jiný jazyk, který by se tímto mohl chlubit.
V příštím díle se už podrobněji podíváme pod pokličku konkrétního interpretu – řeč bude o SquirrelFish, který pohání renderovací jádro WebKit.
Přehledy implementací
- John Resig: The World of ECMAScript
- Wikipedia: ECMAScript (sekce Dialects)
- Wikipedia: List of ECMAScript engines
Přehled komentářů