网络浏览器的主要JavaScript
引擎和nodeJS
多年来都有just-in-time
个编译器。
我正在观看Compiler Explorer上的视频,显示许多编译器为各种CPU输出的汇编代码。
这让我想起了我对JS引擎的jits生成的代码感到好奇。
这些引擎中是否有任何方法可以让我们看到低级生成的代码?
(如果这在SO上不合适,请随意将其迁移到正确的SE网站。)
答案 0 :(得分:2)
对于V8,有一个标志--print-opt-code
,它为每个被优化的函数打印生成的优化汇编代码。请注意,功能仅在他们“热”时才会得到优化,而不是立即进行优化,因此对于短暂的“世界”而言风格程序旗帜不会打印任何东西。你可以制作功能" hot"通过打电话给他们很多。
在旧版本中,未优化代码有一个--print-code
标志,但由于基线(非优化)编译器已被解释器替换,因此不再存在未经优化的代码。您可以使用--print-bytecode
打印生成的字节码。
如果你正在使用Chrome,你可以通过将它们包装在-js-flags中来指定要传递给V8的标志,例如--js-flags="--print-opt-code"
。
答案 1 :(得分:0)
您可以随时做的一件事是changelog。
如果它将大部分时间花在JIT编译的代码中,那么当前的指令指针值(RIP)可能会出现在一些JIT编译的机器代码中,您的调试器将为您进行反汇编。 (或者至少在当前RIP之后的部分:x86机器代码使用可变长度指令,因此没有可靠的方法可以向后移动。您可以单步执行直到达到向后分支以到达循环的顶部。)
但是没有任何方法可以确定你看到JITed asm的函数名称,除非你只有一个热循环(例如在人工测试/微基准测试中),否则这可能不是很有用。
让JIT引擎在生成它时打印asm(@ jmrk的答案)很多更有用;我只提到这种技术,因为它可以在没有JIT引擎的任何支持的情况下工作,因此它可以处理任何事情。