Cloudflare, Mozilla og Facebook udvikler BinaryAST for at accelerere indlæsningen af JavaScript

Ingeniører fra selskaper som Cloudflare, Mozilla, Facebook og Bloomberg blev bedt om nyt format BinaryAST for at fremskynde levering og behandling af JavaScript-kode, når man åbner websteder i browseren. BinaryAST flytter syntaksanalysens fase til serveren og leverer allerede et dannet abstrakt syntakstræ (AST). Ved modtagelse af BinaryAST kan browseren straks gå videre til kompilering, uden at skulle parse den oprindelige JavaScript-kode.

Til testformål udviklet den referenceimplementering, der leveres under MIT-licens. Til parsing anvendes komponenter fra Node.js, og koden til optimering og dannelse af AST er skrevet i Rust. På browser-siden er understøttelsen
af BinaryAST allerede tilgængelig i nattelige builds Firefox. Koderen i BinaryAST kan anvendes både på niveauet af det endelige webstedstool og til pakning af scripts fra eksterne websteder på proxy- eller indholdsleveringsnetværk. Processen med at standardisere BinaryAST er allerede begyndt af arbejdsgruppen ECMA TC39, efter afslutningen af hvilken formatet vil kunne sameksistere med eksisterende metoder til komprimering af leveret indhold, såsom gzip og brotli.

Cloudflare, Mozilla og Facebook udvikler BinaryAST for at accelerere indlæsningen af JavaScript

Cloudflare, Mozilla og Facebook udvikler BinaryAST for at accelerere indlæsningen af JavaScript

Betydelig tid ved behandling af JavaScript bruges på indlæring og syntaksanalyse af koden. Da mængden af indlæst JavaScript på mange populære websteder nærmer sig 10 Mb (for eksempel LinkedIn — 7.2 Mb, Facebook — 7.1 Mb, Gmail — 3.9 Mb), bidrager den primære behandling af JavaScript til betydelige forsinkelser. Syntaksanalysens fase i browseren er også langsommere på grund af manglende mulighed for at konstruere AST dynamisk, mens koden indlæses (browseren er nødt til at vente på, at blokke af kode indlæses, for eksempel slutningen af funktioner, for at få den manglende information til at analysere de aktuelle elementer).

Delvis forsøger man at løse problemet ved at distribuere koden i minimeret og komprimeret form samt ved hjælp af browserens caching af genereret bytekode. På moderne websteder opdateres koden ganske ofte, så caching løser blot problemet delvis. En løsning kunne være WebAssembly, men det kræver brug af eksplicit typificering i koden og egner sig dårligt til at fremskynde behandlingen af allerede eksisterende JavaScript-kode.

En anden mulighed er at levere den færdige kompilerede bytekode i stedet for JavaScript-scripts, men udviklerne af browser-motorer er imod dette, da tredjeparts bytekode er svær at verificere, dets direkte behandling kan føre til en fragmentering af nettet, der opstår yderligere sikkerhedstrusler, og der kræves udvikling af et universelt bytecode-format.

BinaryAST passer ind i den eksisterende model for udvikling og levering af kode uden at skabe ny bytekode og uden at ændre JavaScript-sproget. Dataens størrelse i BinaryAST-formatet svarer til komprimeret og minificeret JavaScript-kode, og behandlingshastigheden stiger betydeligt ved at undgå faseparsing af kildekoder. Desuden giver formatet mulighed for at udføre kompilation til bytekode, mens BinaryAST indlæses, uden at vente på, at alle data er modtaget. Server-side parsing muliggør også at udelade ubrugte funktioner og unødvendig kode fra det leverede BinaryAST, hvilket sparer tid i parsingen såvel som på unødvendig trafik.

Et særligt kendetegn ved BinaryAST er muligheden for at genskabe læsbar JavaScript, som ikke er identisk med den oprindelige version, men semantisk ækvivalent og inkluderer de samme variabel- og funktionsnavne (BinaryAST bevarer navne, men ikke positionsinformation i koden, formatering eller kommentarer). Bagsiden af medaljen er, at der opstår nye angrebsvektorer, men ifølge udviklerne er de væsentligt færre og mere kontrollerbare end ved brug af alternativer som udbredelse af bytekode.

Tests af koden fra facebook.com har vist, at der bruges 10-15 % CPU-ressourcer på at parse JavaScript, og at parsing tager længere tid end generering af bytekode og den indledende dannelse af kode til JIT. I SpiderMonkey-motoren tager den samlede tid til at opbygge AST 500-800 ms, og brugen af BinaryAST har reduceret denne tid med 70-90 %.
Generelt reduceres parsingtiden for JavaScript for det meste web-frameworks med 3-10 % i ikke-optimeret tilstand og med 90-97 % ved aktivering af tilstanden, der ignorerer ubrugte funktioner.
Ved udførelsen af et test JavaScript-sæt på 1,2 MB, gjorde brugen af BinaryAST det muligt at reducere opstartstiden fra 338 til 314 ms på en desktop-system (Intel i7) og fra 2019 til 1455 ms på en mobil enhed (HTC One M8).

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster