2021 年如何阅读 NodeJS 的汇编代码

How to read assembler code for NodeJS in 2021

我想阅读为我的简单程序生成的选择代码:

function test() {
  const i = 2845884;
  const k = 3;

  return i == 2845884 ? k : 7;
}

test();

我发现这个要点说我需要从源代码构建 d8 并 运行 它带有 --trace-opt-verbose 标志。

https://gist.github.com/kevincennis/0cd2138c78a07412ef21

这种方法对我不起作用,我在网上找到的其他方法也一样。看起来所有当前的解决方案都已过时。

如何查看将为该程序生成哪些选择代码?

How can I see what opt codes will be generated for this program?

对于这个程序,您已经看到了所有优化代码,因为不会为它生成优化代码,因为它 运行 几乎没有任何长足以让优化编译值得付出努力。

一般来说,要打印 V8 生成的优化代码,你需要三样东西:

(1) 具有反汇编程序支持的二进制文件。这在 Debug 和“optdebug”构建中是默认打开的;对于发布版本,您需要 GN arg v8_enable_disassembler = true.

(2) 命令行标志 --print-opt-code.

(3) 一个 运行 热到足以进行优化的函数。

尝试循环调用您的 test()。如果您仍然没有看到任何东西,请 运行 更频繁地循环。
(阈值因 V8 版本、测试程序大小和行为而异,并且由于后台编译也可能是您的硬件,因此我无法在此处说明一般的经验法则数字。对于单行函数,期望需要几千个电话。)


回答你的另一个问题:是的,V8 的优化编译器支持常量折叠,你的测试程序将被折叠到 return 3.


旁注:

I found this gist that says that I need to build d8 from sources and run it with --trace-opt-verbose flag.

--trace-opt-verbose 从未打印过优化代码,您链接的要点也没有声称它确实如此。 (也就是说,那个要点提出了一堆相当可疑的说法,所以它不是一个特别好的开始来源。)

Looks like all current solutions are outdated.

或者更准确地说:那个要点没有解决您的问题。

仅在 SO 上,您就可以找到 or V8 will not print out disassembly or ,所有这些都处理这个问题的变体。

None 最近发生了变化;至少自 2014 年以来,构建标志是一项要求,命令行标志以及优化仅在一段时间后才开始的事实至少自 2011 年以来一直没有改变。

FWIW,自己构建 V8 的最简单方法是遵循 official documentation。该流程使用的 gm.py 帮助脚本甚至会自动为您设置 v8_enable_disassembler 标志。