10 votes

Est-ce que nodejs/V8 stocke le code machine compilé n'importe où sur le disque ?

Editar : Node utilise le bytecode depuis Node 8.3, avant cela, les sources étaient compilées directement en code machine.

Je fais beaucoup de codage Python, et il y a toujours du bytecode qui traîne dans les fichiers .pyc.

Je me demandais si node stocke son code machine dans des fichiers similaires, par exemple, il serait logique de garder la représentation du code machine sur le disque et de la réutiliser si la source d'un fichier est inchangée.

Si oui, où le nœud/v8 stocke-t-il ce code machine ?

Edit 2 : Comme @dystroy le mentionne ci-dessous, il s'agit d'une copie de Comment puis-je voir le code machine généré par la v8 ?

12voto

user835611 Points 41

V8 a introduit un interpréteur de bytecode, Ignition, en 2016. Vous pouvez imprimer le bytecode avec --print-bytecode (Node 8.3 et plus récent).

$ node --print-bytecode incrementX.js -e 'function incrementX(obj) {return 1 + obj.x;} incrementX({x: 42});`
...
[generating bytecode for function: incrementX]
Parameter count 2
Frame size 8
  12 E> 0x2ddf8802cf6e @    StackCheck
  19 S> 0x2ddf8802cf6f @    LdaSmi [1]
        0x2ddf8802cf71 @    Star r0
  34 E> 0x2ddf8802cf73 @    LdaNamedProperty a0, [0], [4]
  28 E> 0x2ddf8802cf77 @    Add r0, [6]
  36 S> 0x2ddf8802cf7a @    Return
Constant pool (size = 1)
0x2ddf8802cf21: [FixedArray] in OldSpace
 - map = 0x2ddfb2d02309 <Map(HOLEY_ELEMENTS)>
 - length: 1
           0: 0x2ddf8db91611 <String[1]: x>
Handler Table (size = 16)

Voir Comprendre le bytecode de V8 .

Pour voir le code machine, utilisez --print-opt-code --code-comments .

11voto

user568109 Points 21253

V8 est un compilateur juste à temps. JavaScript ne peut donc pas être compilé une seule fois comme le compilateur python qui est une compilation statique. Il est compilé au fur et à mesure qu'il doit être exécuté.

Vous ne pouvez pas voir le code machine généré pour JavaScript, car il n'est pas stocké. Cela n'a pas de sens de stocker le code machine qui a été compilé, car la compilation se produit de manière répétée et est affectée par les optimisations d'exécution. Vous n'obtenez pas un code machine corrigé comme pour python, à chaque fois que cela se produit.

5voto

dystroy Points 145126

En la page du projet :

V8 compile le code source JavaScript directement en code machine lorsqu'il est exécuté pour la première fois. Il n'y a pas de codes d'octets intermédiaires, pas de interpréteur.

C'est pourquoi vous ne trouverez pas le bytecode, il n'y en a pas.

En ce qui concerne la nouvelle question qui suit votre modification, je pense que cette question connexe y répond en grande partie. Bien sûr, il n'y a aucune raison en général pour que V8 écrive le code machine sur le disque avec la configuration par défaut. Comme ce code change beaucoup (voir le lien ci-dessus, qui explique comment les classes dynamiques sont créées), cela représenterait un surcoût gigantesque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X