A Cloudflare, Mozilla, Facebook és Bloomberg mérnökei új formátum a JavaScript kód gyorsabb kiszolgálására és feldolgozására a böngészőkben lévő weboldalak megnyitásakor. A BinaryAST a szintaktikai elemző fázisát a szerverre helyezi át, és már egy előre megformált absztrakt szintaktikai fát () szállít. A BinaryAST érkezésekor a böngésző azonnal a fordítási fázisra léphet, megkerülve a JavaScript forráskódjának parsereit.
A teszteléshez a MIT licence alatt szolgáltatott referenciakivitelezés. A parsere a Node.js komponenseit használja, míg az AST optimalizálására és formálására szánt kód Rust nyelven íródott. A böngészők oldalán a támogatás
a BinaryAST már elérhető a Firefoxban. A BinaryAST kódoló alkalmazható akár a végfelhasználói site eszközkészlet szintjén, akár külső webhelyek scriptjeinek csomagolására proxy vagy tartalomelosztó hálózat oldalon. Jelenleg megkezdődött a BinaryAST szabványosítási folyamata az csoport által, amely után a formátum együtt tud működni a meglévő tartalomkompresszáló módszerekkel, mint a gzip és a brotli.
A JavaScript feldolgozásának jelentős időtartama a kód betöltési és szintaktikai elemzési fázisát veszi igénybe. Figyelembe véve, hogy a sok népszerű weboldalon betöltendő JavaScript mennyisége közel 10 MB-ra rúg (például a LinkedIn esetében — 7,2 MB, a Facebook esetében — 7,1 MB, a Gmail esetében — 3,9 MB), az elsődleges JavaScript feldolgozás jelentős késlekedést okoz. A böngésző oldali parsing fázisa is lelassul a szintaktikai fa azonnali kialakításának képtelensége miatt a kód betöltése közben (a böngészőnek meg kell várnia a kódelemek betöltésének befejezését, például a függvények végéig, hogy megszerezze a jelenlegi elemzéshez szükséges hiányzó információkat).
A problémát részben a kód minimalizált és tömörített változatában történő terjesztésével, valamint a böngésző által generált bytekód cache-elésével próbálják megoldani. A modern weboldalakon a kód elég gyakran frissül, ezért a cache-elés csak részben oldja meg a problémát. A megoldás a WebAssembly lehetne, de ez egyértelmű típusmegadást igényel a kódon belül, és nem alkalmas jól a meglévő JavaScript kódok feldolgozásának felgyorsítására.
Egy másik lehetőség a lefordított bytekód elküldése JavaScript-scriptek helyett, de a böngészőmotorok fejlesztői ellenzik ezt, mivel a külső bytekód nehezen ellenőrizhető, közvetlen feldolgozása webszétváláshoz vezethet, további biztonsági fenyegetések merülnek fel, és egy univerzális bytekód formátum kidolgozása szükséges.
A BinaryAST lehetővé teszi, hogy beleilleszkedjünk a kód fejlesztésének és szállításának aktuális modelljébe, anélkül, hogy új bytekódot hoznánk létre vagy a JavaScript nyelvet megváltoztatnánk. A BinaryAST formátumban lévő adatok mérete összehasonlítható a tömörített, minifikált JavaScript-kóddal, míg a feldolgozási sebesség a forrásszövegek elemzésének fázisának elhagyásával jelentősen megnő. Továbbá, a formátum lehetővé teszi a bytekódra való fordítást a BinaryAST betöltése közben, anélkül, hogy meg kellene várni az összes adat megérkezését. Ezen kívül a szerveroldali elemzés lehetővé teszi, hogy a BinaryAST-ból a kiadott prezentációból eltávolítsuk a nem használt funkciókat és fölösleges kódot, amelyre böngészőoldali elemzéskor időt pazarolnak mind az elemzés, mind a felesleges forgalom átkonvertálása miatt.
A BinaryAST különlegessége az is, hogy lehetőséget ad az olvasható JavaScript helyreállítására, amely nem egyezik meg egy az egyben az eredeti verzióval, de szemantikailag ekvivalens, és magában foglalja ugyanazokat a változó- és funkcióneveket (a BinaryAST megőrzi a neveket, de nem őrzi meg a kódban való pozíciókat, a formázást és a megjegyzéseket). A szépérme másik oldala, hogy új támadási vektorok jelenhetnek meg, de a fejlesztők véleménye szerint ezek jelentősen kevesebbek és jobban kontrollálhatók, mint a helyettesítések, például bytekódok elterjedésénél.
A facebook.com kódtesztek azt mutatták, hogy a JavaScript elemzésére a CPU erőforrásainak 10-15%-át használják, és az elemzés hosszabb időt vesz igénybe, mint a bytekód generálása és a JIT számára kezdeti kód előállítása. A SpiderMonkey motorban az AST teljes felépítése 500-800 ms-ot vesz igénybe, és a BinaryAST alkalmazása ezt az értéket 70-90%-kal csökkentette.
Összességében a legtöbb webes keretrendszer esetében a BinaryAST használatakor a JavaScript elemzési ideje 3-10%-kal csökken optimalizálás nélküli üzemmódban, és 90-97%-kal csökkenthető a nem használt funkciók figyelmen kívül hagyásának üzemmódjába való bekapcsolásával.
Egy 1,2 MB méretű teszt JavaScript-készlet futtatásakor a BinaryAST alkalmazása lehetővé tette a betöltési idő csökkentését 338 ms-ról 314 ms-ra asztali rendszeren (Intel i7), illetve 2019 ms-ról 1455 ms-ra mobil eszközön (HTC One M8).
Forrás: opennet.ru
