Cloudflare, Mozilla a Facebook vyvíjejí BinaryAST pro zrychlení načítání JavaScriptu

Inženýři z firem Cloudflare, Mozilla, Facebook a Bloomberg navrhli nový formát BinaryAST pro zrychlení dodávky a zpracování JavaScriptového kódu při otevírání webových stránek v prohlížeči. BinaryAST přesouvá fázi syntaktické analýzy na server a dodává již vytvořený abstraktní syntaktický strom (AST). Při obdržení BinaryAST může prohlížeč okamžitě přejít na fázi kompilace, aniž by musel provádět analýzu zdrojového kódu JavaScriptu.

Pro testování byla připravena referenční implementace dodávaná pod licencí MIT. Pro analýzu se používají komponenty Node.js a kód pro optimalizaci a vytváření AST je napsán v jazyce Rust. Na straně prohlížečů je podpora
BinaryAST již dostupná v nočních sestaveních Firefoxu. Kódovač v BinaryAST může být aplikován jak na úrovni nástrojů koncového webu, tak pro balení skriptů externích webů na straně proxy nebo sítě pro doručování obsahu. V současnosti již začal proces standardizace BinaryAST pracovním týmem ECMA TC39, po jehož dokončení bude formát moci koexistovat vedle stávajících metod komprese dodávaného obsahu, jako jsou gzip a brotli.

Cloudflare, Mozilla a Facebook vyvíjejí BinaryAST pro zrychlení načítání JavaScriptu

Cloudflare, Mozilla a Facebook vyvíjejí BinaryAST pro zrychlení načítání JavaScriptu

Významná část času při zpracování JavaScriptu je věnována fázi načítání a syntaktické analýzy kódu. Vzhledem k tomu, že objem stahovaného JavaScriptu na mnoha populárních stránkách dosahuje téměř 10 MB (například LinkedIn — 7,2 MB, Facebook — 7,1 MB, Gmail — 3,9 MB), primární zpracování JavaScriptu přináší značné zpoždění. Fáze analýzy na straně prohlížeče se také zpomaluje z důvodu nemožnosti plného vytvoření AST za běhu při načítání kódu (prohlížeč musí čekat na dokončení načítání bloků kódu, například na konce funkcí, aby získal potřebné informace pro analýzu aktuálních prvků).

Částečně se problém snaží řešit rozšiřováním kódu v minimalizované a komprimované podobě, stejně jako pomocí cachování prohlížečem generovaného bytecode. Na moderních stránkách se kód aktualizuje poměrně často, a proto cachování pouze částečně řeší problém. Řešení by mohlo poskytnout WebAssembly, ale vyžaduje použití explicitního typování v kódu a není příliš vhodné pro urychlení zpracování již existujícího kódu v JavaScriptu.

Alternativou je dodání hotového kompilovaného bajtkódu místo JavaScriptových skriptů, ale vývojáři prohlížečových enginů s tím nesouhlasí, protože ověření externího bajtkódu je obtížné, jeho přímé zpracování může vést k rozdělení webu, vznikají další bezpečnostní hrozby a je třeba vyvinout formát univerzálního bajtkódu.

BinaryAST se integrovala do stávajícího modelu vývoje a distribuce kódu bez nutnosti vytváření nového bajtkódu a bez změny jazyka JavaScript. Velikost dat ve formátu BinaryAST je srovnatelná se zmenšeným a minifikovaným JavaScriptovým kódem, a rychlost zpracování se díky vyloučení fáze parsování zdrojových textů výrazně zvyšuje. Navíc formát umožňuje provádět kompilaci do bajtkódu během načítání BinaryAST, aniž by bylo třeba čekat na dokončení příjmu všech dat. Dále, parsování na straně serveru umožňuje vyloučit z dodávaného zobrazení BinaryAST nepoužívané funkce a nadbytečný kód, na což se při parsování na straně prohlížeče ztrácí čas, jak při analýze, tak při přenosu nadbytečného provozu.

Specifikou BinaryAST je také schopnost obnovit čitelný JavaScript, který sice nebyl identicky shodný s původní verzí, ale byl semanticky ekvivalentní a zahrnoval stejné názvy proměnných a funkcí (BinaryAST zachovává názvy, ale nezachová informace o pozicích v kódu, formátování a komentáře). Na druhou stranu, objevují se nové útočné vektory, ale podle názoru vývojářů jsou tyto výrazně menší a lépe kontrolovatelné než při použití alternativ, jako je rozšíření bajtkódu.

Testy kódu facebook.com ukázaly, že na analýzu JavaScriptu se spotřebovává 10-15% prostředků CPU a na parsování se tráví více času než na generování bajtkódu a počáteční vytváření kódu pro JIT. V enginu SpiderMonkey trvá úplné vytvoření AST 500-800 ms a použití BinaryAST umožnilo tento čas zkrátit o 70-90%.
Obecně platí, že pro většinu webových frameworků se při použití BinaryAST čas parsování JavaScriptu zkracuje o 3-10% v režimu bez optimalizace a o 90-97% při aktivaci režimu ignorování nepoužívaných funkcí.
Při provádění testovacího JavaScriptového souboru o velikosti 1,2 MB umožnilo použití BinaryAST zrychlit čas zahájení spuštění z 338 na 314 ms na stolním systému (Intel i7) a z 2019 na 1455 ms na mobilním zařízení (HTC One M8).

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster