10

编辑:Node 从 Node 8.3 开始使用字节码,在此之前,源代码被直接编译为机器码。

我做了很多 Python 编码,而且 .pyc 文件中总是有字节码。

我想知道节点是否将其机器代码存储在类似的文件中,例如,将机器代码表示保留​​在磁盘上并在文件源未更改时重新使用它是有意义的。

如果是这样,node/v8 将这个机器代码存储在哪里?

编辑 2:正如@dystroy 在下面提到的,这是我如何查看 v8 生成的机器代码的骗局?

4

3 回答 3

12

V8 在 2016 年引入了字节码解释器 Ignition。您可以使用--print-bytecode(Node 8.3 和更高版本)打印字节码。

$ 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)

请参阅了解 V8 的字节码

要查看机器代码,请使用--print-opt-code --code-comments.

于 2017-08-18T02:53:30.287 回答
11

V8 是一个即时编译器。所以 JavaScript 不能像静态编译的 python 编译器那样只编译一次。它在需要执行时编译。

您看不到为 JavaScript 生成的机器代码,因为它没有被存储。存储已编译的机器代码没有意义,因为编译会重复发生并受运行时优化的影响。每次发生时,您都不会像 python 那样获得固定的机器代码。

于 2013-05-21T15:51:30.473 回答
5

项目页面

V8 在第一次执行时将 JavaScript 源代码直接编译为机器码。没有中间字节码,没有解释器。

这就是为什么你找不到字节码,没有。

关于您编辑后的新问题,我认为这个相关问题主要回答了它。当然,V8 通常没有理由使用默认设置将机器代码写入磁盘。由于此代码更改很多(请参阅上面的链接,解释如何创建动态类),这将是一个巨大的开销。

于 2013-05-21T15:18:27.550 回答