4
votes

Que fait vraiment l'allumage du V8?

Sur https://v8.dev/docs/ignition , nous pouvons voir que:

Ignition est un interpréteur rapide basé sur des registres de bas niveau écrit en utilisant le backend de TurboFan

sur https://docs.google.com/dococums.google.com / d / 11T2CRex9hXxoJwbYqVQ32yIPMh0uouUZLdyrtmMoL44 / edit? ts = 56f27d9d #

Le but du projet Ignition est de construire un interpréteur pour V8 qui exécute un bytecode de bas niveau, permettant ainsi au code à exécution unique ou non à chaud d'être stocké de manière plus compacte sous forme de bytecode.

L'interpréteur lui-même consiste en un ensemble d'extraits de code de gestionnaire de bytecode, chacun d'entre eux gérant un bytecode spécifique et expédié au gestionnaire pour le bytecode suivant. Ces gestionnaires de bytecode

Pour compiler une fonction en bytecode, le code JavaScript est analysé pour générer son AST (Abstract Syntax Tree). Le BytecodeGenerator parcourt cet AST et génère du bytecode pour chacun des nœuds AST comme il convient.

Une fois que le graphique d'un gestionnaire de bytecode est produit, il passe par une version simplifiée du pipeline de Turbofan et assigné à l'entrée correspondante dans la table d'interprétation.

Il semble donc que la tâche d'allumage consiste à prendre le bytecode généré par BytecodeGenerator le convertir en gestionnaires de bytecode et l'exécuter via Turbofan .

Mais ici: entrez la description de l'image ici

et ici: entrez la description de l'image ici

Vous pouvez voir que c'est l'allumage qui produit le bytecode.

De plus, dans cette vidéo https://youtu.be/p-iiEDtpy6I? t = 722 On dit que Ignition est un compilateur de base.

Alors qu'est-ce que c'est? Un compilateur de base? Un interpréteur de bytecode? Un transformateur AST en bytecode?

Cette image semble la plus appropriée: entrez la description de l'image ici

où l'allumage est juste un interpréteur et tout avant est un générateur / optimiseur de bytecode sans nom.

 entrez la description de l'image ici


3 Réponses :


5
votes

Comme je l'ai mentionné dans un commentaire, malheureusement, certains documents sont obsolètes, y compris celui avec votre premier graphique ci-dessus. Le code complet et le vilebrequin sont plus utilisés du tout , il s'agit purement d'analyse et Ignition + TurboFan. (vous avez supprimé l'image des documents obsolètes qui sont malheureusement toujours liés par certains des documents V8)

Ignition est un interpréteur de bytecode ultra-rapide.

L'analyseur de V8 produit le bytecode Ignition. Ce bytecode est exécuté (interprété) par Ignition. Le code qui ne s'exécute qu'une seule fois (code de démarrage et autres) ou qui n'est pas exécuté reste souvent au niveau du bytecode et continue d'être exécuté par Ignition.

Le code "chaud" passe à la deuxième phase, où TurboFan entre en jeu: l'entrée de TurboFan est le même bytecode qu'Ignition interprète (plutôt que le code source, comme c'était le cas avec Crankshaft), qu'il compile ensuite de manière agressive en une machine hautement optimisée code qui s'exécute directement (plutôt que d'être interprété).

Cet article explique les motivations pour abandonner Full-codegen et Vilebrequin (économie de mémoire dans le premier cas, difficulté de mise en œuvre et notamment optimisation des fonctionnalités de langage dans le second). La conception de TurboFan aide également les auteurs du V8 à minimiser la quantité de code spécifique à la plate-forme qu'ils doivent écrire (en ayant une représentation intermédiaire, qu'ils peuvent également utiliser entre autres pour écrire les gestionnaires de bytecode d'Ignition).


6 commentaires

bonne journée Monsieur Crowder merci pour une si bonne réponse et j'aimerais bien poser quelques questions))) Mr.Crowder, ok, l'analyseur génère AST puis bytecode. Ensuite, le bytecode généré est exécuté par Ignition et sur le runtime Profiler surveille et recherche les optimisations à faire et si le Profiler trouve des fonctions chaudes, TurboFan les optimise. Ainsi, TurboFan optimise le code à la volée. Monsieur Crowder, la question que je veux poser est de savoir pourquoi l'allumage a été introduit dans le V8, je pense que grâce à l'allumage, nous avons un code machine plus compact et plus efficace généré à partir du bytecode. Est-ce exact?


Aussi, monsieur Crowder, est-il vraiment vrai que l'analyseur génère du bytecode et non Ignition. Dans la majorité des articles, il est écrit que le bytecode est généré par Ignition lui-même mais vous avez écrit ci-dessus que l'analyseur génère le bytecode.


@Dickens - "Je pense que grâce à l'allumage, nous avons un code machine plus compact et plus efficace généré à partir du bytecode." Je ne pense pas, non. La motivation initiale d'Ignition était de réduire la consommation de mémoire sur les mobiles, voir l'article lié pour plus de détails. "est-il vraiment vrai que l'analyseur génère du bytecode et non pas Ignition" L'analyseur fait partie de Ignition.


est-il vrai que l'allumage exécute le bytecode et l'interprète en code machine pour que le navigateur le comprenne. Et comme notre application est exécutée par allumage, le profileur analyse et recherche des fonctions chaudes et s'il les trouve, il transmet les fonctions chaudes au compilateur pour les optimiser.Ensuite, après les optimisations effectuées par le compilateur, le compilateur change des parties du code avec du code optimisé. Est-ce exact? Monsieur


@Dickens - Essentiellement, oui.


@Merci Monsieur Crowder pour vos aimables commentaires)))



4
votes

Développeur V8 ici.

Sur https://v8.dev/docs/ignition , nous pouvons voir que:

Ignition est un interpréteur rapide basé sur des registres de bas niveau écrit en utilisant le backend de TurboFan

Oui, cela résume la situation. Pour ajouter un peu plus de détails:

  • Le nom «Ignition» fait référence à la fois au générateur de bytecode et à l'interpréteur de bytecode. Souvent, le tout est également considéré comme une grande boîte noire et appelé «l'interprète», ce qui peut parfois conduire à une certaine confusion autour des termes.
  • Le générateur de bytecode prend l'AST produit par l'analyseur pour une fonction JavaScript donnée et génère du bytecode à partir de celui-ci.
  • L'interpréteur de bytecode prend le bytecode généré par le générateur de bytecode et l'exécute en l'interprétant en l'envoyant à un ensemble de gestionnaires de bytecode.
  • Les gestionnaires de bytecode qui composent l'interpréteur de bytecode sont générés à l'aide de parties du pipeline Turbofan. Cela se produit au moment de la compilation V8, pas au moment de l'exécution. En d'autres termes, vous avez besoin de Turbofan pour construire (des parties de) Ignition, mais pas pour exécuter Ignition.
  • L'analyseur syntaxique (et l'arborescence de syntaxe AST / abstraite qu'il produit ne font pas partie d'Ignition.

Une fois que le graphique d'un gestionnaire de bytecode est produit, il passe par une version simplifiée du pipeline de Turbofan et assigné à l'entrée correspondante dans la table d'interprétation.

Il semble donc que le travail d'allumage consiste à prendre le bytecode généré par BytecodeGenerator, à le convertir en gestionnaires de bytecode et à l'exécuter via Turbofan

Cette section du document de conception parle de la génération des gestionnaires de bytecode, qui se produit "à l'avance" (c'est-à-dire lorsque V8 est compilé) en utilisant des parties de Turbofan. À l'exécution, le bytecode n'est pas converti en gestionnaires, il est "géré" (= exécuté, exécuté, interprété) par l'ensemble fixe existant de gestionnaires, et Turbofan n'est pas impliqué.

De plus, dans cette vidéo https://youtu.be/p-iiEDtpy6I? t = 722 On dit que Ignition est un compilateur de base.

À ce moment-là, la présentation fait référence à l'idée générale que tous les moteurs JavaScript modernes ont un "compilateur de base" (dans un sens conceptuel très général - je conviens que la diapositive aurait pu clarifier cela). Notez que la diapositive ne dit rien sur Ignition. La diapositive suivante indique qu'Ignition remplit ce rôle dans V8. Donc, plus précis serait de dire "Ignition remplace un compilateur de base" ou "Ignition est un moteur d'exécution de base". Ou vous pouvez redéfinir légèrement vos termes et dire "Ignition est un compilateur qui produit du bytecode puis l'interprète".

l'allumage est juste un interpréteur et tout avant est un générateur / optimiseur de bytecode sans nom

Cette diapositive montre la boîte "Interpreter" dans le cadre du "Ignition Bytecode Pipeline". Le générateur / optimiseur de bytecode fait également partie d'Ignition.


11 commentaires

Merci d'avoir répondu. Mon principal point de confusion est que certaines diapositives montrent que le bytecode provient de l'interpréteur d'allumage et d'autres que le bytecode est une entrée pour Ignition. Le "Ignition Bytecode Pipeline" est-il une partie interne de l'allumage ou est-ce une partie externe auxiliaire?


«Pipeline» dans ce cas signifie simplement «description de la façon dont les choses se passent, en séquence». L'analyseur génère un AST, le générateur de bytecode génère un bytecode à partir de cet AST, le bytecode est ensuite d'abord exécuté plusieurs fois par l'interpréteur de bytecode puis utilisé comme entrée de Turbofan pour générer un code optimisé. Le terme "Ignition" fait référence à la fois au générateur de bytecode et à l'interpréteur de bytecode. (Cela dit, en fin de compte, "Ignition" n'est qu'un nom de projet, et pour comprendre comment les choses fonctionnent, peu importe quelles parties du code de V8 sont couvertes par ce parapluie et lesquelles ne le sont pas.)


Ah je pense que je l'ai compris maintenant: Ignition était d'abord un nom de projet interne puis un "terme générique accrocheur" à des fins de marketing pour produire un certain battage médiatique. Du point de vue technique, il n'y a rien de plus qu'un ensemble de grosses modifications apportées au V8 expédié vers 2016. Il n'y a pas d '"interpréteur d'allumage", il n'y a qu'un interprète, un générateur, un compilateur, etc. Merci.


C'est une façon de voir les choses. Je dirais qu'il y a un générateur de bytecode d'allumage et un interpréteur de bytecode d'allumage, donc "Ignition" est les deux ensemble. Mais oui, ce qui compte, c'est le code et ce qu'il fait, pas tant les noms que vous utilisez pour faire référence à diverses parties.


Eh bien, certaines personnes de votre équipe semblent ne pas remarquer l'existence d'un générateur et donner tout le crédit à l'interprète, c'est-à-dire que vous pouvez lire des choses comme "bytecode produit par l'interpréteur Ignition de V8" sur votre blog d'équipe ici: v8.dev/blog/v8-release-56


Comme je l’écrivais à l’origine: «Souvent, tout cela est également considéré comme une seule grande boîte noire et appelé« l'interprète », ce qui peut parfois conduire à une certaine confusion autour des termes. Dans cette citation précise, je suppose que l'intention était d'être plus précise que de simplement dire "produit par Ignition" en incluant un résumé en un mot de ce qu'est "Ignition". Soyez assuré que les gens savent bien que le bytecode doit être généré d'une manière ou d'une autre ;-)


@jmrk, est-il vrai que l'allumage exécute le bytecode et l'interprète en code machine pour que le navigateur puisse le comprendre. Et comme notre application est exécutée par allumage, le profileur analyse et recherche des fonctions chaudes et s'il les trouve, il transmet les fonctions chaudes au compilateur pour les optimiser, puis après les optimisations effectuées par le compilateur, le compilateur change des parties du code machine (interprété par allumage) avec code optimisé. Est-ce exact?


Oui, surtout. (1ère phrase :) L'interprétation du bytecode n'implique pas la création de code machine - c'est pourquoi nous l'appelons "interpréter" et non "compiler". (Dernière phrase :) Lorsqu'un code machine optimisé pour une fonction est disponible, le bytecode de la fonction est remplacé par ce code machine optimisé. (Strictement parlant, les deux seront conservés, mais le fait est que la prochaine invocation utilisera le code machine, pas le code d'octet.)


@jmrk, le navigateur comprend-il le bytecode?, c'est-à-dire que lorsque l'allumage interprète le bytecode, quelle sera la sortie?


@jmrk, s'il vous plaît, j'ai vraiment besoin de votre aide ((


Ignition comprend le bytecode et l'exécute; c'est ce que signifie «interpréter». Il n'y a pas de sortie, peu importe ce que la fonction respective fait et / ou renvoie. (Vous pouvez le considérer comme «l'allumage exécute le bytecode comme un CPU exécute le code machine».)



0
votes

Veuillez corriger mon erreur de compréhension du processus de conversion:

  • Code JS analysé dans AST
  • AST envoyé à Ignition pour être converti en bytecode
  • Générer le code machine
  • Si le code d'octet est optimal, envoyez-le au processeur pour traitement
  • Si le code octet nécessite une optimisation, il est envoyé à Turbofan pour optimisation
  • Si Turbofan a reçu du code d'octet, il est optimisé et envoyé à l'ordinateur pour traitement.

0 commentaires