Cloudflare, Mozilla a Facebook vyvíjajú BinaryAST na urýchlenie načítania JavaScriptu

Inžinieri z Cloudflare, Mozilla, Facebook a Bloomberg navrhol nový formát binárne AST na urýchlenie doručenia a spracovania kódu JavaScript pri otváraní stránok v prehliadači. BinaryAST presúva fázu analýzy na stranu servera a dodáva už vygenerovaný abstraktný strom syntaxe (AST). Po prijatí BinaryAST môže prehliadač okamžite prejsť do fázy kompilácie a obísť analýzu zdrojového kódu JavaScript.

Na testovanie pripravený referenčná implementácia dodávaná v rámci licencie MIT. Na parsovanie sa používajú komponenty Node.js a kód na optimalizáciu a generovanie AST je napísaný v jazyku Rust. Podpora na strane prehliadača
BinaryAST je už dostupný v nočné stavby Firefox. Kódovač v BinaryAST možno použiť na úrovni nástrojov koncovej lokality aj na balenie skriptov externých lokalít na strane proxy alebo siete na doručovanie obsahu. V súčasnosti sa už začal proces štandardizácie BinaryAST pracovnou skupinou ECMA TC39, po ktorom bude formát schopný koexistovať s existujúcimi metódami kompresie obsahu, ako sú gzip a brotli.

Cloudflare, Mozilla a Facebook vyvíjajú BinaryAST na urýchlenie načítania JavaScriptu

Cloudflare, Mozilla a Facebook vyvíjajú BinaryAST na urýchlenie načítania JavaScriptu

Pri spracovaní JavaScriptu sa značné množstvo času strávi vo fáze načítania a analýzy kódu. Vzhľadom na to, že objem sťahovaného JavaScriptu na mnohých populárnych stránkach sa blíži k 10 MB (napríklad pre LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), počiatočné spracovanie JavaScriptu predstavuje značné oneskorenie. Fáza analýzy na strane prehliadača je tiež spomalená z dôvodu nemožnosti úplne zostaviť AST za behu pri načítavaní kódu (prehliadač musí čakať na dokončenie načítania blokov kódu, ako je napríklad koniec funkcií, aby získal chýbajúce informácie na analýzu aktuálnych prvkov).

Problém sa snažia čiastočne vyriešiť distribúciou kódu v minimalizovanej a komprimovanej podobe, ako aj ukladaním vygenerovaného bajtkódu do vyrovnávacej pamäte prehliadačom. Na moderných stránkach sa kód aktualizuje pomerne často, takže ukladanie do vyrovnávacej pamäte rieši problém len čiastočne. Riešením môže byť WebAssembly, ale vyžaduje explicitné písanie kódu a nie je príliš vhodné na urýchlenie spracovania existujúceho kódu JavaScript.

Ďalšou možnosťou je dodanie hotového skompilovaného bajtkódu namiesto skriptov JavaScript, ale vývojári prehliadača sú proti tomu, pretože bajtový kód tretích strán je ťažké overiť, jeho priame spracovanie môže viesť k stratifikácii webu, vznikajú ďalšie bezpečnostné riziká a vývoj vyžaduje sa univerzálny formát bajtového kódu.

BinaryAST vám umožňuje zapadnúť do vášho súčasného modelu vývoja a poskytovania kódu bez vytvárania nového bajtkódu alebo zmeny jazyka JavaScript. Veľkosť údajov vo formáte BinaryAST je porovnateľná s komprimovaným miniifikovaným kódom JavaScript a rýchlosť spracovania elimináciou fázy analýzy zdrojového textu sa výrazne zvyšuje. Okrem toho formát umožňuje kompiláciu do bajtového kódu pri načítaní BinaryAST bez čakania na dokončenie všetkých údajov. Okrem toho vám analýza na strane servera umožňuje vylúčiť nepoužívané funkcie a nepotrebný kód z vrátenej reprezentácie BinaryAST, ktorá pri analýze na strane prehliadača stráca čas analýzou aj prenosom zbytočnej prevádzky.

Funkciou BinaryAST je tiež schopnosť obnoviť čitateľný JavaScript, ktorý nie je úplne rovnaký ako pôvodná verzia, ale je sémanticky ekvivalentný a obsahuje rovnaké názvy premenných a funkcií (BinaryAST ukladá názvy, ale neukladá informácie o pozíciách v kód, formátovanie a komentáre). Druhou stranou mince je vznik nových vektorov útoku, ktoré sú však podľa vývojárov oveľa menšie a lepšie ovládateľné ako pri použití alternatív, ako je napríklad distribúcia bajtkódov.

Testy kódu facebook.com ukázali, že analýza JavaScriptu spotrebuje 10 – 15 % zdrojov CPU a analýza zaberie viac času ako generovanie bajtkódu a počiatočné generovanie kódu pre JIT. V engine SpiderMonkey trvá kompletné zostavenie AST 500-800 ms a použitie BinaryAST znížilo toto číslo o 70-90%.
Vo všeobecnosti platí, že pri väčšine webových ohňostrojov sa pri použití BinaryAST čas analýzy JavaScriptu skráti o 3 – 10 % v režime bez optimalizácie a o 90 – 97 %, keď je povolený režim ignorovania nepoužívaných funkcií.
Pri spustení testovacej sady JavaScript s veľkosťou 1.2 MB umožnilo použitie BinaryAST zrýchliť čas spustenia z 338 na 314 ms na stolnom systéme (Intel i7) a z 2019 na 1455 8 ms na mobilnom zariadení (HTC One MXNUMX).

Zdroj: opennet.ru

Pridať komentár