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

Inženýři z Cloudflare, Mozilla, Facebook a Bloomberg navrhl nový formát BinárníAST pro urychlení doručení a zpracování kódu JavaScript při otevírání stránek v prohlížeči. BinaryAST přesune fázi analýzy na stranu serveru a dodá již vygenerovaný abstraktní strom syntaxe (AST). Po přijetí BinaryAST může prohlížeč okamžitě přejít do fáze kompilace a obejít analýzu zdrojového kódu JavaScriptu.

Pro testování připravený referenční implementace dodávaná pod licencí MIT. Pro parsování se používají komponenty Node.js a kód pro optimalizaci a generování AST je napsán v Rustu. Podpora na straně prohlížeče
BinaryAST je již k dispozici v noční montáž Firefox. Kodér v BinaryAST lze použít 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časné době již byl zahájen proces standardizace BinaryAST pracovní skupinou ECMA TC39, po kterém bude formát schopen koexistovat se stávajícími metodami komprese obsahu, jako je gzip a brotli.

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

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

Při zpracování JavaScriptu se značné množství času stráví ve fázi načítání a analýzy kódu. Vzhledem k tomu, že objem staženého JavaScriptu na mnoha populárních stránkách se blíží 10 MB (například pro LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), přináší počáteční zpracování JavaScriptu značné zpoždění. Fáze analýzy na straně prohlížeče je také zpomalena kvůli nemožnosti plně sestavit AST za běhu při načítání kódu (prohlížeč musí čekat na dokončení načítání bloků kódu, jako je konec funkcí, aby získal informace chybí k analýze aktuálních prvků).

Problém se snaží částečně vyřešit distribucí kódu v minimalizované a komprimované podobě a také ukládáním vygenerovaného bajtkódu do mezipaměti prohlížečem. Na moderních webech se kód aktualizuje poměrně často, takže cachování řeší problém jen částečně. Řešením by mohlo být WebAssembly, ale vyžaduje explicitní zadání kódu a není příliš vhodné pro urychlení zpracování stávajícího kódu JavaScript.

Další možností je dodat hotový kompilovaný bajtový kód namísto skriptů JavaScript, ale vývojáři vyhledávačů jsou proti, protože bajtový kód třetích stran je obtížné ověřit, jeho přímé zpracování může vést ke stratifikaci webu, vznikají další bezpečnostní rizika a vývoj je vyžadován univerzální formát bajtového kódu.

BinaryAST vám umožňuje zapadnout do vašeho aktuálního modelu vývoje a poskytování kódu bez vytváření nového bajtkódu nebo změny jazyka JavaScript. Velikost dat ve formátu BinaryAST je srovnatelná s komprimovaným minimalizovaným JavaScriptovým kódem a rychlost zpracování se díky eliminaci fáze analýzy zdrojového textu znatelně zvyšuje. Kromě toho formát umožňuje kompilaci do bajtového kódu při načítání BinaryAST, bez čekání na dokončení všech dat. Kromě toho vám analýza na straně serveru umožňuje vyloučit nepoužívané funkce a nepotřebný kód z vrácené reprezentace BinaryAST, což při analýze na straně prohlížeče ztrácí čas jak analýzou, tak přenosem zbytečného provozu.

Funkce BinaryAST je také schopnost obnovit čitelný JavaScript, který není úplně stejný jako původní verze, ale je sémanticky ekvivalentní a obsahuje stejné názvy proměnných a funkcí (BinaryAST ukládá názvy, ale neukládá informace o pozicích v kód, formátování a komentáře). Druhou stranou mince je vznik nových útočných vektorů, které jsou ale podle vývojářů mnohem menší a lépe ovladatelné než při použití alternativ, jako je distribuce bytecode.

Testy kódu facebook.com ukázaly, že analýza JavaScriptu spotřebuje 10–15 % zdrojů CPU a analýza zabere více času než generování bajtového kódu a počáteční generování kódu pro JIT. V enginu SpiderMonkey trvá kompletní vytvoření AST 500-800 ms a použití BinaryAST snížilo toto číslo o 70-90%.
Obecně platí, že u většiny webových ohňostrojů se při použití BinaryAST zkrátí čas analýzy JavaScriptu o 3–10 % v režimu bez optimalizace a o 90–97 %, když je povolen režim ignorování nepoužívaných funkcí.
Při spuštění testovací sady JavaScript o velikosti 1.2 MB umožnilo použití BinaryAST zrychlit dobu spouštění z 338 na 314 ms na stolním systému (Intel i7) a z 2019 na 1455 8 ms na mobilním zařízení (HTC One MXNUMX).

Zdroj: opennet.ru

Přidat komentář