Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

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.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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.

TIB2012

       

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í

Anketa

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

       

David Majda

Autor je vývojář na volné noze 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.

Školení Google+ pro firmy

DW - Školení PPC
  • Jak využít Google+ pro firemní komunikaci a marketing.
  • Čím se liší Google+ od Twitteru a Facebooku z pohledu firemního využití.
  • Jak využít Google+ v souladu s pravidly užívání.
  • Založení Google+ Page (Stránky) krok po kroku, včetně praktických tipů.

Detailní informace o školení Google+ »

Přehled názorů

Adobe AIR
pas 27. 11. 2008 00:25
Nový
└ 
Re: Adobe AIR
David Majda 27. 11. 2008 09:06
Nový
Dynamické jazyky v Javě
nigol 27. 11. 2008 06:41
Nový
└ 
Re: Dynamické jazyky v Javě
David Majda 27. 11. 2008 09:20
Nový
V8 na serveru
Ondřej Žára 27. 11. 2008 08:05
Nový
spustanie javy z javascriptu
Mazarik 27. 11. 2008 08:57
Nový
└ 
Re: spustanie javy z javascriptu
David Majda 27. 11. 2008 09:46
Nový
Jaxer
Borek Bernard 27. 11. 2008 09:10
Nový
└ 
Re: Jaxer
David Majda 27. 11. 2008 09:52
Nový
 
├ 
Re: Jaxer
Borek Bernard 27. 11. 2008 10:04
Nový
 
│
├ 
Re: Jaxer
David Majda 27. 11. 2008 10:43
Nový
 
│
│
└ 
Re: Jaxer
Borek Bernard 27. 11. 2008 11:36
Nový
 
│
│
 
└ 
Re: Jaxer
Jiří Knesl 28. 11. 2008 09:09
Nový
 
│
│
 
 
└ 
Re: Jaxer
Borek Bernard 28. 11. 2008 10:22
Nový
 
│
│
 
 
 
└ 
Re: Jaxer
Jiří Knesl 28. 11. 2008 10:37
Nový
 
│
└ 
Re: Jaxer
Radek 27. 11. 2008 10:48
Nový
 
└ 
Re: Jaxer
karf 27. 11. 2008 11:24
Nový
Chybka a Narcissus
Tomáš Brukner 27. 11. 2008 09:36
Nový
└ 
Re: Chybka a Narcissus
David Majda 27. 11. 2008 10:28
Nový
 
└ 
Re: Chybka a Narcissus
Tomáš Brukner 27. 11. 2008 10:50
Nový
JS v Adobe PDF
Leoš Ondra 27. 11. 2008 14:58
Nový
└ 
Re: JS v Adobe PDF
David Majda 27. 11. 2008 20:35
Nový
Namet na pokracovani
ma 28. 11. 2008 09:47
Nový
└ 
Re: Namet na pokracovani
David Majda 28. 11. 2008 10:38
Nový
Managed.JScript
aprilchild 1. 12. 2008 15:32
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem