Do hlubin implementací JavaScriptu: 1. díl – úvod

Tento článek otevírá nový seriál, který bude věnován implementacím JavaScriptu. Postupně si v něm představíme nejdůležitější současné interprety tohoto jazyka (především ty obsažené ve webových prohlížečích) a u některých vybraných se podrobněji podíváme, jak vypadají uvnitř. Nejvíc nás přitom bude zajímat, jaké techniky se v nich používají pro optimalizaci a urychlení spouštěného kódu.

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

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.

Bude mít zrychlení JavaScriptu vliv i na rychlost dalších dynamických jazyků?

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: 15

Přehled komentářů

Brut4r RE: Do hlubin implementací JavaScriptu: 1. díl - úvod
Brut4r RE: Do hlubin implementací JavaScriptu: 1. díl - úvod
m RE: Do hlubin implementací JavaScriptu: 1. díl - úvod
Mazarik RE: Do hlubin implementací JavaScriptu: 1. díl - úvod
maros RE: Do hlubin implementací JavaScriptu: 1. díl - úvod
Radek Rhino
David Majda Re: Rhino
maros Smalltalk
tomas z. Re: Smalltalk
David Majda Re: Smalltalk
David Majda Re: Smalltalk
tomas z. Re: Smalltalk
Ladislav Thon Re: Smalltalk
David Majda Re: Smalltalk
Anonym RE: Do hlubin implementací JavaScriptu: 1. díl - úvod
Zdroj: https://www.zdrojak.cz/?p=2846