asm.js和web程序有什么不同?

最近我一直在阅读关于asm.js和web程序集:

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

From ASM.JS to WebAssembly

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

  1. asm.js代码是否及时编译并运行? 编译成什么?
  2. 除了asm.js是二进制文本和wasm(web程序集)之外,2之间有什么区别?
  3. 这对浏览器中运行的其他脚本语言意味着什么? 以python为例,它会是
    • python代码编译为wasm? 要么
    • python解释器(Cpython)编译成wasm和解释python?

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

asm.js是常规的javascript代码,并一直由JS解释器编译成字节码。 然而,一个具有asm支持的解释器应该提前编译,并且可能由于静态types而产生更高效的代码表示。 有关详细信息,请参阅http://asmjs.org/

asm和wasm之间有什么区别(除了text和binary)?

没有,现在。 wasm被认为是向后兼容的,可编译为asm (它也可以像普通的JS那样执行)。 未来随着支持的增长,它可能会扩展更多的function 。

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

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

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

web程序集是JS的所有JS的二进制格式,不仅是asm.js. 这不是一个字节码,它是parsing器计算的AST的二进制编码。 它有两大好处:

  • JS引擎可以跳过parsing步骤
  • 它比JS原始资源更紧凑

我们已经可以编写不是JS的浏览器代码:EMSCripten可以在JS代码中编译c ++代码。 其他的编译器已经可以将你的代码编译成JS了。 使用asm.js代码可以运行得更快,当它算术。 使用Web程序集,代码将更加紧凑,浏览器将能够更快地处理它(因为它可以跳过parsing)。 您将不会有像DirectX,JavaApplets,Flash或Silverlight一样的新插件,因为所有东西都将在JS沙箱中运行。

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

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

  • Firefox将asm.js编译为机器代码(并将机器代码caching,以便将来加载相同的asm.js)[ 1 ]。
  • 在Windows 10中,作为一个实验性的标志,Edge也会对asm.js进行一些前期的validation和编译[ 2 ]。
  • Chrome特别认识到asm.js开头的“使用asm”指令可以更加殷切地parsing和分析代码,并且可以调整编译启发式。
  • Safari没有对asm.js进行特殊处理。

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

asm.js只是JavaScript,因此必须根据JavaScript规范来运行。 作为一个新的标准,WebAssembly能够修复JavaScript行为不理想的一些案例(从性能或编译的angular度来看)[ 3 ]。 在将来[ 4 ],WebAssembly将能够添加否则难以在JavaScript中expression的function。

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

  • python代码编译为wasm? 要么
  • python解释器(Cpython)编译成wasm和解释python?

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