Cuando JavaScript se ejecuta en Node en un servidor back-end, necesita hacer cosas muy diferentes a lo que JavaScript necesitaría hacer si se ejecuta en el navegador en tu computadora, libre para acceder a un sitio web. Para hacer esto, es cuando el runtime implementa estas APIs, y para hacer eso, en tu código de bajo nivel, podrías definir una función, y luego después de eso, harías dos cosas. Definirías un binding, que te permite exponer esa función que escribes en C++, o C, u otro lenguaje de bajo nivel, y luego dos, después de definir el binding, puedes llamarlo en JavaScript. Así que hablamos de Node en el navegador. ¿Cuáles son algunas APIs comunes de runtime para Node? En Node, quieres poder acceder al sistema de archivos con FS, quieres obtener información a nivel de sistema como información de CPU o memoria, puedes hacerlo con la API de OS, y luego también quieres crear servicios usando HTTP y HTTPS. Si estás usando JavaScript en un navegador, y estás en un runtime de navegador, quieres hacer cosas muy diferentes. Quieres poder interactuar con HTML a través del DOM, quieres hacer solicitudes de red usando Fetch, y luego quieres almacenar cosas en tu navegador usando local storage y session storage. Hay muchos otros runtimes y motores. Esta no es una lista completa, pero algunos runtimes y motores que deberías conocer. Está Deno, Bun, y Electron, esos son runtimes, y luego para motores, está V8, está JavaScript Core, y luego está V8 Plus Chromium.
Hasta ahora, hemos cubierto las dos cosas que hace el runtime. La tercera cosa más importante, no la más importante, pero una cosa muy importante, es el event loop. ¿Qué es el event loop? Bueno, el runtime usa el event loop para determinar cuándo ejecutar tu código. El event loop es solo código adicional que es parte del runtime que escribes, y algunos event loops son incluso bibliotecas. Como Node usa la biblioteca liduv del event loop, que es una biblioteca de C++ que puedes embebir en tu propio código. Para entender lo que el event loop está haciendo, hay cuatro componentes que queremos tener en cuenta. Está el propio event loop, que es el código que está escrito en el runtime. Está la call stack, que es donde tu código se ejecuta realmente, y luego hay dos colas, la microtask queue y la task queue, que también se refiere como la macro task queue. Y todos estos se combinan con el runtime, el motor, y todos los otros componentes para ejecutar tu código. Así que a la derecha tenemos pseudocódigo que muestra lo que sucede a un alto nivel. Lo que está sucediendo es que el event loop verifica si la call stack está vacía. Si lo está, toma todo de la microtask queue y lo coloca en la call stack para que ese código sea ejecutado. Y luego, una vez que todos los elementos de la microtask queue están hechos, toma un elemento de la task queue o la macro task queue, lo pone en la call stack para ser ejecutado. Así que el event loop es un proceso que se ejecuta continuamente que puedes pensar que monitorea la call stack y la queue para decidir cuándo se ejecuta el código. Y esta es la forma principal en que JavaScript se comporta de manera asíncrona, aunque es de un solo hilo.
Así que para recapitular, el motor es un código de bajo nivel que ejecuta JavaScript. De manera similar al motor, el runtime también es código de bajo nivel y permite que tu código sea ejecutado. Gracias por escuchar nuestra charla.
Comments