Firefox 70 llegara con un interprete de Javascript mejorado
Es de conocimiento común que las aplicaciones web modernas ejecutan mucho más código JavaScript que hace unos años. Aunque los compiladores han seguido rápidamente la tendencia y han hecho que JavaScript sea eficiente, para Mozilla se debe implementar una solución para manejar esta carga de trabajo aun mejor.
Para hacer esto, Mozilla ha desarrollado y agregado un nuevo intérprete de código de bytes de JavaScript a su motor de representación de JavaScript integrado en Firefox 70. Con Firefox 70 disponible para el próximo mes de octubre, Mozilla anuncia una mejor administración del código JavaScript con utilizando su nuevo intérprete de código agregado a su motor de JavaScript.
Para lograr este objetivo, Mozilla explica que en los motores JavaScript modernos, cada función se ejecuta inicialmente en un intérprete de código.
Las funciones que se llaman mucho se compilan en código máquina nativo. Esto se llama compilación JIT o compilación sobre la marcha. En cuanto a Firefox, también incluye un intérprete de código JavaScript escrito en C ++ y varios niveles de compilación JIT.
Primero, tenemos un compilador JIT básico que compila cada instrucción de bytecode directamente en un pequeño trozo de código de máquina utilizando el almacenamiento en caché en línea tanto para el rendimiento como para la recopilación de información para el compilador JIT llamado IonMonkey o Ion.
A su vez, el compilador IonMonkey utiliza optimizaciones avanzadas para generar código rápido para opciones críticas.
Cabe señalar que cuando una función que ya se está compilando se llama con un nuevo tipo de argumentos, el código de la función se puede “desoptimizar” y descartar. En este caso, la ejecución continúa en el código base hasta la próxima compilación de Ion.
Aunque este proceso de interpretación del código JavaScript ha funcionado bastante bien hasta ahora, el equipo de Firefox explica que ha encontrado algunos problemas con la primera parte compuesta por el intérprete C ++ y el compilador JIT base.
De hecho, algunas aplicaciones web modernas como Google Docs o Gmail ejecutan tanto JavaScript que el compilador base e incluso el compilador JIT podrían pasar mucho tiempo tratando de compilar miles de funciones.
Además, el intérprete de C ++ ha sido muy lento y no recopila información de tipo, lo que retrasa la compilación básica. Una solución habría sido sacarlo del hilo, pero eso habría sido un riesgo de rendimiento.
Para resolver estos problemas, la gente de Mozilla comenta que:
El intérprete base está entre el intérprete C ++ y el compilador JIT base y contiene elementos de ambos niveles.
Ejecuta todas las instrucciones de código de bytes con un bucle de intérprete fijo (como el intérprete de C ++), y utiliza técnicas de almacenamiento en caché en línea para mejorar el rendimiento y recopilar información de tipo (como lo hace el JIT básico).
Generar un intérprete no es una idea nueva. Pero el equipo de Firefox señala aquí que ha encontrado una nueva forma de hacer esto reutilizando la mayoría del código básico del compilador JIT. El compilador JIT básico es un modelo JIT, lo que significa que cada instrucción de código intermedio se compila en una secuencia sustancialmente fija de instrucciones de máquina que luego se sugieren en un bucle de interpretación.
Además, dado que los desarrolladores de Firefox querían que el intérprete base usara exactamente los mismos cachés en línea y la misma información que JIT, se agregó una nueva estructura de datos llamada JitScript.
JitScript contiene toda la información de tipo y las estructuras de datos de almacenamiento en caché en línea utilizadas por los intérpretes base y el compilador JIT.
Con estas nuevas implementaciones, los datos básicos del compilador para una función ahora están solo en código máquina. A partir de ahí, toda la información en caché y los datos de creación de perfiles se han trasladado a JitScript.
Por otra parte dado que el intérprete base y el compilador JIT son idénticos, gran parte del código generado también se puede compartir.
Para hacer esto, se creó una clase base llamada BaselineCodeGen con otras 2 clases derivadas. El compilador base utiliza la primera clase BalineCompiler para compilar el código de bytes de un script en código máquina.
La segunda clase BaselineInterpreterGenerator se usa para generar el código para el intérprete base. Y con la clase BaselineInterpreterGenerator , el equipo de Firefox logró construir el intérprete base.
Fuente: https://hacks.mozilla.org/