【问题标题】:How to view the assembly code generated from my JavaScript (in Chrome)?如何查看从我的 JavaScript(在 Chrome 中)生成的汇编代码?
【发布时间】:2019-12-19 14:38:04
【问题描述】:

是否有可能查看浏览器从我的 Javascript 生成的最终机器代码(x86 指令)?例如

--- Raw source ---
function add(a, b){
  return a + b;
}
...

--- Code ---
source_position = 0
kind = FUNCTION
Instructions (size = 456)
0x36953100     0  8b4c2404       mov ecx,[esp+0x4]
0x36953104     4  81f991806049   cmp ecx,0x49608091          ;; object: 0x49608091 <undefined>
0x3695310a    10  750a           jnz 22  (0x36953116)
0x3695310c    12  8b4e13         mov ecx,[esi+0x13]
0x3695310f    15  8b4917         mov ecx,[ecx+0x17]
0x36953112    18  894c2404       mov [esp+0x4],ecx
0x36953116    22  55             push ebp

谢谢!

【问题讨论】:

标签: javascript assembly browser v8 disassembly


【解决方案1】:

您的脚本不会直接转换为机器代码。 JavaScript 在虚拟机 V8 上运行(chrome 和经典 nodejs 都是如此),您可以使用以下方式获取 VM 字节码:

node --print-bytecode script.js

然后V8执行并优化字节码并调用外部C库和OS API(系统调用)或WEB API。即使使用相同的 javascript 代码(例如优化前后),最终的机器代码也可能会有所不同。

您也可以从命令行启动 Chrome --js-flags="--print-bytecode"

UPD:

@PeterCordes 注意到 nodejs 允许查看 Turbofan 使用

生成的机器代码
node --print-opt-code script.js

铬:

--js-flags="--print-opt-code"

您也可以使用 HTML 可视化工具,例如 https://github.com/v8/v8/tree/master/tools/turbolizer

【讨论】:

  • OP 不想只看字节码,他们想要实际优化的机器代码,在内联和配置文件引导优化之后最终得到 JITed。这才是最终表现真正重要的东西。 (这个答案对于查看字节码的相关问题有些有用,但不能回答真正的问题。)
  • @PeterCordes 我想说 OP 看不到最终机器码
  • 可能不在浏览器中,但在 node.js 中是可能的。 get assembly code generated by JavaScript compiler
  • 感谢您的评论,我学到了一些新东西并更新了我的答案:) 无论如何 OP 使用浏览器环境 :(
  • 另外github.com/v8/v8/tree/master/tools/turbolizer 是一个查看优化各个阶段的工具,包括最终汇编。同样,可能无法在浏览器中使用,但在 node.js 中运行相同的东西可能会得到与 chrome 中的 v8 相似的结果,如果代码不太依赖浏览器特定的 API 来显示内容。
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
相关资源
最近更新 更多