Article de reference

V8 (moteur JavaScript)

{{cite web |title=Documentation · V8 |url=https://v8.dev/docs |publisher=Google |access-date=3 March 2024}} "},"released":{"wt":"{{start date and age|2008|9|2|df=y}}"},"latest r...

JavaScript et WebAssembly développé par Google pour son navigateur Chrome . V8 est un logiciel libre et open source (FOSS) et fait partie du projet Chromium . Il est également utilisé dans des contextes autres que les navigateurs, notamment dans le système d'exécution Node.js. D'autres environnements d'exécution JavaScript côté serveur utilisent des moteurs alternatifs, tels que Bun (qui utilise JavaScriptCore ) et Hermes (utilisé par React Native ).

moteur V8 et son développeur principal était Lars Bak . Pendant plusieurs années, Chrome a été plus rapide que les autres navigateurs pour l'exécution de JavaScript.

L' assembleur V8 est basé sur l' assembleur Strongtalk . Le 7 décembre 2010, une nouvelle infrastructure de compilation nommée Crankshaft a été publiée, offrant des gains de vitesse. Dans la version 41 de Chrome en 2015, le projet TurboFan a été ajouté afin d'améliorer encore les performances des charges de travail auparavant complexes, telles que asm.js. [ développement de V8 s'inspire largement de la machine virtuelle Java HotSpot développée par Sun Microsystems , les pipelines d'exécution les plus récents étant très similaires à ceux de HotSpot.

La prise en charge du langage WebAssembly a débuté en 2015.

En 2016, l'interpréteur Ignition a été ajouté à V8 dans le but de réduire la consommation de mémoire sur les téléphones Android à faible capacité , par rapport à TurboFan et Crankshaft. Ignition est une machine basée sur les registres et partage une conception similaire (bien que non identique) à celle de l'interpréteur de modèles utilisé par HotSpot.

En 2017, V8 a introduit un tout nouveau pipeline de compilation , composé d'Ignition (l' interpréteur ) et de TurboFan (le compilateur d'optimisation ). À partir de la version 5.9 de V8, Full-codegen (le compilateur de base initial) et Crankshaft ne sont plus utilisés pour l'exécution de JavaScript, car l'équipe estimait qu'ils n'étaient plus en mesure de suivre le rythme des nouvelles fonctionnalités du langage JavaScript et des optimisations qu'elles nécessitaient.

En 2021, un nouveau pipeline de compilation hiérarchisé a été introduit avec la sortie du compilateur SparkPlug, qui complète le compilateur TurboFan existant au sein de V8, en parallèle direct avec le compilateur de profilage C1 utilisé par HotSpot.

En 2023, le compilateur Maglev basé sur SSA a été ajouté. Il est 10 fois plus lent que Sparkplug mais 10 fois plus rapide que TurboFan, comblant ainsi l'écart entre Sparkplug et TurboFan pour les boucles moins fréquemment exécutées qui ne deviennent pas suffisamment « chaudes » pour être optimisées par TurboFan, comme c'est le cas pour la plupart des applications web qui passent plus de temps à interagir avec le navigateur qu'à exécuter du JavaScript.

Conception

V8 commence par générer un arbre de syntaxe abstraite à l'aide de son propre analyseur syntaxique. Ensuite, Ignition génère du bytecode à partir de cet arbre, en utilisant le format interne de V8 . [ compile ce bytecode en code machine. Autrement dit, V8 compile l'ECMAScript directement en code machine natif grâce à la compilation à la volée (JIT ) , avant son exécution. Le code compilé est ensuite optimisé (et réoptimisé) dynamiquement à l'exécution, en fonction de l'analyse de son profil d'exécution. Les techniques d'optimisation utilisées incluent l'intégration en ligne (inlining) , l'élision des propriétés d'exécution coûteuses et la mise en cache en ligne . Le ramasse-miettes est un ramasse-miettes incrémental générationnel .

Usage

V8 peut être compilé pour les architectures de jeu d'instructions x86 , ARM ou MIPS dans leurs versions 32 bits et 64 bits ; il a également été porté sur PowerPC , et sur IBM ESA/390 et z/Architecture , pour une utilisation dans les serveurs.

V8 peut être utilisé dans un navigateur ou intégré à des projets indépendants. V8 est utilisé dans les logiciels suivants :