108

我最近一直在阅读有关 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为例,会不会
    • python代码编译成wasm?或者
    • python解释器(Cpython)编译成wasm并解释python?
4

3 回答 3

55

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

web组装是JS的二进制格式,所有的JS,不仅仅是asm.js。它不是字节码,而是解析器计算的 AST 的二进制编码。它有两大好处:

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

我们已经可以为非 JS 的浏览器编写代码:EMSCripten 可以在 JS 代码中编译 c++ 代码。其他转编译器已经可用于将您的代码编译成 JS。使用 asm.js,代码在进行数学运算时可以运行得更快。使用 Web 程序集,代码会更紧凑,浏览器将能够更快地处理它(因为它能够跳过解析)。您不会需要加载 DirectX、JavaApplets、Flash 或 Silverlight 等新插件,因为一切都将在 JS 沙箱中运行。

于 2015-08-13T15:02:08.610 回答
54

asm.js 代码是否及时编译并运行?编译成什么?

asm.js 是常规的 javascript 代码,由 JS 解释器一如既往地编译成字节码。但是,支持 asm 的解释器应该进行提前编译,并且可能由于静态类型而生成更有效的代码表示。有关详细信息,请参阅http://asmjs.org/

asm 和 wasm 之间有什么区别(文本与二进制除外)?

暂时没有。wasm 应该是向后兼容的,可编译为 asm(同样可以作为普通 JS 执行)。然而,随着对它的支持的增长,它可能会在未来扩展更多功能

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

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

于 2015-07-19T15:26:58.053 回答
22

asm.js 代码是否及时编译并运行?编译成什么?

不同的浏览器以不同的方式编译 asm.js 代码。截至 2015 年 8 月:

  • Firefox 将 asm.js 编译为机器码(并缓存机器码以供将来加载相同的 asm.js)[ 1 ]。
  • 在 Windows 10 中作为实验标志,Edge 还将对 asm.js [ 2 ] 进行一些 Ahead-of-Time 验证和编译。
  • Chrome 专门识别 asm.js 开头的“use asm”指令,以便更积极地解析和分析代码并调整编译启发式。
  • Safari 不对 asm.js 进行特殊处理。

除了 asm.js 是文本和 wasm(Web 程序集)是二进制之外,两者之间有什么区别?

asm.js 只是 JavaScript,因此必须完全符合 JavaScript 规范。作为一个新标准,WebAssembly 能够修复一些 JavaScript 行为不理想的极端情况(从性能或编译的角度来看)[ 3 ]。在未来 [ 4 ] 中,WebAssembly 将能够添加在 JavaScript 中难以表达的功能。

这对于在浏览器中运行的其他脚本语言意味着什么?以python为例,会不会

  • python代码编译成wasm?或者
  • python解释器(Cpython)编译成wasm并解释python?

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

于 2015-07-20T06:37:45.070 回答