Asm.js 和 WebAssembly 的区别是什么?

我最近一直在阅读 asm.js 和 WebAssembly:

Http://ejohn.org/blog/asmjs-javascript-compile-target/

Https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

我仍然对一些事情感到困惑:

  1. Asm.js 代码是按时间和运行编译的吗? 编译成什么?
  2. 除了 asm.js 是文本和 wasm (web 汇编)是二进制之外,两者之间有什么区别?
  3. 这对于在浏览器中运行的其他脚本语言意味着什么?以 python 为例,它会是
    • 编译为 wasm? 或
    • Python 解释器(Cpython)编译成 wasm 并解释 python?
34394 次浏览

Asm.js 代码是按时间和运行编译的吗? 编译成什么?

JS 是常规的 javascript 代码,一如既往地由 JS 解释器编译成字节码。但是,一个支持提前编译的解释器需要进行编译,并且由于静态类型的原因,可能会生成更有效的代码表示。详情请参阅 http://asmjs.org/

高潮和高潮(除了文本和二进制)有什么区别?

暂时没有。Wasm 应该是向后兼容的,可以编译成阿姆斯特丹(同样作为普通 JS 可以执行)。然而,随着对它的支持的增加,它可能在将来与 更多的功能一起扩展。

这对于在浏览器中运行的其他脚本语言意味着什么?

后者,更确切地说,仍然需要对 Python 进行解释。不需要解释器的脚本语言当然可以直接编译成(w) asm,因为有一个编译器(链)支持它作为目标。

Asm.js 代码是按时间和运行编译的吗? 编译成什么?

不同的浏览器以不同的方式编译 asm.js 代码:

  • Firefox 将 asm.js 编译成机器代码(并缓存机器代码以便将来加载相同的 asm.js)[ 1]。
  • 在 Windows 10中,作为一个实验标志,Edge 还将对 asm.js [ 2]进行一些提前验证和编译。
  • Chrome specially recognizes the "use asm" directive at the beginning of asm.js to parse and analyze it the code more eagerly and tweak compilation heuristics.
  • Safari 不对 asm.js 进行特殊处理。

除了 asm.js 是文本和 wasm (web 汇编)是二进制之外,两者之间有什么区别?

Js 只是 JavaScript,因此必须严格按照 JavaScript 规范行事。作为一个新的标准,WebAssembly 能够修复某些 JavaScript 行为不理想的情况(从性能或编译的角度来看)[ 3]。在未来[ 4] ,WebAssembly 将能够添加在其他情况下难以用 JavaScript 表达的特性。

这对于其他脚本语言来说意味着什么 以 python 为例,它会是

  • 编译为 wasm? 或
  • Python 解释器(Cpython)编译成 wasm 并解释 python?

在 v.1中,在浏览器中运行 Python 的最简单方法是将 Python 解释器编译成 wasm,正如您所说的。这意味着,例如,Python GC 在 wasm 代码中运行,并手动管理 wasm 线性内存。已经有一个实验项目向 PyPy [ 5]添加 asm.js 后端(这对 wasm 也同样适用)。它目前遇到了 asm.js 的局限性,可以通过 wasm 的 动态链接未来特性来解决。更进一步,wasm 寻求同时提供 GC integrationJIT 编译支持,它们都将允许更有效和自然地与 Web 平台集成。

JS 是具有“高度优化”指令的 JS 的子集。基本上,您可以声明类型(int,float)和 js 引擎(在浏览器中以及 node.js 引擎中)将更快地执行指令。如果您的应用程序与 WebGL 一起使用,那么它会带来很多好处,如果您的应用程序进行了大量的计算或图形处理。

Web Assembly 是一种二进制格式,适用于所有 JS,而不仅仅是 asm.JS。它不是字节码,而是解析器计算的 AST 的二进制编码。它有两大好处:

  • JS 引擎可以跳过解析步骤
  • 它比 JS 原始源代码紧凑得多

我们已经可以为不是 JS 的浏览器编写代码: EMSCripten 可以在 JS 代码中编译 c + + 代码。其他转换编译器已经可以将您的代码编译成 JS。 使用 asm.js,代码运行速度可以更快,当它做数学。 使用 Web 汇编,代码将更加紧凑,浏览器将能够更快地处理它(因为它将能够跳过解析)。 你不会有像 DirectX、 JavaApplet、 Flash 或 Silverlight 这样的新插件来加载,因为所有东西都会在 JS 沙盒中运行。