Ingenieros de Cloudflare, Mozilla, Facebook y Bloomberg
Para las pruebas
BinaryAST ya está disponible en
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