Dans cet article


Offres d'emploi

Tags

Fonctionnement du moteur Javascript - JS - Sous Le Capot - Partie 2

Fonctionnement du moteur Javascript - JS - Sous Le Capot - Partie 2

Bienvenue dans le deuxième article de notre série : Javascript sous le capot ! Dans cet article, nous nous intéresserons au fonctionnement du moteur Javascript. Allez, c’est parti !

2- Fonctionnement du moteur Javascript

Ce qu’il ne faut surtout jamais oublier quand on développe en Javascript, c’est que les actions sont effectuées 1 à 1, et jamais simultanément : c’est un langage single-threaded.

Nous allons voir ici ces concepts plus en détail, afin de comprendre comment Javascript fonctionne plus en profondeur.
Cela vous permettra de comprendre un peu mieux pourquoi le JS peut être « bizarre » comparé à d’autres langages.

Le moteur Javascript

Un des moteurs les plus populaire de JavaScript est le moteur V8 de Google, utilisé dans Google Chrome et NodeJS.

Voici une vue simplifiée de ce à quoi il correspond :

Fonctionnement moteur Javascript

Le moteur est composé de 2 composants principaux :

  • Memory Heap : sert à allouer la mémoire utilisée dans le programme.
  • Call Stack (pile d’exécution) : contient les données des fonctions exécutées par le programme.

Web APIs

Des APIs situées en dehors du moteur sont également à la disposition du développeur. La plupart sont souvent utilisées, tel que DOM ou setTimeout, et c’est également ici que nous avons les fameuses callback queue ainsi que event loop.

Fonctionnement moteur Javascript Web API

Call stack (pile d’exécution)

JavaScript étant single-threaded, cela veut dire qu’il n’y a qu’une seule pile d’exécution, nous ne pouvons donc faire qu’une chose à la fois.

La pile d’exécution est une structure de données qui enregistre où nous en sommes dans le programme.
Si nous entrons dans une fonction, nous la mettons en haut de la pile.
Si nous revenons d’une fonction, nous l’enlevons du haut de la pile. C’est tout ce que la pile peut faire.

Prenons le programme suivant :

function multiply(x, y) {
    return x * y;
}
function printSquare(x) {
    var s = multiply(x, x);
    console.log(s);
}
printSquare(5);

Quand le moteur exécute le code, la pile est vide, puis elle se remplit de la façon suivante :

Call Stalk Javascript

Avoir qu’une seule pile d’exécution peut être pratique, car cela enlève tous les problèmes engendrés par le multithreading.
Cependant, exécuter un programme sur 1 seul thread a aussi un très gros inconvénient : tout est bloqué quand une tache est longue !

Simultanéité (Concurrency)

Que se passe-t-il quand une fonction dans la pile d’exécution prend énormément de temps à finir, par exemple, pour un traitement d’images dans votre navigateur ?
Tout se bloque, de l’UI de votre page internet jusqu’au navigateur en lui-même.

En effet, votre navigateur va essayer de rafraichir la page toute les 160 secondes, et ne peut le faire que si la pile est vide.
Si une de vos fonctions prend du temps, c’est la réactivité de votre site web qui en prendra un coup.

La solution qui nous est proposée (et que vous utilisez sans doute sans modération) est l’asynchrone, avec la callback queue et event loop.

Moteur Javascript - Pour aller plus loin

Pour aller plus loin dans la compréhension de Javascript, voici quelques liens utiles :

L'équipe AXOPEN

Voir aussi les articles suivants

Javascript, un langage compilé ? - JS - Sous Le Capot - Partie 1
Bienvenue dans notre série d’articles : Javascript : sous le capot ! Le but de cette série est d’en apprendre un peu plus sur Javascript et de comprendre comment ça fonctionne réellement !
Lire l'article

Spring Batch : Implémentation et présentation du framework Java
Spring Batch, c’est quoi ? Spring Batch est un framework Java basé sur Spring qui a pour but de faciliter la création de batch. Pour rappel, on parle de batch lorsqu’il s’agit d’un traitement sur un gros volume de données.
Lire l'article

Java 9 : quelques méthodes utiles pour la gestion des strings
On se retrouve aujourd’hui pour un focus sur les méthodes utiles en JAVA 9 pour la gestion de strings (chaines de caractères). L’idée de cet article est née du constat suivant : souvent, dans les codes de développeurs Java, on voit des choses très complexes… alors qu’il suffisait de faire appel à une feature qui existe déjà pour nous simplifier la vie :)
Lire l'article