编辑:Node 从 Node 8.3 开始使用字节码,在此之前,源代码被直接编译为机器码。
我做了很多 Python 编码,而且 .pyc 文件中总是有字节码。
我想知道节点是否将其机器代码存储在类似的文件中,例如,将机器代码表示保留在磁盘上并在文件源未更改时重新使用它是有意义的。
如果是这样,node/v8 将这个机器代码存储在哪里?
编辑 2:正如@dystroy 在下面提到的,这是我如何查看 v8 生成的机器代码的骗局?
编辑:Node 从 Node 8.3 开始使用字节码,在此之前,源代码被直接编译为机器码。
我做了很多 Python 编码,而且 .pyc 文件中总是有字节码。
我想知道节点是否将其机器代码存储在类似的文件中,例如,将机器代码表示保留在磁盘上并在文件源未更改时重新使用它是有意义的。
如果是这样,node/v8 将这个机器代码存储在哪里?
编辑 2:正如@dystroy 在下面提到的,这是我如何查看 v8 生成的机器代码的骗局?
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
.
V8 是一个即时编译器。所以 JavaScript 不能像静态编译的 python 编译器那样只编译一次。它在需要执行时编译。
您看不到为 JavaScript 生成的机器代码,因为它没有被存储。存储已编译的机器代码没有意义,因为编译会重复发生并受运行时优化的影响。每次发生时,您都不会像 python 那样获得固定的机器代码。