JavaScript Engine (V8)
Published: 2022-09-29 22:51:42

Con el nacimiento de las tecnologías web (HTTP, HTML, navegadores primitivos) las páginas web eran muy básicas y estáticas, solo se podia consumir texto e imágenes, nada como lo conocemos hoy en día. Los usuarios del navegador NetScape, dándose cuenta de la necesidad de evolucionar las páginas pidieron una mejora, y que las páginas web fueran dinámicas (que los usuarios pudieran interactuar con la página)
 
JavaScript fue creado por Brendan Eich, inspirado por otros lenguajes como Java, el propósito de JS fue dar solución a la problemática de las páginas estáticas.

El primer lenguaje (creado por Brendan Eich) que permitía darle un poco de interactividad a las páginas fue Mocha, este fue pensado para el navegador Netscape, que luego fue mejorando con el tiempo y ese mismo año lo sustituyó LiveScript. Luego, a finales del 95 surge de estos dos intentos finalmente JavaScript.

El nombre de JavaScript surge por motivos de marketing, ya que como el lenguaje Java estaba tomando fuerza en ese entonces, decidieron que este lenguaje tendría mejor aceptación si se le colocaba JavaScript (pero no son lo mismo, son dos lenguajes de programación totalmente diferentes. 

A medida que JavaScript se hizo popular, surgieron variaciones de este lenguaje, por ejemplo, en 1995 la empresa Microsoft decidió hacer su variación del lenguaje para utilizarlo en su navegador Internet Explorer. Pero la organización de estándares ECMA International (que en ese momento surgió como un comité) decidió que los navegadores solo iban a aceptar como lenguaje JavaScript ya que era muy peligroso que distintos navegadores tuvieran su propio lenguaje de programación, y que esta organización se iba a encargar de ir añadiendo los nuevos cambios que surgieran en el lenguaje y publicar sus estándares. 


## Motor V8

Primero veamos que es un motor de JavaScript:

> Un motor de JavaScript es un programa de computadora que ejecuta código JavaScript

Dicho de otra manera es aquel que se va a encargar de interpretar el código de JavaScript en el navegador.

Las empresas han desarrollado motores de javascript para poder interpretar el codigo en sus navegadores tales como: 

- JavaScriptCore (Apple) para Safari
- Chakra (Microsoft) para Edge hasta 2019, ahora usa V8
- SpiderMonkey (Mozilla) para Firefox
- V8 (Google) para Chrome
 
En el año 2008 surge el motor de JavaScript de Google que corre en el navegador, con el nombre V8 JavaScript Engine. Este motor fue un paso crucial en la historia de JavaScript ya que resolvió la problemática de la lentitud del tiempo de interpretación. 

La razón detrás de esta mejora tan grande radica principalmente en la combinación de intérprete y compilador. Hoy en día, los cuatro motores utilizan esta técnica. El intérprete ejecuta el código fuente casi de inmediato. El compilador traduce el código fuente en código máquina que el sistema del usuario ejecuta de manera directa.

Node.js es la forma como podemos trabajar JavaScript de lado del servidor y este también corre con el motor V8. 

## ¿Cómo funciona el JavaScript Engine?

Cuando estamos trabajando con JavaScript y queremos que la computadora entienda las instrucciones que va a ejecutar, va a ocurrir un error, ya que la computadora no entiende JavaScript, entonces, tenemos que convertir JavaScript a código binario, que es el lenguaje que entienden las computadoras.

Por fortuna, no tenemos que realizar esto manualmente ya que el motor V8 de JavaScript hace esta tarea por nosotros, convirtiendo JavaScript en código binario. 

JavaScript es un lenguaje interpretado, y compilado en tiempo real, esto significa que cuando el motor lo interpreta no tenemos que compilarlo previamente sino que compila el código al momento en que lo estamos ejecutando.

El motor V8 de Google para el navegador Chrome hace que JavaScript sea muchísimo más rápido. El mismo es Open Source, y por esto ciertos navegadores como Edge, Opera y Brave lo han implementado para la construcción de sus motores. También el navegador de Android está basado en V8.

## ¿Por qué nace V8? 

El motor de V8 nace con la finalidad de optimizar el rendimiento de la aplicación Google Maps en los navegadores, ya que la aplicación tenía un mejor o peor rendimiento dependiendo del motor, pero igualmente corría muy lenta.

Para esto, el equipo de Google creó un motor para Chrome que ejecutara muchisimo más rápido Google Maps, permitiendo a los usuarios hacer gran cantidad de cosas. Al probarlo, se dieron cuenta que la rapidez del motor para ejecutar Google Maps permitía además usar JavaScript para hacer aplicaciones con mucha más interacción. Por lo que desarrollaron un motor más robusto para que podamos construir productos web más robustos donde haya mucha interacción.

## Entendiendo el proceso de V8

Una vez que el motor corre el archivo de JavaScript, lo primero que hace es generar un entorno global, y procede a realizar 3 pasos. 

1. Dentro de este entorno, crea un objeto global conocido como window (en los navegadores es Window y en Node.js es global)
 
2. Genera la variable this, donde en este entorno (scope global) this hace referencia al objeto window.
  
3. Después de haber creado el entorno global y el objeto global, crea un contexto de ejecución en donde correrá el código a través de una pila de ejecución. (Call Stack) 

Luego, cuando JavaScript empiece a interactuar con el navegador ocurre un parseo (digamos que es una inspeccion) del documento completo para encontrar las keywords y mandarlas al Abstract Syntax Tree (AST), que es una estructura de árbol donde podemos ver como estan estructuradas las keywords (variables, funciones, objetos, todo en si) por dentro.

Ahora que tiene el árbol sintáctico listo con las keywords desestructuradas, comienza a interpretar el código y lo convierte en bytecode (que no es tan bajo como machine code, pero la máquina si puede entenderlo).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wo4ijicpsgbldcsog7fo.png)



Finalmente antes de convertirlo en bytecode, puede ocurrir un paso interior donde si el motor detecta que el código puede ser optimizado (debido a que hayan variables repetidas, funciones declaradas, y errores en el código) por el motor en un intento de ayudarnos a que no ocurran errores, y una vez que lo optimiza, lo compila y lo convierte en bytecode. En este proceso puede ocurrir el Hoisting donde una variable (sucede mas que todo con var y function) es subida y guardada en memoria antes de ejecutar cualquier tipo de código, y puede devolvernos un comportamiento erróneo de nuestro código. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tmwu7cj9wmr3fe2j1v1k.png)

Esta fue una pequeña introducción a que es el motor v8 y su función a la hora de ejecutar código JavaScript.

articulos para profundizar:

- [Under the Hood of the V8 Engine](https://www.freecodecamp.org/news/javascript-under-the-hood-v8/)

- [How V8 JavaScript engine works step by step](https://cabulous.medium.com/how-v8-javascript-engine-works-5393832d80a7)
- [Fundamentos de JavaScript](https://www.campusmvp.es/recursos/post/fundamentos-de-javascript-por-que-deberias-saber-como-funciona-el-motor.aspx)