代码之家  ›  专栏  ›  技术社区  ›  Willem van der Veen

将Assemblyscript编译为Wasm,性能

  •  2
  • Willem van der Veen  · 技术社区  · 7 年前

    我看到已经有一个编译器可以将TypeScript编译到WebAssembly(Wasm), here is the link

    我还从多个来源听说,将JS编译为Wasm是不可行的,因为JavaScript具有动态特性和动态类型。

    然而,TypeScript确实提供了JavaScript所缺少的类型化变量。将来,Wasm甚至可以与DOM交互/与其他web API交互。

    问题:

    与用JavaScript编写web应用程序相比,用TypeScript编写应用程序并将其编译为Wasm是否有任何性能优势?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jonas Wilms    7 年前

    如果你能把某个Javascript功能编译成Wasm 跑得更快。与其他动态语言相比,JavaScript运行得非常快,因为(大多数)浏览器将其编译为一个低级字节码,该字节码被解释得非常快(甚至在本机上运行)。Wasm被设计为非常接近字节码,因此在最好的情况下JS和“JS的一个子集,其类型被编译为Wasm”以相同的速度运行(如果两个编译器都做得很好)。但是:

    2) JavaScript必须经过优化才能如此快速地运行,而且由于它不知道变量和属性的类型/生存期,因此在引擎找到编译它的最佳方法之前,它需要一段时间,因此这个优化过程需要时间。(热身时间)。

    也就是说,由于各种原因,您不能将大多数JavaScript或TypeScript转换为Wasm(这就是AssemblyScript是TS的一个子集的原因):

    (一) eval , with 或者只是 for(const el of [1, "seven", null])

    2) JavaScript有垃圾回收。

        2
  •  3
  •   Andreas Rossberg    7 年前

    现实的答案是:不。对打字有一些常见的误解。一是它的动态性不如JavaScript。这不是真的,事实上它和JS一样是动态的,因为它包含了JavaScript的所有语义(包括所有疯狂的角落情况),而且它的类型系统太弱和不健全,无法保证普通的离线编译器可以用于静态优化。最多,这些类型可以用作 动态VM可以尝试首先进行优化,因为它很清楚它们可能是不正确的。