workers nodejs node napi commands and javascript c++ node.js v8 libuv

nodejs - ¿Cómo se interpreta y ejecuta el javascript asíncrono en Node.js?



node js verbose (1)

Básicamente lo que buscas es developers.google.com/v8/embed#templates . Expone todo su código C ++ como funciones de JavaScript a las que puede llamar desde la Máquina Virtual V8. Puede asociar devoluciones de llamada de C ++ cuando se invocan funciones o cuando se accede a propiedades de objetos específicos (Accesos de lectura e Interceptors ).

Encontré un artículo muy bueno que explica todo esto. ¿Cómo funciona NodeJS? . También explica cómo funciona libuv junto con Node para lograr la asincronía.

¡Espero que esto ayude!

He estado investigando mucho el núcleo de Node.js últimamente, y tengo algunas preguntas sobre el funcionamiento interno de la plataforma Node. Como lo entiendo, Node.js funciona así:

Node tiene una API, escrita en Javascript, que permite al programador interactuar con cosas como el sistema de archivos y la red. Sin embargo, toda esa funcionalidad se realiza en realidad mediante el código C / C ++, que también forma parte del nodo. Aquí es donde las cosas se ponen un poco borrosas. Entonces, el trabajo del motor Chrome V8 es esencialmente "compilar" (¿interpretar?) Javascript en el código de la máquina. V8 está escrito en C ++, y el lenguaje Javascript en sí está especificado por ECMA, por lo que se definen las palabras clave y las características del lenguaje. Esto me lleva a mis primeras preguntas:

  1. ¿Cómo puede la biblioteca estándar de nodos interactuar con los enlaces de nodos, ya que los enlaces de nodos están escritos en C ++?

  2. ¿Cómo interpreta Javascript el motor Chrome V8 en el contexto de Node? Sé que utiliza una técnica llamada JIT, que se mencionó en una pregunta similar: ( https://softwareengineering.stackexchange.com/questions/291230/how-does-chrome-v8-work-and-why-was-javascript-not-jit-compiled-in-the-first-pl ) Pero esto no explica cómo se interpreta Javascript en el contexto de Node. ¿Es el motor Chrome V8 que se envía con Node exactamente el mismo motor que se ejecuta en el navegador Chrome, o se ha modificado para que funcione con Node?

Eso me lleva a mi siguiente pregunta. Por lo tanto, Node incluye IO no bloqueado por eventos. Lo logra a través del Event Loop, que, aunque a menudo se lo denomina "Node Event Loop", es en realidad parte de la biblioteca libuv, una biblioteca C ++ diseñada para proporcionar IO asíncrono. En un nivel alto, al bucle de eventos se accede esencialmente a través de Callbacks, que es una característica nativa de Javascript y una de las razones por las que se eligió a Javascript como el idioma para el proyecto Node. A continuación se muestra una ilustración de cómo funciona el bucle de eventos:

Esto también se puede demostrar en vivo en este sitio pequeño y ordenado: http://latentflip.com/loupe/ Digamos que nuestra aplicación Node necesita hacer una llamada a una API externa. Así que escribimos esto:

request(..., function eyeOfTheTiger() { console.log("Rising up to the challenge of our rival"); });

Nuestra llamada a request se inserta en la pila de llamadas, y nuestra devolución de llamada se pasa a algún lugar, donde se guarda hasta que finaliza la operación de solicitud. Cuando lo hace, la devolución de llamada se pasa a la cola de devolución de llamada. Cada vez que se borra la pila de llamadas, el bucle de eventos empuja el elemento en la parte superior de la cola de devolución de llamada a la pila de llamadas, donde se ejecuta. Este bucle de eventos se ejecuta en un solo hilo. Cuando surgen problemas es cuando alguien escribe un código de "bloqueo" o un código que nunca abandona la pila de llamadas y que efectivamente ata el hilo. Si siempre hay un código ejecutándose en la pila de llamadas, entonces el bucle de eventos nunca empujará los elementos de la cola de devolución de llamadas a la pila de llamadas y nunca se ejecutarán, esencialmente congelando la aplicación. Esto me lleva a mi siguiente pregunta:

  1. Si el motor Chrome V8 interpreta el Javascript, ¿qué "controla" la inserción del código en la cola de devolución de llamada? ¿Cómo se maneja el código Javascript mediante el bucle de eventos libuv?

He encontrado esta imagen como una demostración del proceso:

Aquí es donde no estoy seguro de cómo interactúan exactamente el motor Chrome V8 y libuv. Me inclino a creer que los enlaces de nodos facilitan esta interacción, pero no estoy muy seguro de cómo. En la imagen de arriba, parece que los enlaces de NodeJS solo interactúan con el código de máquina que ha sido compilado desde Javascript por V8. Si es así, estoy confundido en cuanto a cómo el motor V8 interpreta el Javascript de tal manera que los enlaces de nodos pueden diferenciar entre la devolución de llamada y el código real para ejecutar inmediatamente.

Sé que esta es una serie de preguntas muy profundas y complicadas, pero creo que esto ayudará a aclarar mucha confusión para las personas que intentan entender Node.js, y también ayudará a los programadores a comprender las ventajas y desventajas de los eventos. IO sin bloqueo a un nivel más fundamental.

Actualización de estado: Acabo de ver una charla fantástica de una conferencia de Sencha ( enlace aquí ). Entonces, en esta charla, el presentador menciona la guía de incrustación V8 ( enlace aquí ) y habla sobre cómo las funciones de C ++ pueden exponerse a Javascript y viceversa. Básicamente, la forma en que funciona es que las funciones de C ++ pueden estar expuestas a V8 y también especifican cómo quiere que se expongan los objetos a Javascript, y el intérprete de V8 podrá reconocer sus funciones de C ++ incrustadas y ejecutarlas si encuentra que coincide con qué usted especificó. Por ejemplo, puede exponer variables y funciones a V8 que en realidad están escritas en C ++. Esto es esencialmente lo que hace Node.js; es capaz de agregar funciones como require en Javascript que realmente ejecutan el código C ++ cuando son llamadas. Esto aclara un poco la pregunta número 1, pero no muestra exactamente cómo funciona la biblioteca estándar de Node junto con V8. Todavía no está claro cómo libuv está interactuando con esto.