V8引擎如何打印编译后的指令?

How to print the compiled instructions in V8 engine?

我已经编译了 v8_hello_world 示例,它可以在控制台中打印 "hello world"。我知道 V8 使用 JIT 编译 JavaScript,但我想打印详细信息,例如它编译的指令。而我也想知道这些指令的类型,那怎么办呢?

非常感谢~

根据您感兴趣的生成代码的类型,您必须将相应的标志传递给 V8:

  • --print-code 打印未优化的机器代码(由未优化的编译器 [=39= 创建)
  • --print-bytecode 打印字节码(由 "Ignition" 解释器创建)
  • --print-opt-code 打印优化的机器代码(由 "Crankshaft" 或 "TurboFan" 优化编译器创建)

--help 记录了这些标志(以及许多其他标志)。由于目前正在对执行管道进行重大更改,具体取决于您使用的 V8 版本,您可能会看到由不同编译器编译的相同函数。

如果您使用开发人员 shell d8,您可以直接在命令行上传递这些标志。在您自己的嵌入应用程序中,您可以使用 v8::V8::SetFlagsFromCommandLineargcargv 传递给 V8。在 d8.cc 中,您可以看到有关如何自己处理一些标志并将其他标志传递给 V8 的示例。


一年后更新:"full codegen"和"Crankshaft"不见了。 --print-bytecode 仍然打印字节码,--print-opt-code 打印优化的机器代码(现在总是来自 "Turbofan")。 --print-code 比以前做的少了,但对于生成正则表达式代码和 wasm 代码仍然有用。