您可以使用--trace_ignition 来获取中间字节码:
#node --trace_ignition a.js
-> 0x3aa1c02bf66e @ 0 : 80 StackCheck
-> 0x3aa1c02bf66f @ 1 : 13 13 LdaImmutableCurrentContextSlot [19]
[ accumulator <- 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
-> 0x3aa1c02bf671 @ 3 : 1f f7 Star r3
[ accumulator -> 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
[ r3 <- 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
-> 0x3aa1c02bf673 @ 5 : 21 f7 00 04 LdaNamedProperty r3, [0], [4]
[ r3 -> 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
[ accumulator <- 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
-> 0x3aa1c02bf677 @ 9 : 1f f8 Star r2
[ accumulator -> 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
[ r2 <- 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
-> 0x3aa1c02bf679 @ 11 : 21 02 01 06 LdaNamedProperty <this>, [1], [6]
[ <this> -> 0xd88d0f9a329 <a NativeModule with map 0x11929f412849> ]
[ accumulator <- 0x3aa1c02bb969 <String[6]: events> ]
-> 0x3aa1c02bf67d @ 15 : 1f f6 Star r4
[ accumulator -> 0x3aa1c02bb969 <String[6]: events> ]
[ r4 <- 0x3aa1c02bb969 <String[6]: events> ]
-> 0x3aa1c02bf67f @ 17 : 45 f8 f7 02 02 CallProperty r2, r3-r4, [2]
[ r2 -> 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
[ r3 -> 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
[ r4 -> 0x3aa1c02bb969 <String[6]: events> ]
[ accumulator <- 0xd88d0f956f1 <Very long string[15201]> ]
-> 0x3aa1c02bf684 @ 22 : 1f f9 Star r1
[ accumulator -> 0xd88d0f956f1 <Very long string[15201]> ]
[ r1 <- 0xd88d0f956f1 <Very long string[15201]> ]
您可以使用--print_code 获取本机生成的代码:
#node --print_code -e 'console.log("hello")' > code.txt
#head -100 code.txt
--- Raw source ---
(){
var originAssert = this.assert;
originAssert.apply = Function.prototype.apply;
this.assert = assertWrapper;
assertWrapper.toString = () => originAssert.toString();
function assertWrapper(){
if (!!arguments[0]) return;
originAssert.apply(null, arguments);
}
})
--- Code ---
source_position = 9
kind = FUNCTION
compiler = full-codegen
Instructions (size = 500)
0x29b8195043c0 0 55 push rbp
0x29b8195043c1 1 4889e5 REX.W movq rbp,rsp
0x29b8195043c4 4 56 push rsi
0x29b8195043c5 5 57 push rdi
0x29b8195043c6 6 488b4f2f REX.W movq rcx,[rdi+0x2f]
0x29b8195043ca 10 488b4907 REX.W movq rcx,[rcx+0x7]
0x29b8195043ce 14 83411b01 addl [rcx+0x1b],0x1
0x29b8195043d2 18 41ff75a0 push [r13-0x60]
0x29b8195043d6 22 b801000000 movl rax,0x1
0x29b8195043db 27 e80038f3ff call FastNewFunctionContextFunction (0x29b819437be0) ;; code: BUILTIN
0x29b8195043e0 32 488bf0 REX.W movq rsi,rax
0x29b8195043e3 35 488945f8 REX.W movq [rbp-0x8],rax
希望这会有所帮助。