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

时间:2016-03-16 17:34:24

标签: v8 asm.js webassembly

在调查最近宣布的对WebAssembly的支持后,我发现如果有某种方法可以大大提高它的实用性:

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

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

  3. 有没有办法做到这一点?

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

      

    在幕后,V8中的WebAssembly实现旨在实现   重用现有的大部分JavaScript虚拟机基础架构,   特别是TurboFan编译器。专门的WebAssembly解码器   通过检查类型,局部变量索引,函数来验证模块   引用,返回值和控制流结构在一个单独的   通过。解码器生成一个TurboFan图,由其处理   各种优化通过,最后变成机器代码   生成优化JavaScript的机器代码的后端   和asm.js.在接下来的几个月里,团队将专注于   通过编译器改善V8实现的启动时间   调优,并行和编译策略改进。

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

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

2 个答案:

答案 0 :(得分:1)

对于1.您可以使用以下标志:

  • trace_turbo:跟踪生成的TurboFan IR
  • trace_turbo_graph:跟踪生成的TurboFan图
  • trace_turbo_cfg_file:跟踪turbo cfg图(对于C1 visualizer)到给定的文件名
  • 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.

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

答案 1 :(得分:1)

不,这是不可能的,并且它不太可能,因为它可能需要在系统内穿透各种抽象障碍。复杂性将是巨大的,对可维护性和安全性的影响可能会很严重。

WebAssembly模块的Web界面(通过Wasm对象)提供了一种简洁的方法来连接JS和Wasm。将来,ES6模块可能会进一步简化互操作。你提出的复杂机制对此有什么好处并不明显。