Seriál je určen primárně pro zvídavé webové vývojáře pracující s JavaScriptem. Pro ty, které zajímá, jak všechno funguje pod povrchem, ale sami nikdy nenašli sílu či čas implementace JavaScriptu zkoumat. V průběhu seriálu budeme tedy předpokládat, že čtenář JavaScript v praxi používá a dobře zná, nebudeme ale předpokládat nic navíc. Není potřeba mít za sebou přednášku z tvorby kompilátorů apod. – všechny implementační techniky a pojmy budou vysvětleny. Předpokladům o čtenáři bude odpovídat také hloubka, do jaké budou jednotlivé oblasti probírány, a technická náročnost.
Proč toto téma a proč právě teď?
Historie
Pro plné pochopení, proč je právě v této době zajímavé se zabývat implementacemi JavaScriptu, je třeba se podívat do historie.
První verze JavaScriptu se objevila v roce 1995 v prohlížeči Netscape Navigator 2. JavaScript byl tehdy zamýšlen jako nástroj na doplnění jednoduchých dynamických prvků do webových stránek. Jeho typické použití byly validace formulářů na straně klienta a drobné efekty s obrázky – o moc víc s tehdejším JavaScriptem dělat nešlo. Programy v JavaScriptu tak měly většinou délku jen několika řádků.
Situace se změnila s příchodem Internet Exploreru 4, který jako první prohlížeč umožnil skriptům přistupovat k objektovému modelu celé stránky. Z JavaScriptu se tak dal měnit obsah libovolných částí stránky, přidávat obsah nový či naopak obsah mazat. Možnosti JavaScriptu se tím řádově rozšířily, objevila se spousta skriptů typu „moje super vyskakovací menu“ a průměrná délka skriptů ve stránkách podstatně vzrostla.
Dalším zlomem byl nástup AJAXu, který umožňoval stránkám komunikovat se serverem a zobrazovat uživateli nový obsah či provádět různé akce, aniž by bylo nutné nové načtení stránky. Pamětníci vědí, jaký poprask způsobilo uvedení GMailu – první aplikace, která byla na JavaScriptu a AJAXu kompletně postavená a nemohla bez nich fungovat. Takových aplikací je dnes mnoho a jejich společným rysem je, že obsahují stovky kB javascriptového kódu.
Posledním důležitým bodem ve vývoji JavaScriptu byl nástup knihoven typu Prototype a jQuery. Jejich cílem je usnadnit práci s DOM a skrýt některé rozdíly mezi prohlížeči. Důsledkem je, že prakticky každá nová stránka si dnes s sebou nese desítky kB JavaScriptového kódu a při běžných operacích se vykoná více javascriptových příkazů, než tomu bylo bez knihoven.
Z předchozích odstavců je vidět jednoznačný trend – důležitost JavaScriptu, jeho složitost a množství obsažené ve webových stránkách postupně rostlo, a to o několik řádů. Naproti tomu implementace v prohlížečích zůstávaly po mnoho let prakticky nezměněné, když pomineme přidávání nových vlastností a občasnou příležitostnou optimalizaci.
Současnost
V posledním cca roce se ale situace změnila. Výrobci prohlížečů si začali uvědomovat, že javascriptové interprety se stávají úzkým hrdlem mnohých webových aplikací a v nejednom případě jsou hlavní příčinou jejich pomalosti. Začali na rychlosti JavaScriptu intenzivně pracovat a vše se postupně vyhrotilo až do podoby závodu (především mezi prohlížeči Firefox a Safari), kdy se jednotlivé strany přetahují o prvenství v několika různých rychlostních testech a odpovědí na momentální vítězství strany jedné je obvykle velice rychle nová verze interpretu strany druhé, která situaci opět mění. Z toho samozřejmě v důsledku nejvíc těží uživatel, kterému webové aplikace poběží s každou novou verzí jeho prohlížeče podstatně rychleji.
Ze širšího pohledu je také velice zajímavé, že zrychlování JavaScriptu posouvá „state-of-art“ v oblasti interpretace dynamických jazyků obecně. Dynamické skriptovací jazyky (kam JavaScript patří) totiž obvykle slouží jen jako „lepidlo“ komponent napsaných v jiných, rychlejších jazycích. Jejich rychlost tak není kriticky důležitá a tím pádem se výzkum v oblasti jejich interpretace nedostal příliš daleko – na rozdíl od oblasti kompilace „klasických“ statických jazyků, která je intenzivně zkoumána přes 30 let. Na tom nic nezměnilo ani časté nasazení dynamických jazyků ve webových aplikacích, protože zde je obvykle největší brzdou I/O, resp. databáze. JavaScript je první dynamický jazyk, jehož rychlost je klíčová a zároveň je dostatečně rozšířený na to, aby vznikla dostatečná poptávka po tom ho významně zrychlit.
Důsledkem je, že díky JavaScriptu poněkud ožil výzkum v oblasti interpretace dynamických jazyků, a to jak v týmech zabývajících se vývojem javascriptových interpretů, tak i na univerzitách (např. s technikou tracingu, kterou bude používat interpret JavaScriptu v příští verzi Firefoxu, přišli výzkumníci z University of California). Z tohoto výzkumu můžou samozřejmě těžit i všechny ostatní dynamické jazyky, jako třeba PHP, Perl, Python a nebo Ruby. (Jiná otázka je, jestli skutečně těžit budou.)
Jak je vidět, oblast interpretů JavaScriptu je v současné době pěkně „horká“ a dějí se v ní poměrně zajímavé věci. Právě to je hlavní motivací pro sérii článků, která by tuto oblast zmapovala.
Co nás čeká v příštích dílech?
V příštím díle se podíváme na některé rysy JavaScriptu, které činí největší problémy při jeho implementaci (z pohledu rychlosti). Stručně se také seznámíme se všemi významnými implementacemi JavaScriptu.
V dalších částech seriálu si podrobněji představíme javascriptový interpret zobrazovacího jádra WebKit SquirrelFish, protože ve své původní implementaci je poměrně jednoduchý a budeme si tak na něm moci vysvětlit základní optimalizační techniky. Poté se podíváme na SpiderMonkey používaný ve Firefoxu (včetně jeho vývojové varianty TraceMonkey) a také na nového hráče – V8 od Googlu, který je součástí prohlížeče Google Chrome.
Na úplný závěr seriálu se seznámíme s některými rychlostními testy JavaScriptu – výrobci prohlížečů pomocí nich rádi ukazují, jak se jejich implementace oproti dřívějšku zlepšila. Je docela užitečné vědět, co testy doopravdy testují a umět interpretovat prezentované grafy.
Přehled komentářů