asm.js和WebAssembly有什么区别?


101

我最近一直在阅读有关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?

Answers:


47

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

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

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

暂时没有。wasm应该是向后兼容的,可以编译为asm(可以再次作为普通JS执行)。但是,随着对它的支持的增加,将来可能会扩展它以提供更多功能

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

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


几个笔记。您的答案的第一部分似乎有点含糊;听起来您好像在说asm.js将AOT编译为“更有效的字节码”。实际上,实现不必以字节码为目标,实际上,许多实现都直接以本机ISA和AOT为目标(这确实很重要)。您还说“可编译为asm和js”。您可能需要澄清一下,是要说“本地程序集”之类的。也许您的意思是“ asm.js和js”,但这并不太有用,因为一个是另一个的子集。
TNE

1
@tne:感谢您的反馈,希望我能解决问题-随时(建议)编辑自己,我将不胜感激。是的,我对“更有效的字节码”有点松懈,因为我对确切的编译体系结构并不熟悉,毕竟ISA只是由处理器解释的另一个“字节码”。请原谅不准确的术语:-)
Bergi 2015年

53

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

Web程序集是JS(不仅是asm.js)的所有JS的二进制格式。它不是字节码,而是解析器计算的AST的二进制编码。它有2大好处:

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

我们已经可以为非JS的浏览器编写代码:EMSCripten可以在JS代码中编译c ++代码。其他反编译器已经可以将您的代码编译为JS。使用asm.js进行数学运算时,代码可以更快地运行。使用Web汇编,代码将更加紧凑,浏览器将能够更快地处理它(因为它将能够跳过解析)。您将不需要像DirectX,JavaApplets,Flash或Silverlight这样的新插件来加载,因为所有插件都将在JS沙箱中运行。


5
跳过解析?慢下来,那里。在可预见的将来,硬件支持不在规划范围之内。您的意思是,解析已成为asm.js的瓶颈,而wasm使用高效的二进制格式修复了该问题。您对asm.js / wasm的依据似乎有些简单,但这没关系。指出字节码!= AST的道具。
TNE

4
@ Cristian,WASM不是JS的二进制格式。它将使用与JS相同的Web API,但是它比JS具有更高的可移植性和通用性。JS或字节码的唯一二进制格式是在浏览器中实现的,例如Firefox在此处:developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…–
LearningFast

20

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

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

  • Firefox将asm.js编译为机器代码(并为以后的相同asm.js加载而缓存机器代码)[ 1 ]。
  • 在Windows 10中,作为实验性标志,Edge还将提前进行asm.js的验证和编译[ 2 ]。
  • 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平台的集成更加高效自然。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.