Inženirji iz podjetij Cloudflare, Mozilla, Facebook in Bloomberg nov format za pospešitev dostave in obdelave JavaScript kode pri odpiranju spletnih strani v brskalniku. BinaryAST premakne fazo sintaktične analize na strežnik in dostavi že oblikovano abstraktno sintaktično drevo (). Ob prejemu BinaryAST lahko brskalnik takoj preide na fazo prevajanja, pri čemer izpusti analizo izvorne JavaScript kode.
Za testiranje referenčna implementacija, izdana pod licenco MIT. Za analizo se uporabljajo komponente Node.js, koda za optimizacijo in oblikovanje AST pa je napisana v jeziku Rust. Podpora zanje v brskalnikih
je že na voljo v Firefoxu. Kodirnik v BinaryAST se lahko uporablja tako na nivoju orodij končne strani, kot tudi za pakiranje skript zunanjih strani na strani proxy ali omrežje za dostavo vsebin. Proces standardizacije BinaryAST je že prižgan v delovni skupini , po zaključku katere bo format lahko soexistedral s trenutnimi metodami stiskanja posredovane vsebine, kot sta gzip in brotli.
Znaten del časa pri obdelavi JavaScripta zavzame faza nalaganja in sintaktične analize kode. Glede na to, da se količina nalagane JavaScript kode na mnogih priljubljenih spletnih straneh približuje 10 MB (na primer LinkedIn – 7,2 MB, Facebook – 7,1 MB, Gmail – 3,9 MB) začetna obdelava JavaScripta povzroča opazne zamude. Faza analize na strani brskalnika se prav tako upočasnjuje zaradi nezmožnosti popolnega oblikovanja AST v živo, med nalaganjem kode (brskalnik mora čakati na zaključek nalaganja kodnih blokov, npr. konca funkcij, da bi pridobil manjkajoče informacije za analizo trenutnih elementov).
Delno se problem rešuje z razširitvijo kode v minimizirani in stisnjeni obliki, ter z uporabo predpomnjenja brskalnika generiranega bajtkoda. Na sodobnih spletnih straneh se koda dovolj pogosto posodablja, zato predpomnjenje le delno rešuje problem. Možna rešitev bi lahko bil WebAssembly, vendar zahteva uporabo eksplicitnega tipiziranja v kodi in slabo ustreza za pospešitev obdelave že obstoječe kode v JavaScriptu.
Druga možnost je dostava že skompilirane bajtkode namesto JavaScript skript, vendar se razvijalci brskalnikov temu upirajo, saj je tretja bajtkoda težko preverljiva, njena neposredna obdelava lahko privede do razslojevanja spleta, pojavijo se dodatne varnostne grožnje in potrebna je razvoj univerzalne bajtkodne oblike.
BinaryAST omogoča vključitev v trenutni model razvoja in dostave kode brez ustvarjanja nove bajtkode in brez spremembe jezika JavaScript. Velikost podatkov v formatu BinaryAST je primerljiva s stisnjenim minificiranim JavaScript kodom, hitrost obdelave pa se zahvaljujoč izključitvi faze razčlenjevanja izvirnih besedil znatno povečuje. Poleg tega format omogoča izvajanje kompilacije v bajtkodo med nalaganjem BinaryAST, ne da bi bilo potrebno čakati na zaključek pridobivanja vseh podatkov. Prav tako strežniško razčlenjevanje omogoča, da se iz danega prikaza BinaryAST izključijo neoprijemljive funkcije in odvečna koda, na katero se pri razčlenjevanju v brskalniku porabi čas tako za analizo kot za prenos odvečnega prometa.
Značilnost BinaryAST je tudi možnost obnove berljivega JavaScript-a, ki se ne ujema natančno z izvirno različico, ampak je semantično ekvivalenten in vključuje ista imena spremenljivk in funkcij (BinaryAST ohranja imena, vendar ne ohranja informacij o pozicijah v kodi, oblikovanju in komentarjih). Slaba stran tega je pojav novih vektorjev za napade, vendar so po mnenju razvijalcev ti precej manjši in bolj obvladljivi kot pri uporabi alternativ, kot je širjenje bajtkode.
Testi kode facebook.com so pokazali, da razčlenjevanje JavaScript-a porabi 10-15% CPU virov in da razčlenjevanje vzame več časa kot generiranje bajtkode in začetno oblikovanje kode za JIT. V motorju SpiderMonkey celoten čas izdelave AST traja 500-800 ms, uporaba BinaryAST pa je omogočila zmanjšanje te vrednosti za 70-90%.
Na splošno za večino spletnih okvirjev se pri uporabi BinaryAST čas razčlenjevanja JavaScript-a skrajša za 3-10% v načinu brez optimizacije in za 90-97% pri vklopu načina ignoriranja neoprijemljivih funkcij.
Pri izvajanju testnega JavaScript niza, velikosti 1,2 MB, je uporaba BinaryAST omogočila skrajšanje časa za zagon z 338 na 314 ms na namiznem sistemu (Intel i7) in z 2019 na 1455 ms na mobilni napravi (HTC One M8).
Izvor: opennet.ru
