Ingenieurs van de bedrijven Cloudflare, Mozilla, Facebook en Bloomberg een nieuw formaat om de levering en verwerking van JavaScript-code bij het openen van websites in de browser te versnellen. BinaryAST verplaatst de fase van syntactische analyse naar de serverzijde en levert reeds gevormde abstracte syntaxisbomen (). Bij ontvangst van BinaryAST kan de browser direct overgaan tot de compilatiefase, waarbij de parsing van de oorspronkelijke JavaScript-code wordt overgeslagen.
Voor testing de referentie-implementatie, geleverd onder de MIT-licentie. Voor de parsing worden componenten van Node.js gebruikt, en de code voor optimalisatie en het vormen van de AST is geschreven in Rust. Aan de browserzijde is de ondersteuning voor
BinaryAST al beschikbaar in Firefox. De encoder in BinaryAST kan zowel op het niveau van de hulpmiddelen van de eindwebsite als bij het inpakken van scripts van externe websites aan de proxy- of content delivery networkzijde worden toegepast. Momenteel is het proces van standaardisatie van BinaryAST al begonnen door de werkgroep , na voltooiing waarvan het formaat kan samenleven met de bestaande methoden voor compressie van geleverd content, zoals gzip en brotli.
Een aanzienlijk deel van de tijd die nodig is voor het verwerken van JavaScript gaat op aan de fase van laden en syntactische analyse van de code. Gezien het feit dat de hoeveelheid gedownloade JavaScript op veel populaire websites bijna 10 MB benadert (bijvoorbeeld voor LinkedIn - 7,2 MB, Facebook - 7,1 MB, Gmail - 3,9 MB) beïnvloedt de initiële verwerking van JavaScript de vertraging aanzienlijk. De parsingfase aan de browserzijde wordt ook vertraagd door de onmogelijkheid om een volledige AST on-the-fly op te bouwen, terwijl de code wordt geladen (de browser moet wachten op de voltooiing van het laden van blokken code, zoals het einde van functies, om de informatie te verkrijgen die ontbreekt voor de parsing van de huidige elementen).
De oplossing voor het probleem wordt deels gezocht door de code in een geminimaliseerde en gecomprimeerde vorm te verspreiden, evenals door het cachen van de door de browser gegenereerde bytecode. Op moderne websites wordt de code vrij vaak bijgewerkt, waardoor caching het probleem slechts gedeeltelijk oplost. Een mogelijke oplossing zou WebAssembly kunnen zijn, maar dit vereist expliciete typificatie in de code en is slecht geschikt voor het versnellen van de verwerking van al bestaande JavaScript-code.
Een andere optie is het leveren van kant-en-klare gecompileerde bytecode in plaats van JavaScript-scripts, maar de ontwikkelaars van browserengines zijn hiertegen, omdat externe bytecode moeilijk te verifiƫren is. Directe verwerking kan leiden tot een versplintering van het web, er ontstaan extra beveiligingsbedreigingen en er is de ontwikkeling van een universeel bytecodeformaat nodig.
BinaryAST past in het huidige model van ontwikkeling en levering van code zonder een nieuwe bytecode te creƫren en zonder de JavaScript-taal aan te passen. De datagrootte in het BinaryAST-formaat is vergelijkbaar met gecomprimeerde, geminimaliseerde JavaScript-code, en de verwerkingssnelheid neemt aanzienlijk toe door het uitsluiten van de parsingfase van de bronbestanden. Bovendien maakt het formaat compilatie naar bytecode mogelijk tijdens het laden van BinaryAST, zonder te wachten op de voltooiing van het ontvangen van alle gegevens. Verder maakt server-side parsing het mogelijk om niet-gebruikte functies en overbodige code uit de gegeven BinaryAST-voorstelling te sluiten, wat tijd bespaart bij parsing aan de browserkant, zowel bij parsing als bij het overdragen van overbodig verkeer.
Een kenmerk van BinaryAST is ook de mogelijkheid om leesbare JavaScript te herstellen dat niet letterlijk overeenkomt met de oorspronkelijke versie, maar semantisch gelijkwaardig is en dezelfde variabele- en functienamen bevat (BinaryAST behoudt namen, maar niet de informatie over posities in de code, opmaak en opmerkingen). De keerzijde is de verschijning van nieuwe aanvalsvectoren, maar volgens de ontwikkelaars zijn deze aanzienlijk minder en beter controleerbaar dan bij alternatieven zoals de verspreiding van bytecode.
Code-tests op facebook.com hebben aangetoond dat 10-15% van de CPU-bronnen wordt besteed aan het parseren van JavaScript, en dat het parseren meer tijd kost dan het genereren van bytecode en het initiƫle vormen van code voor JIT. In de SpiderMonkey-engine duurt het volledige bouwen van de AST 500-800 ms, en het gebruik van BinaryAST heeft dit percentage met 70-90% verminderd.
Over het algemeen wordt de parsingtijd van JavaScript voor de meeste webframeworks met 3-10% verkort wanneer BinaryAST wordt gebruikt in de modus zonder optimalisatie en met 90-97% wanneer de modus voor het negeren van niet-gebruikte functies is ingeschakeld.
Bij het uitvoeren van een testset van 1,2 MB aan JavaScript, heeft het gebruik van BinaryAST de opstarttijd versneld van 338 ms naar 314 ms op een desktop systeem (Intel i7) en van 2019 ms naar 1455 ms op een mobiel apparaat (HTC One M8).
Bron: opennet.ru
