Estoy confundido acerca de cómo funciona v8 y cómo ejecuta el código js.
Entiendo que v8 primero analiza el código y crea AST, luego toma este AST presentándolo al intérprete como entrada y produce un código de bytes, luego este código de bytes se introduce en el compilador turbofan que convierte este código intermedio en un código de máquina que la computadora entiende.
Estoy leyendo un articulo sobre este tema que es bueno pero resulto que algo me confunde
- Fase de ejecución: el código de bytes se ejecuta utilizando el montón de memoria y la pila de llamadas del entorno de tiempo de ejecución del motor V8.
Pensé que el código de máquina es el que se ejecuta, de lo contrario, ¿por qué necesitamos crear ese código si el código de bytes es el que se ejecuta?
(Desarrollador V8 aquí.)
Para confirmar lo que dijo @Bergi en sus comentarios: el código de bytes sirve principalmente para que el intérprete lo ejecute y, de hecho, eso es todo lo que se necesita para ejecutar JavaScript. V8 (hoy en día) no compila todas las funciones en código de máquina, solo aquellas que se ejecutan lo suficientemente calientes para una compilación optimizada (probablemente) valgan la pena la inversión de tiempo. Como detalle particular de la implementación, el compilador de optimización usa el código de bytes como entrada, lo que le da al código de bytes un propósito secundario; pero eso es solo un detalle que podría haberse resuelto de manera diferente, como analizar la fuente original en un AST nuevamente cuando se activa el compilador de optimización, que es como solía hacerlo V8 hasta hace un par de años.
(El artículo al que se vinculó menciona la mayoría de estos conceptos, pero estoy de acuerdo en que está escrito de manera algo confusa y no estoy de acuerdo con algunas de sus caracterizaciones. Consulte v8.dev/blog para obtener descripciones oficiales de cómo funcionan las cosas).