Les responsables de V8, le moteur JavaScript et WebAssembly open source de Google, ont annoncé Sparkplug, un compilateur JavaScript non optimisé. « Pour écrire un moteur JavaScript performant, il ne suffit pas de disposer d'un compilateur hautement optimisé comme TurboFan. En particulier pour les sessions de courte durée, comme le chargement de sites Web ou d'outils en ligne de commande, il y a beaucoup de travail qui se produit avant que le compilateur optimiseur ait même une chance de commencer à optimiser, sans parler du fait qu'il a le temps de générer le code optimisé, ont déclaré les responsables de V8. C'est là qu'intervient Sparkplug publié avec la version 9.1 de V8, qui se niche entre l'interpréteur Ignition et le compilateur optimisé TurboFan ».V8 est le moteur JavaScript et WebAssembly open source de Google, écrit en C++. Il est utilisé dans Chrome et dans Node.js, entre autres. Il met en œuvre ECMAScript et WebAssembly et fonctionne sous Windows 7 ou ultérieur, macOS 10.12+ et les systèmes Linux qui utilisent des processeurs x64, IA-32, ARM ou MIPS. V8 peut fonctionner de manière autonome ou être intégré à toute application C++.
L'interpréteur de V8 est hautement optimisé et très rapide, mais les interpréteurs ont des frais généraux inhérents dont il est impossible de se débarrasser ; des choses comme les frais généraux de répartition qui font partie intrinsèque de la fonctionnalité d'un interpréteur. Avec le modèle actuel à deux compilateurs, il est impossible d’atteindre un code optimisé beaucoup plus rapidement ; l’équipe de V8 travaille à rendre l'optimisation plus rapide, mais à un certain point.
Un compilateur rapide
Sparkplug est conçu pour compiler rapidement. Selon V8, il y a quelques astuces qui rendent le compilateur Sparkplug rapide. Tout d'abord, il triche ; les fonctions qu'il compile ont déjà été compilées en bytecode, et le compilateur bytecode a déjà fait la majorité du travail difficile comme la résolution des variables, déterminer si les parenthèses sont en fait des fonctions flèches, déboguer les déclarations de déstructuration, et ainsi de suite. Sparkplug compile à partir du bytecode plutôt qu'à partir du code source JavaScript, et n'a donc pas à se soucier de tout cela. La deuxième astuce est que Sparkplug ne génère pas de représentation intermédiaire (IR) comme le font la plupart des compilateurs. Au lieu de cela, Sparkplug compile directement en code machine en un seul passage linéaire sur le bytecode, émettant un code qui correspond à l'exécution de ce bytecode. En fait, l'ensemble du compilateur est une instruction switch à l'intérieur d'une boucle for, qui envoie des fonctions fixes de génération de code machine par bytecode.
| Code : | Sélectionner tout |
1 2 3 4 | // The Sparkplug compiler (abridged).
for (; !iterator.done(); iterator.Advance()) {
VisitSingleBytecode();
} |
Frames compatibles avec l'interpréteur
L'ajout d'un nouveau compilateur à une VM JavaScript existante est une tâche ardue. Il y a toutes sortes de choses que à prendre en charge au-delà de la simple exécution standard ; V8 a un débogueur, un profileur de CPU qui marche sur la pile, il y a des traces de pile pour les exceptions, l'intégration dans le tier-up, le remplacement sur la pile du code optimisé pour les boucles. Sparkplug fait un habile tour de passe-passe qui simplifie la plupart de ces problèmes, à savoir qu'il maintient des « frames de pile compatibles avec l'interpréteur ».
Notons que les frames de pile sont la façon dont l'exécution du code stocke l'état des fonctions ;...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.