# ¿Qué es Node.js?

Node.js es un programa de escritorio que, principalmente, está escrito en C++ \(y JavaScript\) pero permite escribir aplicaciones utilizando como lenguaje JavaScript. Por esta razón muchos le llaman el JavaScript de escritorio, pero Node.js es un poco más que eso. Con el soporte de múltiples librerías proporciona una gran variedad de apoyos para la creación de diferentes tipos de aplicaciones, desde aplicaciones de línea de comando, REST API hasta servidores Web, pero uno de sus usos más efectivos es todo lo relacionado con RTC \(_Real Time Communication_\).

De hecho Node.js soporta la incorporación de librerías escritas en C++ y estas se pueden vincular a los proyectos ampliando aún más el sustento de nuevas funcionalidades.

Node.js es _Open Source_, ya que muchas personas contribuyen y mantienen su [código fuente](https://github.com/nodejs/node).

## Librería de V8 JavaScript

Había mencionado anteriormente que Node.js permite escribir aplicaciones utilizando JavaScript como lenguaje, pero está escrito en C++ ¿Como es esto posible?, Es debido a una de las librerías más importantes para Node.js, V8 también escrita en C++. Esta permite convertir el código escrito por el usuario en JavaScript a código de máquina para ser interpretado por el computador más eficientemente.

Esta librería es ahora [código abierto](https://v8.dev/), liberado por Google. Es utilizada por otras aplicaciones como el navegador Web _Google Chrome_, el cual la usa para interpretar el código escrito en JavaScript en el navegador Web.

* [Código fuente V8](https://github.com/v8/v8)

## Librería libuv

La librería _libuv_ permite a Node.js implementar muchas operaciones asincrónicas como: lectura de archivos, peticiones HTTP y muchas otras operaciones mayormente de entrada/salida, permitiendo así procesar varias cosas al "mismo tiempo".

* [Lib UV](https://github.com/libuv/libuv)

## ¿Node.js es _single thread_?

Cuando se habla de "programas" ejecutándose, realmente la mayoría lo hace como procesos en el sistema. Cada uno de estos procesos puede utilizar uno o varios hilos \(_threads_\) para hacer las diferentes operaciones con el procesador u operaciones de entrada/salida como lectura de archivos; esto permite realizar varias tareas de manera "simultánea", aunque este último concepto también depende de la arquitectura que tenga el procesador para soportar este tipo operaciones.

Se menciona mucho que Node.js es _single thread_ debido a la implementación de JavaScript de la librería V8 que es _single thread_. Esto significaría que solo puede procesar una cosa al tiempo, pero esto no es del todo cierto, así que realizaremos la primera aclaración:

* El código escrito por el usuario se ejecuta en _single thread_ en el _event loop_ \(el cual veremos con más detalle más adelante\)

Pero como se dijo antes, Node.js utiliza otras librerías para añadir funcionalidades como _libuv;_ esta le permite leer archivos del sistema. Entonces, cuando esta instrucción escrita por el usuario es ejecutada en el _event loop,_ se crea un nuevo hilo en el proceso para realizar esta operación y notificará al hilo principal cuando este termine. Es entonces cuando realizaremos nuestra segunda aclaración:

* Cuando una operación requiere hacer una operación de entrada/salida o un procesamiento independiente, un nuevo hilo se crea en el proceso y, una vez finalizada la operación, notifica al hilo principal.

Por defecto _libuv_ determina cual es la cantidad de hilos que tiene para procesar las operaciones y, si estos están "ocupados", deja la tarea en espera hasta que algún otro hilo termine su ejecución. Este parámetro se puede sobreescribir en el código del usuario si es necesario, pero también depende mucho de la arquitectura del procesador para realizar un buen balance entre la capacidad del procesador y el número de hilos que se establezcan.

La anterior es la razón por la cual se menciona que _libuv_ le agrega a Node.js la capacidad de procesar tareas de manera simultánea, y muchas de estas funciones tiene su versión sincrónica y asincrónica, lo que también explicaremos en detalle más adelante.

En conclusión Node.js no es solo _single thread_, es _multi thread_ cuando es necesario.
