Cloudflare, Mozilla і Facebook развіваюць BinaryAST для паскарэння загрузкі JavaScript

Інжынеры з кампаній Cloudflare, Mozilla, Facebook і Bloomberg прапанавалі новы фармат Двайковы АСТ для паскарэння дастаўкі і апрацоўкі JavaScript кода пры адкрыцці сайтаў у браўзэры. BinaryAST выносіць фазу сінтаксічнага разбору на бок сервера і пастаўляе ўжо сфарміраванае абстрактнае сінтаксічнае дрэва (АСТ). Пры атрыманні BinaryAST браўзэр адразу можа перайсці на стадыю кампіляцыі, абыходзячы парсінг зыходнага кода JavaScript.

Для тэсціравання падрыхтавана эталонная рэалізацыя, якая пастаўляецца пад ліцэнзій MIT. Для парсінгу выкарыстоўваецца кампаненты Node.js, а код для аптымізацыі і фармаванні AST напісаны на мове Rust. На баку браўзэраў падтрымка
BinaryAST ўжо даступная ў начных зборках Firefox. Кадавальнік у BinaryAST можа ўжывацца як на ўзроўні інструментара канчатковага сайта, так і для пакавання скрыптоў вонкавых сайтаў на боку проксі ці сеткі дастаўкі кантэнту. У цяперашні час ужо пачаўся працэс стандартызацыі BinaryAST працоўнай групай. ECMA TC39, пасля завяршэння якой фармат зможа суіснаваць разам з існуючымі метадамі сціску які аддаецца кантэнту, такімі як gzip і brotli.

Cloudflare, Mozilla і Facebook развіваюць BinaryAST для паскарэння загрузкі JavaScript

Cloudflare, Mozilla і Facebook развіваюць BinaryAST для паскарэння загрузкі JavaScript

Значны час пры апрацоўцы JavaScript займае фаза загрузкі і сінтаксічнага разбору кода. З улікам таго, што аб'ём загружанага JavaScript на шматлікіх папулярных сайтах набліжаецца да 10 Мб (напрыклад для LinkedIn – 7.2Мб, Facebook – 7.1Мб, Gmail – 3.9Мб) першасная апрацоўка JavaScript уносіць істотную затрымку. Стадыя парсінгу на боку браўзэра таксама запавольваецца з-за немагчымасці паўнавартаснай пабудовы AST на лета, па меры загрузкі кода (браўзэру прыходзіцца чакаць завяршэнні загрузкі блокаў кода, напрыклад канца функцый, для атрымання недастатковай для разбору бягучых элементаў інфармацыі).

Часткова праблему спрабуюць вырашыць праз распаўсюджванне кода ў мінімізаваным і сціснутым выглядзе, а таксама пры дапамозе кэшавання браўзэрам згенераванага байткода. На сучасных сайтах код абнаўляецца дастаткова часта, таму кэшаванне толькі часткова вырашае праблему. Выйсцем мог бы стаць WebAssembly, але ён патрабуе выкарыстанні відавочнай тыпізацыі ў кодзе і дрэнна падыходзіць для паскарэння апрацоўкі ўжо існага кода на JavaScript.

Іншым варыянтам з'яўляецца дастаўка гатовага скампіляванага байткода замест JavaScript-скрыптоў, але распрацоўнікі браузерных рухавічкоў выступаюць супраць, бо іншы байткод цяжка верыфікаваць, яго прамая апрацоўка можа прывесці да расслаення Web, узнікаюць дадатковыя пагрозы бяспекі і патрабуецца распрацоўка фармату ўніверсальнага байтко.

BinaryAST дазваляе ўпісацца ў бягучую мадэль распрацоўкі і дастаўкі кода без стварэння новага байткода і без змены мовы JavaScript. Памер дадзеных у фармаце BinaryAST супастаўны са сціснутым мініфікаваным JavaScript-кодам, а хуткасць апрацоўкі за рахунак выключэння фазы парсінгу зыходных тэкстаў прыкметна павялічваецца. Акрамя таго, фармат дазваляе выконваць кампіляцыю ў байткод па меры загрузкі BinaryAST, не чакаючы завяршэнні атрымання ўсіх дадзеных. Акрамя таго, парсінг на боку сервера дазваляе выключыць з які аддаецца ўяўленні BinaryAST невыкарыстоўваныя функцыі і лішні код, на які пры парсінгу на боку браўзэра марнуецца час як на разбор, так і на перадачу лішняга трафіку.

Асаблівасцю BinaryAST таксама з'яўляецца магчымасць аднаўлення чытанага JavaScript не адзін у адзін супадаючага з зыходным варыянтам, але семантычна эквівалентнага і які ўключае тыя ж імёны зменных і функцый (BinaryAST захоўвае імёны, але не захоўвае інфармацыю аб пазіцыях у кодзе, фарматаванне і каментары). Адваротным бокам медалю з'яўляецца з'яўленне новых вектараў для нападаў, але па меркаванні распрацоўнікаў яны значна менш і больш кантраляваныя, чым пры ўжыванні альтэрнатыў, такіх распаўсюджванне байткода.

Тэсты кода facebook.com паказалі, што на разбор JavaScript марнуецца 10-15% рэсурсаў CPU і на парсінг сыходзіць больш часу, чым на генерацыю байткода і пачатковае фармаванне кода для JIT. У рухавічку SpiderMonkey час поўнай пабудовы AST займае 500-800 мс і ўжыванне BinaryAST дазволіла скараціць гэты паказчык на 70-90%.
У цэлым для большасці web-феймрокаў пры ўжыванні BinaryAST час парсінгу JavaScript скарачаецца на 3-10% у рэжыме без аптымізацыі і на 90-97% пры ўключэнні рэжыму ігнаравання невыкарыстоўваных функцый.
Пры выкананні тэставага JavaScript-набору, памерам 1.2/338 Мб, прымяненне BinaryAST дазволіла паскорыць час пачатку запуску з 314 да 7 мс на настольнай сістэме (Intel i2019) і з 1455 да 8 мс на мабільным прыладзе (HTC One MXNUMX).

Крыніца: opennet.ru

Дадаць каментар