asm.js是具有“高度可优化”指令的 JS 子集。基本上你可以声明类型 (int, float) 和 js 引擎(在浏览器和 node.js 中)将更快地执行指令。如果您的应用程序与 WebGL 一起使用,它会进行大量计算或图形处理,这将带来好处。
web程序集是JS的二进制格式,所有的JS,不仅仅是asm.js。它不是字节码,而是解析器计算的 AST 的二进制编码。它有两大好处:
我们已经可以为非 JS 的浏览器编写代码:EMSCripten 可以在 JS 代码中编译 c++ 代码。其他转编译器已经可以将您的代码编译成 JS。使用 asm.js,代码在进行数学运算时可以运行得更快。使用 web 程序集,代码将更紧凑,浏览器将能够更快地处理它(因为它将能够跳过解析)。您不会像 DirectX、JavaApplets、Flash 或 Silverlight 那样加载新插件,因为一切都将在 JS 沙箱中运行。
asm.js 是普通的 javascript 代码,和往常一样被 JS 解释器编译成字节码。但是,具有 asm 支持的解释器应该进行提前编译,并且可能由于静态类型而生成更有效的代码表示。有关详细信息,请参阅 http://asmjs.org/。
asm 和 wasm 之间有什么区别(文本与二进制除外)?
没有,暂时没有。wasm 应该是向后兼容的,可以编译为 asm(它也可以像普通 JS 一样执行)。然而,随着对它的支持的增加,它可能会在未来扩展更多功能。
这对于在浏览器中运行的其他脚本语言意味着什么?
相反,后者作为 Python 仍然需要解释。不需要解释器的脚本语言当然可以直接编译为 (w)asm,因为有一个编译器(链)支持它作为目标。
不同的浏览器以不同的方式编译 asm.js 代码。截至 2015 年 8 月:
除了 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 平台更有效和自然的集成。