Do hlubin implementací JavaScriptu: 5. díl – implementace mimo prohlížeče

V tomto dílu dokončíme přehled implementací JavaScriptu a podíváme se, kde všude kromě webových prohlížečů se dá tento jazyk najít. JavaScript můžeme totiž používat také v Javě, Flashi, .NETu, ale třeba i na webovém serveru Apache, v Emacsu a v několika jiných nečekaných prostředích.

Seriál: Do hlubin implementací JavaScriptu (14 dílů)

  1. Do hlubin implementací JavaScriptu: 1. díl – úvod 30.10.2008
  2. Do hlubin implementací JavaScriptu: 2. díl – dynamičnost a výkon 6.11.2008
  3. Do hlubin implementací JavaScriptu: 3. díl – výkonnostně nepříjemné konstrukce 13.11.2008
  4. Do hlubin implementací JavaScriptu: 4. díl – implementace v prohlížečích 20.11.2008
  5. Do hlubin implementací JavaScriptu: 5. díl – implementace mimo prohlížeče 27.11.2008
  6. SquirrelFish: reprezentace hodnot JavaScriptu a virtuální stroj 4.12.2008
  7. SquirrelFish: optimalizace vykonávání instrukcí a nativní kód 11.12.2008
  8. SquirrelFish: regulární výrazy, vlastnosti objektů a budoucnost 18.12.2008
  9. SpiderMonkey: zpracování JavaScriptu ve Firefoxu 8.1.2009
  10. SpiderMonkey: rychlá kompilace JavaScriptu do nativního kódu 15.1.2009
  11. V8: JavaScript uvnitř Google Chrome 22.1.2009
  12. Rhino: na rozhraní JavaScriptu a Javy 29.1.2009
  13. Velký test rychlosti JavaScriptu v prohlížečích 5.2.2009
  14. Javascriptové novinky: souboj o nejrychlejší engine pokračuje 19.3.2009

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 Be­anShell). 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 dokumen­taci na vývojář­ském wiki Mozilly. A mimochodem, Rhino je nazváno podle známé knížky o JavaScriptu s o­brázkem nosorožce.

ActionScript/Ta­marin

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 experimen­tá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 JScrip­t.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 Di­gital 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ři­dána). Praktické využití Narcissus pravděpodobně nemá, nicméně posloužil jako základ implemen­tace 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 inter­pretu 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š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í

Znáte rozšířenější jazyk než JavaScript?

Autor je vývojář se zájmem o programovací jazyky, webové aplikace a problémy programování jako takového. Vystudoval informatiku na MFF UK a během studií zde i trochu učil. Aktuálně pracuje v SUSE.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 25

Přehled komentářů

pas Adobe AIR
David Majda Re: Adobe AIR
nigol Dynamické jazyky v Javě
David Majda Re: Dynamické jazyky v Javě
Ondřej Žára V8 na serveru
Mazarik spustanie javy z javascriptu
David Majda Re: spustanie javy z javascriptu
Borek Bernard Jaxer
David Majda Re: Jaxer
Borek Bernard Re: Jaxer
David Majda Re: Jaxer
Borek Bernard Re: Jaxer
Jiří Knesl Re: Jaxer
Borek Bernard Re: Jaxer
Jiří Knesl Re: Jaxer
Radek Re: Jaxer
karf Re: Jaxer
Tomas.Brukner Chybka a Narcissus
David Majda Re: Chybka a Narcissus
Tomas.Brukner Re: Chybka a Narcissus
Leoš Ondra JS v Adobe PDF
David Majda Re: JS v Adobe PDF
ma Namet na pokracovani
David Majda Re: Namet na pokracovani
aprilchild Managed.JScript
Zdroj: https://www.zdrojak.cz/?p=2878