5. La philosophie de Node.js

Nous venons de voir les avantages de Node.js, notamment sa rapidité. Mais savons-nous vraiment pourquoi est-il si rapide ? Même si ce n’est pas indispensable de le savoir pour développer avec Node.js, un peu de culture générale ne nous fera pas de mal. Et puis, cela nous permettra de mieux maîtriser les basiques, ce qui est loin d’être négligeable.

Revenons donc sur cette rapidité de Node.js, qui tient principalement à deux facteurs : l’utilisation du moteur JavaScript V8 de Chrome, et son utilisation d’une architecture dite « non bloquante ». 

Le moteur JavaScript V8

Comme nous l’avons vu, Node.js utilise le moteur JavaScript V8 de Google Chrome. Le moteur V8 a beaucoup fait parler de lui à sa sortie, car c’est un outil qui interprète votre code JavaScript très, très rapidement. C’est d’ailleurs ce moteur JavaScript qui a été intégré dans Node.js, et pas un autre, car c’était le plus performant.

Résultat de recherche d'images pour "moteur v8 chrome"
Le moteur V8 de Chrome !

Mais pourquoi était-il si rapide ? Et bien, l’approche retenue par les ingénieurs de Google pour créer ce moteur JavaScript était très différente. Il utilise une méthode de compilation dite « Just In Time » ou « JIT », pour les fans d’acronymes. L’avantage de cette méthode est qu’elle est ultra-optimisé, car elle transforme directement votre code JavaScript en code machine, sans utiliser un interpréteur.

En effet, pour les autres navigateurs, le navigateur mettait beaucoup de temps à lire le JavaScript et à le transformer en code machine compréhensible pour le processeur, car ils lisaient le code JavaScript de façon peu efficace : le code était lu et interprété au fur et à mesure, ce qui impliquait la génération d’un code intermédiaire. La différence principale avec V8 est que ce code intermédiaire a disparu.

Aujourd’hui, la plupart des moteurs JavaScript modernes se sont alignés sur ce fonctionnement, comme le moteur SpiderMonkey ou Rhino de Mozilla, mais le moteur de V8 de Chrome conserve une longueur d’avance.

Mais ne vous inquiétez pas, vous n’avez pas besoin de connaître le fonctionnement interne de V8 pour utiliser Node.js, et heureusement ! Retenez simplement que le moteur V8 permet de rendre l’exécution du code JavaScript beaucoup plus rapide, et que sa conception novatrice est un pari réussi.

Le modèle non bloquant

Node.js utilise le langage JavaScript, ce qui a certaines implications directes : on retrouve la notion d’événement et d’asynchrone partout dans Node.js.

Pour implémenter ce fonctionnement en dehors du navigateur, il a fallu baser Node.js sur une architecture dite « non-bloquante ».

Pour bien comprendre ce fonctionnement, nous allons raisonner par l’absurde, en partant d’une architecture « bloquante ».

Imaginons un programme dont le rôle est de récupérer des données depuis un serveur distant, puis de l’afficher à l’utilisateur. Les instructions de ce programme ressemblerait à ceci :

Demander la récupération des données
Attendre
Récupérer les données
Afficher les données
Suite du programme

Le traitement est effectué de haut en bas, et cet ordre est invariable. Maintenant, reprenons ce même programme selon une architecture dite « non-bloquante » :

Demander la récupération des données
    Attendre, sans empêcher la suite du programme d'être traité
    Récupérer les données attendues
    Afficher ces données
Suite du programme

Nous avons ici un changement radical. Le programme n’est plus traité de haut en bas de manière figée, mais il est traité en fonction des événements qui surviennent. Lorsque vous récupérez les données, alors vous les affichez à l’utilisateur. Mais en attendant cet événement, le programme peut continuer normalement :

L’exécution du programme est basé sur des événements, et non selon un ordre prédéterminé !

Ce fonctionnement basé sur des événements a un avantage évident en termes de rapidité, puisque les traitements asynchrones ne bloquent jamais l’exécution du programme. Imaginez maintenant que vous cherchez à récupérer deux données différentes, avec un modèle bloquant et non bloquant :

Le modèle non-bloquant est beaucoup plus rapide, car la récupération des données est simultanées !

Dans les applications web, il est courant d’avoir des opérations longues et bloquantes pour la récupération de données distantes. Node.js permet de fluidifier tout cela, et vos futurs utilisateurs n’en seront que plus satisfait, car ils auront des applications beaucoup plus rapides !

Node.js nous évite donc de perdre du temps, en nous permettant de faire d’autres choses en attendant que les actions longues soient terminées. Vous connaissez maintenant les petits secrets de Node.js, et nous sommes prêt à voir tous les types d’applications qu’il est possible de développer avec Node.js. 😉