Přejít k navigační liště

Zdroják » JavaScript » Do hlubin implementací JavaScriptu: 5. díl – implementace mimo prohlížeče

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

Články JavaScript, Různé

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.

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?

Komentáře

Subscribe
Upozornit na
guest
25 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
pas

Hezký článek. Jen bych doplnil Adobe AIR, který krásně integruje web browser (WebKit) s Flash Playerem, a to tak, že jak JavaScript, tak i ActionScript lze kombinovat při manipulaci s oběma objektovými modely.

nigol

Ono těch jazyků asi bylo víc. Třeba takové JScheme vyšlo v dubnu 1998 ve verzi 1.4, takže si myslím, že projekt musel minimálně v roce 1997 začít také. Já ho mám dokonce portované do mobilu do J2ME ;)

Ondřej Žára

Ahoj,

timto (snad relevantnim) komentarem bych si rad udelal malinkate PR na svuj drobny projekt – http://code.google.com/p/v8cgi/ – c++ wrapper nad V8 s cilem pouzit JS na serveru (jako CGI/FastCGI). V soucasne dobe funguje podpora pro MySQL a sepsal jsem i par podpurnych c++/js knihoven pro HTTP, sablony atp. Na udrzbu a dalsi featury nemam tolik casu, kolik bych chtel, takze do projektu rad prijmu nejakeho dalsiho zajemce :)

V8 mi prislo jako optimalni volba, neb se (v porovnani se SpiderMonkey) chlubi vyssi rychlosti, coz muze byt v CGI/FastCGI prostredi celkem vyhoda.

Mazarik

Nielen v Rhine je mozne spustat javovske triedy a balicky a pracovat s nimi ako s nativnymi objektami Javascriptu. Je to mozne aj vo Firefoxe (v inych prehliadacoch som to neskusal).
napr.

var test = new java.util.Date();
var doc = document.open();
doc.write("java.util.Date.toString = " + test + "
"); doc.write("typeof(java.util.Date) = " + typeof(test) + "
"); doc.close();
Borek Bernard

Chybí zde zmínka o AJAXovém serveru Jaxer, který umožňuje JavaScript vykonávat na serveru.

Borek Bernard

Abych byl upřímný, věci jako Rhino nebo JScript.NET mi připadají spíš jako technologické kuriozity bez větších možností praktického uplatnění, zatímco Jaxer je inovativní přístup, který může potenciálně mít dost výrazný přínos pro webový vývoj (třeba JavaScriptová validace, která funguje identicky na klientu i na serveru je úžasná vlastnost, kterou jiné platformy nenabízejí). Asi proto mi v článku Jaxer chyběl, i když chápu, že nelze zmínit úplně každou technologii na světě.

Borek Bernard

Určitě je řada lidí, která Rhino používá, ale pokud se nepletu, konceptuálně je Rhino podobné projektům Jython nebo JRuby, což jsou jazyky konvenčnější a tedy používanější (obzvlášť o kombinaci Java+Python je slyšet často). Jaxer je naproti tomu docela originální počin mající malou konkurenci, což byl asi hlavní důvod, proč jsem ho chtěl zmínit.

Jinak teoretické možnosti JScript.NET jsou podobné možnostem Rhina, ale na platformě .NET je to v podstatě mrtvý, skoro nepoužívaný jazyk (v porovnání s jinými).

Jiří Knesl

Jen na okraj. Jaxer je poháněn právě Rhinem. Jsou to asi 2 týdny, co jsem to na stránkách Aptany četl.

Teď se mi podařilo najít pouze:
"Jaxer's core engine is based on the same Mozilla engine that you'll find in the popular Mozilla Firefox browser." (http://www.aptana.com/jaxer zalozka How Jaxer works)

Rhino bych tedy nezatracoval, protoze na nem lze vybudovat prave i Vami zminovany Jaxer. :)

Borek Bernard

Jaxer je postavený na Gecku (ve Firefoxu běží Gecko na klientovi, v Jaxeru je Gecko načteno v serverovém procesu).

Jiří Knesl

Nedaří se mi to najít, ale skutečně to na webu Aptany bylo napsané, je to tak 2 týdny.

Teď se mi daří najít jen to, že je v Jaxeru zabudované celé jádro Firefoxu.

Takže máte asi pravdu, ale nejde mi do hlavy, proč to tam tedy psali.

Radek

To je asi věc názoru. Mě se to třeba jeví úplně naopak. Hodně programuji v Javě a možnost přidat do aplikace (a to nejen webové) skriptování v JS (Rhino) mi připadá úžasná a mám pro ni využití. Dodává to do Javy možnosti, které tam z principu kompilovaného jazyka normálně nejsou. Na druhou stranu pro skriptování na serveru existuje mnoho jiných jazyků, které se běžně používají. Tudíž AJAX server s JavaScriptem je mi sympatický, ale nic až tak inovativního na tom nevidím. Ale je to určitě dáno úhlem pohledu.

karf

Jaxer využívá Gecko, takže je otázka, jestli by do výčtu implementací ve článku, tak jak je koncipován, patřil. Ale hodný pozornosti určitě je.

Já bych v podobném duchu upozornil i na zajímavý projekt jslibs – http://code.google.com/p/jslibs/ . Umožňuje používat javascript z command line spolu se sadou zajímavých modulů. Je to také postaveno na SpiderMonkey.

Tomas.Brukner

Nejdříve menší chybka (překlep): Myslím že Jython implementuje Python a ne Pyhton. (předposlední odstavec o Rhinu).

A napadlo mě využití Narcissus engine – nevím jak moc to je efektivní, ale v principu by se dal použít na oddělení vkládaného Javascriptu do stránky tak, aby tento vložený Javascript neměl přístup k původní stránce (třeba pro bezpečné mashupy aplikací apod.) – někde jsem četl, že je to docela velký bezpečností problém – právě třeba u používání několika vložených Javascriptových kódů vložených do stránky, které by neměli být schopné si navzájem číst data.

Tomas.Brukner

Ano, ty objekty jsou problém – jako praktické univerzální řešení se to tak vylučuje (buď emulací vlastních objektů (což by bylo pomalé) nebo resetováním případných upravených objektů na původní (smazání přidaných metod apod.)), ale možná i tato cesta může být ve výsledku dřív než upravení implementace javascriptu ve všech prohlížečích :-)

Leoš Ondra

Je mozne, ze jsem nepochopil zkratky a nazvy, ale doplnim, ze JavaScript se da pouzit i v pdf dokumentech (v Adobe Acrobatu). Leo

ma

Pekny serial, diky za nej.

Mel bych jeden namet na pokracovani, co treba jednoduchy popis SpiderMonkey (API+priklad) coby externe pripojitelneho JS interpretu? Typicky kdyz chci svuj C/C++ kod ovladat pomoci JS skriptu…

aprilchild

Jeste je tu Managed.JScript – napsany v managed kodu (nejspis C#) pod CLR (.NET). To jen aby byl vycet MS implementaci uplny ;). JScript v prohlizecich, JScript.NET jako clen rodiny CLR jazyku, Managed.JScript jako clen rodiny DLR (spolecny runtime pro dynamicke jazyky – JavaScript, Ruby, Python). Pouziti – Silverlight. Vsechny implementace navzajem nezavisle.

Bohuzel pro Managed.JScript nejsou uvolneny zdrojaky, takze jsem musel pod .NET rozbehat Spidermonkey (skriptovani na serveru s propojenim na C# knihovny – analogie z Rhina).

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.