¿Cuál es la relación entre Node.js y V8?

Node.js es un entorno de tiempo de ejecución JavaScript back-end, multiplataforma y de código abierto creado en el motor V8 y ejecuta el código Javascript fuera del navegador. Un entorno de tiempo de ejecución de Javascript contiene todos los componentes necesarios para ejecutar el código JS. JavaScript se diseñó inicialmente para ejecutarse solo en el navegador. Todos los navegadores están equipados con motores de JavaScript para ejecutar JavaScript. Por ejemplo, Mozilla Firefox funciona con Spidermonkey, mientras que Chrome usa el motor V8.Los motores JavaScript no son máquinas, sino programas o intérpretes que ejecutan código JavaScript y permiten que las computadoras realicen tareas específicas a nivel de hardware. Ryan Dahl creó Node.js cuando se dio cuenta del potencial del motor V8 en el navegador Chrome y lo amplió para ejecutarlo como una aplicación independiente. Las computadoras solo pueden interpretar código de máquina y Javascript es un lenguaje de alto nivel, por lo que necesitamos un compilador para traducir Javascript a código de máquina. Node.js es solo un entorno de tiempo de ejecución que admite la ejecución de un programa. V8 es el núcleo de Node.js.

Node.js no puede ejecutarse sin V8. Dado que no habría un motor de JavaScript, ningún JS puede ejecutarse en dicho entorno. El motor Chrome V8 toma el código Javascript legible por humanos y lo traduce a un código de máquina más optimizado. Es un programa multihilo de código abierto escrito en C++. Inicialmente, el motor se diseñó únicamente para que lo ejecutaran los navegadores web, pero las últimas versiones también ejecutan código JS fuera del navegador, lo que permite la creación de secuencias de comandos del lado del servidor. Es independiente del navegador en el que se ejecuta. Esta característica inspiró a los diseñadores a optar por el motor V8 para impulsar Node.js. Node.js está escrito en C++. El motor V8 está integrado dentro del código node.js, lo que agrega características adicionales al código. Como resultado, el código C++ comprende más de lo que especifica el estándar ECMAScript. El motor V8 y node.js son interoperables. Juntos,El motor V8 es el corazón de Node.js.  

Funcionamiento del motor V8: los motores Js eran intérpretes anteriores, ejecutando el código línea por línea, sin necesidad de compilación, lo que hace que el proceso sea muy lento ya que cada declaración se analiza antes de la ejecución para realizar la tarea deseada. A medida que apareció V8, resolvió este problema mediante el uso de subprocesos separados para acelerar el proceso de compilación. V8 emplea una técnica de Just in Time (JIT)compilador. Los compiladores justo a tiempo combinan las mejores características de los intérpretes y compiladores, lo que hace que tanto la traducción como la ejecución sean más rápidas. El intérprete ejecuta el código línea por línea y el código compilado se optimiza (y se vuelve a optimizar) dinámicamente en tiempo de ejecución. Ahora, la pregunta es si Javascript es un lenguaje interpretado o compilado. Javascript puede ser un lenguaje interpretado o compilado, según el motor JS.  

V8 utiliza los siguientes subprocesos.  

1. Subproceso principal: el subproceso FETCH realiza la tarea principal de obtener el código y asegurarse de que se compila y ejecuta.

2. Subprocesos del compilador: las versiones anteriores de V8 usaban dos subprocesos para la compilación.

  • El Full-codegen: Esto compila el JS en un código de máquina simple y relativamente lento. Con full-codegen, JavaScript analizado se traduce directamente a código de máquina sin ninguna transformación. Por lo tanto, es muy rápido ejecutar código máquina.
  • Crankshaft: compila segmentos de código que se ejecutan varias veces, a menudo llamados secciones activas, de manera óptima, para ejecutarlos de manera más eficiente la próxima vez que se alcance esta parte del código.

Este hilo sufre ciertas optimizaciones.  

  • En línea: la llamada de una función se reemplaza con el código de la función, lo que mejora el rendimiento.
  • Clases ocultas: JavaScript es un lenguaje dinámico, por lo que las propiedades se pueden agregar o eliminar fácilmente. Hacer un seguimiento de cada propiedad se vuelve costoso, por lo tanto, utiliza el método de clases ocultas. Se agrega una ruta de transición a una nueva clase oculta a la antigua clase oculta de cada objeto cuando se agrega una nueva propiedad.
  • Almacenamiento en caché en línea: V8 mantiene un caché de los tipos de objetos que se pasaron como parámetros en llamadas de métodos recientes y usa esos datos para adivinar qué tipo de objetos se pasarán en el futuro.

3. Subprocesos del perfilador : informa al tiempo de ejecución qué métodos consumen la mayor parte de nuestro tiempo, para que Crankshaft pueda optimizarlos.

4. Subprocesos basura : libera espacio para la gestión de la memoria utilizando el algoritmo de marca y barrido

Veamos cómo el motor V8 ejecuta el código JS escrito dentro de Node.js

Ejecución de Javascript en node.js 

1. Análisis: el código fuente de Javascript se analiza y convierte al árbol de sintaxis abstracta (AST). El código se divide en tokens. El token es el componente básico de nuestro código, cualquier cosa que constituya el código. Por ejemplo, sea a = 5. Aquí, sea a, =, 5 son tokens.

let a = 5 

 Ast juega un papel crucial en el análisis semántico de un programa, ya que el compilador verifica la exactitud y el uso correcto de las aplicaciones y los elementos del lenguaje. 

Veamos la representación de un AST con el siguiente ejemplo: 

const blog = "GeeksforGeeks"

Representación AST 

Representación AST en JSON 

{
  "type": "Program",
  "start": 0,
  "end": 28,
  "body": [
    {
      "type": "VariableDeclaration",
      "start": 0,
      "end": 28,
      "declarations": [
        {
          "type": "VariableDeclarator",
          "start": 6,
          "end": 28,
          "id": {
            "type": "Identifier",
            "start": 6,
            "end": 10,
            "name": "blog"
          },
          "init": {
            "type": "Literal",
            "start": 13,
            "end": 28,
            "value": "GeeksforGeeks",
            "raw": "\"GeeksforGeeks\""
          }
        }
      ],
      "kind": "const"
    }
  ],
  "sourceType": "module"
}

2. Compilación : Ignition genera un código intermedio llamado código Byte a partir del árbol de sintaxis.

3. Ejecución : Turbofan convierte este código de bytes en un código de máquina altamente optimizado. El código máquina se ejecuta en el sistema.  

Entonces, hemos entendido la relación entre Node.js y el motor V8 y llegamos a la conclusión de que es imposible ejecutar Node.js sin un motor de JavaScript como V8.  

Publicación traducida automáticamente

Artículo escrito por riyaa7vermaa y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *