编辑:节点使用自Node 8.3以来的字节码,在此之前,源代码直接编译为机器代码。
我做了很多Python编码,并且.pyc文件中总是存在字节码。
我想知道节点是否将其机器代码存储在类似的文件中,例如,将机器代码表示保存在磁盘上并在文件源未更改时重新使用它是有意义的。
如果是这样,node / v8在哪里存储此机器代码?
编辑2 :正如@dystroy在下面提到的这是How can I see the machine code generated by v8?
的欺骗答案 0 :(得分:11)
V8是一个及时的编译器。所以JavaScript不能像python编译器那样只编译一次,这是静态编译。它是在需要执行时编译的。
您无法看到生成的JavaScript机器代码,因为它未存储。存储编译的机器代码没有意义,因为编译反复发生并受运行时优化的影响。每次发生时,你都没有得到像python这样的固定机器代码。
答案 1 :(得分:8)
V8于2016年推出了一个字节码解释器Ignition。
您可以使用--print-bytecode
(节点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)
请参阅Understanding V8's Bytecode。
要查看机器代码,请使用--print-opt-code --code-comments
。
答案 2 :(得分:5)
V8将JavaScript源代码直接编译成机器代码 是第一次执行。没有中间字节代码,没有 翻译。
这就是为什么你找不到字节码,没有。
关于编辑后的新问题,我认为this related question主要回答它。当然,V8通常没有理由使用默认设置在磁盘上编写机器代码。由于此代码发生了很大变化(请参阅上面的链接,解释了如何创建动态类),这将是一个巨大的开销。