IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Sparkplug, un compilateur pour le moteur JavaScript V8, est publié avec la version 9.1 de V8,
Il apporte une diminution du temps de compilation

Le , par Bruno

223PARTAGES

9  0 
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();
}
L'absence de RI signifie que le compilateur a des possibilités d'optimisation limitées, au-delà des optimisations très locales de type "peephole". Cela signifie également que le programmeur doit porter l'implémentation entière séparément pour chaque architecture supportée. Puisqu’il n'y a pas d'étape intermédiaire indépendante de l'architecture. Selon l’équipe V8, ce n'est pas un problème : « un compilateur rapide est un compilateur simple, donc le code est assez facile à porter ; et Sparkplug n'a pas besoin de faire une optimisation lourde, puisque nous avons de toute façon un excellent compilateur optimisant plus tard dans le pipeline ». Techniquement, ils effectuent actuellement deux passages sur le bytecode. Un pour découvrir les boucles, et un second pour générer le code réel.

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.

Une erreur dans cette actualité ? Signalez-nous-la !