| chapter | 27 |
|---|---|
| pageNumber | 307 |
| description | Comprender los motores de JavaScript y cómo ejecutan el código JavaScript. |
Un motor de JavaScript es un programa o intérprete que ejecuta código JavaScript. Los motores de JavaScript más conocidos son V8 (utilizado en Google Chrome y Node.js), SpiderMonkey (utilizado en Firefox) y JavaScriptCore (utilizado en Safari).
Los motores de JavaScript realizan varias tareas clave para ejecutar el código JavaScript de manera eficiente:
- Análisis: El motor analiza el código JavaScript en un árbol de sintaxis abstracta (AST).
- Compilación: Luego, el AST se compila en código de bytes o código de máquina.
- Ejecución: El código compilado es ejecutado por el motor.
A continuación se muestra un ejemplo sencillo para ilustrar el flujo de trabajo de un motor de JavaScript:
function agrega(a, b) {
return a + b;
}
console.log(agrega(2, 3)); // Salida: 5El motor primero analiza el código y lo convierte en un AST. Para el código anterior, el AST podría verse así:
Programacion
├── DeclaracionFuncion (agrega)
│ ├── Identificador (a)
│ ├── Identificador (b)
│ └── SentenciaDeBloque
│ └── SentenciaReturn
│ └── ExpresionBinaria (+)
│ ├── Identificador (a)
│ └── Identificador (b)
└── SentenciaExpresion
└── LlamadaExpresion (console.log)
└── LlamadaExpresion (agrega)
├── Literal (2)
└── Literal (3)
Luego, el AST se compila en código de bytes o código de máquina. Este paso implica optimizaciones para mejorar el rendimiento.
El motor ejecuta el código compilado. En este caso, se llama a la función add con los argumentos 2 y 3, y el resultado 5 se registra en la consola.
Los motores de JavaScript modernos utilizan la compilación Just-In-Time (JIT) para mejorar el rendimiento. La compilación JIT implica compilar el código en tiempo de ejecución, en lugar de antes de la ejecución. Esto permite que el motor optimice el código en función de los patrones de uso reales.
function multiplica(a, b) {
return a * b;
}
for (let i = 0; i < 1000000; i++) {
multiplica(2, 3);
}En este ejemplo, la función multiplica se llama repetidamente. Un compilador JIT puede optimizar la función después de detectar que es una función activa (es decir, que se llama con frecuencia).
Los motores de JavaScript también incluyen recolectores de basura para administrar la memoria. El recolector de basura libera automáticamente la memoria que ya no se utiliza, lo que evita fugas de memoria.
function creaObjeto() {
return { nombre: "Objeto" };
}
let obj = creaObjeto();
obj = null; // El objeto ahora es elegible para la recolección de basura.En este ejemplo, el objeto creado por creaObjeto es elegible para la recolección de basura después de que obj se establece en null.