Comment ça marche Node JS ?<span class="wtr-time-wrap after-title"><span class="wtr-time-number">9</span> min read</span>

Comment ça marche Node JS ?9 min read

Dans cet article nous allons voir comment fonctionne Node JS. Ainsi , nous comprendrons comment fonctionnent les modules natifs ainsi que l’asynchronisme

Vous le savez sûrement, Node JS est un programme permettant d’exécuter du javascript sur un ordinateur. C’est donc un langage de programmation à part entière basé sur la syntaxe et les fonctionnalités du javascript. Ce que je veux dire par la, c’est que Node JS ajoute de nouvelles fonctionnalités au langage javascript de base, tel que modifier des fichiers sur un ordinateur.

Pour cela , Node JS utilise c++ afin d’exécuter de actions. Nous allons donc nous intéresser au fonctionnement de l’interpréteur Node JS.

Le moteur V8

Node JS est basé sur le moteur javascript V8. Il est développé par google et il équipe le logiciel Google Chrome. Cet interpréteur est le logiciel le plus puissant sur le marché des interpréteurs javascript. Il est donc logique qu’il as été choisis pour développer Node JS

Le gros avantage de V8 ce n’est pas les performances, c’est la capacité de faire le lien très facilement entre du code C++ et du code javascript.

Chaque variable javascript as un type V8 correspondant. Il est donc facile avec quelques connaissances en C++ de créer des librairies pouvant fonctionner avec Node JS

C’est d’ailleurs comme ça que fonctionnent les librairies natives. Elles sont crées en C++ avec l’api V8 et sont directement utilisables en Javascript. C’est ce fonctionnement qui explique la grande rapidité de node JS dans certains domaines. Javascript ne va gérer que l’exécution des fichiers binaires contenant les fonctions.

La librairie Libuv

La première chose à laquelle on pense lorsque l’on parles de Node JS n’est pas V8 mais l’asynchronisme.

Comme vous l’avez sûrement compris, Node JS repose sur le moteur javascript V8, c’est la partie qui nous permets de donner nos instructions à la machine. La seconde partie, celle qui gère l’asynchronisme, c’est libuv.

Libuv est une librairie C d’asynchronisme. Elle permets de créer du code non bloquant et donc d’avoir des performances très optimisé.

C’est sur ce principe que repose Node JS, pouvoir exécuter du code javascript sur un ordinateur et de manière asynchrone.

Si vous voulez développer votre propre librairie native, il est nécessaire de maîtriser libuv afin d’avoir un code asynchrone et ainsi éviter de créer des temps morts.

L’association de ces deux technologies

Toute la magie de Node JS repose sur l’association entre ces deux systèmes. Dans cette partie nous allons étudier plus en détails ce qui se passe à l’intérieur de Node JS lorsqu’il lis et exécute un fichier javascript

Vous vous en douterez, Node JS est un langage interprété, le compilateur as donc comme première tâche de lire et d’évaluer le code.

En le lisant, il instancie les variables dans la mémoire et essaie de définir le type des variables par rapport a ce qu’il peux décrypter. Cette phase permets d’optimiser les performances du programme. J’en profite pour vous donner une règle en Node JS , ne créez jamais une fonction qui renvoi deux types différents selon les circonstances, cette situation empêche l’interpréteur de se régler sur un type , et donc le forceras à le recalculer à chaque fois

Une fois la première lecture faite, l’interpréteur lance l’exécution du script. Dans un premier temps il va récupérer les “require()” afin que le fichier possède tout le code nécessaire à la bonne exécution.

Ensuite il lance les premières fonctions en les envoyant dans l’event loop.

L’event loop est un système complexe programmé via libuv qui permets de gérer l’asynchronisme de Node JS. Le principe est d’avoir une pile d’événement qui va tourner et exécuter le code disponible. Ainsi, durant les phases d’attente, la fonction seras mise en pause et le code continueras d’exécuter les fonctions dans l’event loop.

C’est grâce à cela que le système de callback existe. Lorsqu’une callback est appelé dans une fonction, l’event loop va simplement lancer la fonction callback à la fin de la fonction de base, simple et efficace 🙂

Les modules natifs

Toute à l’heure j’ai brièvement parlé de l’api de V8 et du principe de module natifs. Nous allons étudier plus en détails le fonctionnement de ce système dans cette partie

Node JS est un langage très maniable, il nous permets de créer notre propre code compilé et de l’utiliser dans nos programmes javascript. C’est un des rare langages permettant de combiner deux langages de programmation , javascript et C/C++.

Comme je l’ai aussi mentionné, Node JS utilise des modules compilés directement pour fonctionner. C’est ce que l’on appelle les modules intégrés. Pour vous donner un exemple, le module filesystem permets de modifier , de supprimer et d’écrire des fichiers de manière asynchrone ou synchrone.

Ce module fonctionne via C++. Ici, l’api V8 va faire la liaison entre le code C++ et le code javascript. L’api va permettre de récupérer les appels de fonctions et les valeurs du code javascript, et elle va les envoyer au code C++ compilé. Ensuite elle va renvoyer les réponses à javascript.

Il est donc très intéressant si vous maîtrisez Node JS d’apprendre C++ ou C. Et l’inverse est vrai aussi, si vous maîtrisez C/C++, il seras très simple d’apprendre Node JS et tout aussi simple de créer des modules natifs.

Voici un schéma expliquant le fonctionnement du module filesystem ou FS


Pourquoi Node JS est si efficace ?

Vous savez maintenant comment fonctionne Node JS. Nous avons vu que c’est l’assemblage de deux technologies , Libuv et V8 , avec beaucoup de colle magique 🙂

Ce qui vous intéresse probablement puisque vous êtes tombés sur cet article, c’est de savoir pourquoi les créateurs de Node JS ont fait ce choix et pourquoi est-ce si performant

L’asynchronisme, une solution miraculeuse

L’asynchronisme as changé la façon de concevoir des serveurs et des programmes devant gérer plusieurs instances. L’idée c’est qu’en temps normal, le programme as des temps morts. Lorsqu’une requête est en attente, il ne fait rien.

Pour pallier à ce problème, les programmeurs ont inventés le threading, un système permettant de créer plusieurs sous programme dans un programme. Ainsi, lorsque le programme est en pause, seulement une version du programme attends, ce qui permets d’isoler les temps de latence.

Le threading est une bonne solution pour les serveurs. C’est facile à mettre en place et permets des performances correctes. Mais lorsque l’on le compare à l’asynchronisme, on se rend compte que c’est bien inférieur à l’asynchronisme.

Avec cette dernière solution, le temps de latence et d’attente n’existe plus. Tout est exécuté de manière fluide et le développement est plutôt simple lorsque l’on as compris les principes de base.

Les modules compilés pour une rapidité incroyable

Comme dis précédemment , Node JS permets d’utiliser directement du code compilé à l’intérieur de javascript. Vous le savez peut-être, le code compilé est bien plus rapide que le code interprété.

Pourquoi le code compilé est-il plus rapide ?

Il y a deux raisons qui font que le code compilé est beaucoup plus rapide (parfois 10 fois plus rapide ) que le code interprété :

Le typage statique

La première chose qui permets d’avoir un code plus rapide c’est le typage statique. C’est un peu complexe à comprendre mais concrètement, le programme va assigner une place différente dans la mémoire RAM selon le type. Avec un langage interprété, le programme doit “deviner” les types, cela prends du temps et en plus de cela, la RAM n’est pas optimisée.

Lorsque l’on développe en C ou en C++, on dois impérativement donner les types des variables. Le compilateur sait donc déjà comment gérer la RAM et as donc moins d’efforts à faire.

La compilation elle même

Je sais que ce n’est probablement pas clair. Mais la compilation en elle-même permets de gagner beaucoup de temps. Un programme compilé est directement lisible par un ordinateur. Tout les calculs fait par l’interpréteur pour donner les instructions à l’ordinateur dans un langage interprété sont tout simplement absent dans les langages compilés.

En plus de cela, la phase ou l’interpréteur lis le programme n’existe pas puisque le langage est directement compilé

En conclusion

Nous avons vu comment fonctionne Node JS, le langage bien que basé sur javascript possède ses propres fonctionnalités et fonctionne totalement différemment notamment grâce à l’asynchronisme

C’est un langage très intéressant et possédant des performances incroyables, il est donc très intéressant de s’y intéresser

Si cet article vous as plu, vous pouvez vous abonner à ma newsletter pour recevoir le guide GRATUIT Ultime pour bien débuter la programmation

Vous abonner à notre newsletter

* champ requis



Je vous remercie d’avoir lu cet article, au plaisir de vous revoir sur mon blog !

Laisser un commentaire

Fermer le menu
×
×

Panier