Cloudflare, Mozilla y Facebook desarrollan BinaryAST para acelerar la carga de JavaScript

Ingenieros de Cloudflare, Mozilla, Facebook y Bloomberg propuesto nuevo formato binarioAST para acelerar la entrega y el procesamiento de código JavaScript al abrir sitios en un navegador. BinaryAST mueve la fase de análisis al lado del servidor y proporciona un árbol de sintaxis abstracta ya generado (AST). Al recibir un BinaryAST, el navegador puede pasar inmediatamente a la etapa de compilación, sin pasar por el análisis del código fuente de JavaScript.

Para las pruebas preparado Implementación de referencia suministrada bajo la licencia MIT. Los componentes de Node.js se utilizan para el análisis y el código para la optimización y la generación de AST está escrito en Rust. Soporte del lado del navegador
BinaryAST ya está disponible en construcciones nocturnas Firefox. El codificador en BinaryAST se puede usar tanto en el nivel de herramientas del sitio final como para empaquetar scripts de sitios externos en el lado de un proxy o red de entrega de contenido. Actualmente ya ha comenzado el proceso de estandarización de BinaryAST por parte del grupo de trabajo. ECMA TC39, después de lo cual el formato podrá coexistir con los métodos de compresión de contenido existentes, como gzip y brotli.

Cloudflare, Mozilla y Facebook desarrollan BinaryAST para acelerar la carga de JavaScript

Cloudflare, Mozilla y Facebook desarrollan BinaryAST para acelerar la carga de JavaScript

Al procesar JavaScript, se dedica una cantidad significativa de tiempo a la fase de carga y análisis del código. Teniendo en cuenta que el volumen de JavaScript descargado en muchos sitios populares se acerca a los 10 MB (por ejemplo, para LinkedIn - 7.2 MB, Facebook - 7.1 MB, Gmail - 3.9 MB), el procesamiento inicial de JavaScript introduce un retraso significativo. La etapa de análisis en el lado del navegador también se ralentiza debido a la incapacidad de construir completamente el AST sobre la marcha a medida que se carga el código (el navegador tiene que esperar a que los bloques de código completen la carga, como el final de las funciones, para obtener la información que falta para analizar los elementos actuales).

Están intentando resolver parcialmente el problema distribuyendo el código en forma minimizada y comprimida, así como almacenando en caché el código de bytes generado por el navegador. En los sitios modernos, el código se actualiza con bastante frecuencia, por lo que el almacenamiento en caché solo resuelve parcialmente el problema. WebAssembly podría ser una solución, pero requiere escribir explícitamente el código y no es muy adecuado para acelerar el procesamiento del código JavaScript existente.

Otra opción es entregar código de bytes compilado ya preparado en lugar de scripts JavaScript, pero los desarrolladores de motores de navegador están en contra porque el código de bytes de terceros es difícil de verificar, su procesamiento directo puede conducir a la estratificación web, surgen riesgos de seguridad adicionales y el desarrollo de Se requiere un formato de código de bytes universal.

BinaryAST le permite adaptarse a su modelo actual de desarrollo y entrega de código sin crear un nuevo código de bytes ni cambiar el lenguaje JavaScript. El tamaño de los datos en formato BinaryAST es comparable al código JavaScript reducido y comprimido, y la velocidad de procesamiento al eliminar la fase de análisis del texto fuente aumenta notablemente. Además, el formato permite la compilación en código de bytes a medida que se carga BinaryAST, sin esperar a que se completen todos los datos. Además, el análisis en el lado del servidor le permite excluir funciones no utilizadas y código innecesario de la representación BinaryAST devuelta, lo que, cuando se analiza en el lado del navegador, hace perder tiempo analizando y transmitiendo tráfico innecesario.

Una característica de BinaryAST es también la capacidad de restaurar JavaScript legible que no es exactamente igual a la versión original, pero es semánticamente equivalente e incluye los mismos nombres de variables y funciones (BinaryAST guarda nombres, pero no guarda información sobre posiciones en el código, formato y comentarios). La otra cara de la moneda es la aparición de nuevos vectores de ataque, pero, según los desarrolladores, son mucho más pequeños y más controlables que cuando se utilizan alternativas, como la distribución de códigos de bytes.

Las pruebas del código de facebook.com mostraron que el análisis de JavaScript consume entre el 10 y el 15 % de los recursos de la CPU y el análisis lleva más tiempo que la generación de código de bytes y la generación de código inicial para JIT. En el motor SpiderMonkey, el tiempo para construir completamente un AST toma entre 500 y 800 ms, y el uso de BinaryAST ha reducido esta cifra entre un 70 y un 90%.
En general, para la mayoría de los fuegos artificiales web, cuando se usa BinaryAST, el tiempo de análisis de JavaScript se reduce entre un 3% y un 10% en el modo sin optimización y entre un 90% y un 97% cuando el modo de ignorar funciones no utilizadas está habilitado.
Al ejecutar un conjunto de prueba de JavaScript de 1.2 MB, el uso de BinaryAST permitió que el tiempo de inicio se acelerara de 338 a 314 ms en un sistema de escritorio (Intel i7) y de 2019 a 1455 ms en un dispositivo móvil (HTC One M8).

Fuente: opennet.ru

Añadir un comentario