有没有办法为 V8 Turbofan 提供 asm.js 或 WebAssembly 代码?

Is There a Way of Providing asm.js or WebAssembly Code to V8 Turbofan?

在研究了最近宣布的对 WebAssembly 的支持后,我突然想到,如果有一些方法可以显着提高它的实用性:

  1. 让 TurboFan,the V8 JIT Crankshaft optimizer 的继任者输出它生成的所有汇编代码以及静态类型签名和生成代码的执行配置文件。

  2. 允许程序员提供他自己的 asm。js/WebAssembly 覆盖优化器的特定静态类型签名的代码。

有没有办法做到这一点?

有迹象表明它可能来自 this article 的以下段落:

Under the hood, the WebAssembly implementation in V8 is designed to reuse much of the existing JavaScript virtual machine infrastructure, specifically the TurboFan compiler. A specialized WebAssembly decoder validates modules by checking types, local variable indices, function references, return values, and control flow structure in a single pass. The decoder produces a TurboFan graph which is processed by various optimization passes and finally turned into machine code by the same backend which generates machine code for optimized JavaScript and asm.js. In the next few months, the team will concentrate on improving the startup time of the V8 implementation through compiler tuning, parallelism, and compilation policy improvements.

为更广泛的受众扩展这个想法:

典型的自上而下优化涉及高级编程,然后执行分析以确定哪些代码片段需要更多工作。无论优化是自动代码生成还是优化代码的手动编码,都是如此。在动态类型语言的情况下,您经常希望超越仅仅优化动态类型算法并提供专门用于特定静态类型的代码。实际上,这是 V8 JIT 优化器自动执行的操作。如果人类想要手动提供一些特别的 'hot' 特殊情况,他们需要以某种方式通知自动优化器他们已经完成了工作,以便自动优化器可以合并手动优化的代码而不是自动生成次优代码代码。

对于 1. 您可以使用以下标志进行游戏:

  • trace_turbo:跟踪生成的 TurboFan IR
  • trace_turbo_graph:跟踪生成的 TurboFan 图
  • trace_turbo_cfg_file:跟踪 turbo cfg 图(对于 C1 可视化工具)到给定文件名
  • trace_turbo_types:跟踪 TurboFan 的类型
  • trace_turbo_scheduler:跟踪 TurboFan 的调度程序
  • trace_turbo_reduction: 跟踪 TurboFan 的各种减速器
  • trace_turbo_jt: 跟踪 TurboFan 的跳转线程
  • trace_turbo_ceq: 跟踪 TurboFan 的控制等效性
  • turbo_stats:打印 TurboFan 统计数据

它们可能会在 V8 的未来版本中发生变化,并且不稳定 API。

TurboFan 相当复杂,因为它使用来自基线 JIT/解释器的信息,并且可能在 deopt 后获取该信息。编译器并不总是从 JS / wasm 到汇编的直接管道。内联和其他一些事情会影响发生的事情。

对于2.: 写wasm代码或者有效asm.js放在首位

我们已经讨论了执行一系列不同类型的动态跟踪、缓存跟踪(并允许注入跟踪以进行测试),但考虑到已经有一种方法可以为编译器提供这些,我们可能不会公开这些内容准确的类型信息!

不,那不可能,而且永远不可能,因为它可能需要突破系统内的各种抽象障碍。复杂性将是巨大的,并且对可维护性和安全性的影响可能会很严重。

WebAssembly 模块的 Web 界面(通过 Wasm 对象)提供了一种干净简单的方式来连接 JS 和 Wasm。将来,ES6 模块可能会进一步简化互操作。像您建议的复杂机制相比于此有什么优势并不明显。