Ingeniørar frå selskapa Cloudflare, Mozilla, Facebook og Bloomberg nytt format for å akselerere levering og behandling av JavaScript-kode ved opning av nettsider i nettlesaren. BinaryAST flyttar syntakanalyse- fase til serveren og leverer eit ferdig samansett abstrakt syntaks-tre (). Ved mottaking av BinaryAST kan nettlesaren straks gå vidare til kompilering, utan å måtte parse JavaScript-koden.
For testing referanseimplementasjonen, levert under MIT-lisens. For parsing bruker ein komponentar frå Node.js, medan koden for optimalisering og dannelse av AST er skriven på Rust. På nettlesarsida er støtta
BinaryAST allereie tilgjengeleg i Firefox. Kodaren i BinaryAST kan brukast både på nivået av slutterverktøyet til den enkelte nettsida, og for pakking av skript frå eksterne nettsider på proxiesida eller innhaldleveringsnett. Prosessen med å standardisere BinaryAST er allereie starta av arbeidsgruppa , etter at denne prosessen er avslutta kan formatet sameksistere med eksisterande metoder for komprimering av leverandert innhald, som gzip og brotli.
Betydelig tid i behandlingen av JavaScript kjem frå lastinga og syntakanalyse av koden. Tatt i betraktning at omfanget av lasta JavaScript på mange populære nettsider nærmar seg 10 MB (for eksempel for LinkedIn - 7,2 MB, Facebook - 7,1 MB, Gmail - 3,9 MB), føregår den initiale behandlingen av JavaScript med eit vesentleg etterslep. Parsing-fasen på nettlesersida blir også forsinka på grunn av umogleik til å bygge AST på farten, ettersom nettlesaren må vente på at heile kodebitar blir lasta, for eksempel enden av funksjonar, for å få den manglande informasjonen som er nødvendig for parsing av dei aktuelle elementa.
Ein prøver delvis å løyse problemet ved å distribuere koden i minimalisert og komprimert form, samt ved hjelp av nettlesark caching av generert bytekode. På moderne nettsider blir koden oppdatert ganske ofte, så caching løyser berre delvis problemet. Ein mogleg løysing kunne vore WebAssembly, men dette krever bruk av eksplisitt type i koden og passar dårleg for å akselerere behandlingen av eksisterande JavaScript-kode.
Et annet alternativ er å levere den ferdig kompilert bytekoden i stedet for JavaScript-skript, men utviklerne av nettlesermotorene er imot dette, fordi tredjeparts bytekode er vanskelig å verifisere, direkte behandling kan føre til oppdeling av Web, og det oppstår ekstra sikkerhetstrusler samt behov for utvikling av et universelt bytekodeformat.
BinaryAST lar seg integrere i den nåværende modellen for utvikling og levering av kode uten å opprette en ny bytekode og uten å endre JavaScript-språket. Datastørrelsen i BinaryAST-formatet er sammenlignbar med komprimert minifisert JavaScript-kode, og behandlingshastigheten øker betydelig ved å utelate parsing-fasen av kildekodene. I tillegg gjør formatet det mulig å kompilere til bytekode mens BinaryAST lastes, uten å måtte vente på fullstendig mottak av alle data. Server-side parsing lar også fjerne unødvendige funksjoner og overflødig kode fra det som leveres i BinaryAST, noe som sparer tid på både parsing og overføring av unødvendig trafikk.
En egenskap ved BinaryAST er også muligheten til å gjenskape lesbar JavaScript som ikke er identisk med den opprinnelige varianten, men som er semantisk ekvivalent og inkluderer de samme variablene og funksjonsnavnene (BinaryAST opprettholder navnene, men lagrer ikke posisjonsinformasjon i koden, formatering eller kommentarer). Den negative siden er fremveksten av nye vektorer for angrep, men ifølge utviklerne er disse betydelig færre og mer kontrollerbare enn ved bruk av alternativer, for eksempel spredd bytekode.
Tester av facebook.com viste at parsing av JavaScript tar 10-15% av CPU-ressursene, og at parsing tar mer tid enn generering av bytekode og initial koding for JIT. I SpiderMonkey-motoren tar full bygging av AST 500-800 ms, og anvendelse av BinaryAST gjorde det mulig å redusere denne tiden med 70-90%.
Generelt reduseres parsingtiden for JavaScript med 3-10% for de fleste web-rammeverk ved bruk av BinaryAST, og med 90-97% ved aktivering av modusen som ignorerer ubrukte funksjoner.
Ved utførelsen av et testsett med JavaScript på 1,2 MB, gjorde bruken av BinaryAST at oppstartstiden ble redusert fra 338 ms til 314 ms på en stasjonær datamaskin (Intel i7) og fra 2019 ms til 1455 ms på en mobil enhet (HTC One M8).
Kilde: opennet.ru
