当前位置: 首页 > 工具软件 > asm.js > 使用案例 >

asm.js 和 WebAssembly 有什么区别?

齐永昌
2023-12-01

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 沙箱中运行。

 

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

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

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

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

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

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

 

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 平台更有效和自然的集成。

 类似资料: