asm.js和WebAssembly有什么区别?

Neo*_*ang 93 javascript asm.js webassembly

我最近一直在阅读关于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是text和wasm(web assembly)是二进制之外,2之间有什么区别?
  3. 这对于在浏览器中运行的其他脚本语言意味着什么?以python为例,它会是什么样的
    • python代码编译为wasm?要么
    • python interpreter(Cpython)编译成wasm并解释python?

cri*_*n v 49

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的瓶颈,并且ism用高效的二进制格式修复了它.你对asm.js/wasm的理由看起来有点极简,但那没关系.用于指出字节码的道具!= AST. (5认同)
  • @ Cristian,WASM不是JS的二进制格式。它将使用与JS相同的Web API,但是它比JS具有更高的可移植性和通用性。JS或字节码的唯一二进制格式是在浏览器中实现的二进制格式,例如Firefox在这里:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/Bytecodes (3认同)

Ber*_*rgi 44

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

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

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

没有,现在.wasm应该是向后兼容的,可编译为asm(它也可以像普通的JS那样执行).它可能然而与扩展更多的功能在未来它的增长作为支撑.

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

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


Luk*_*uke 19

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

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

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

除了asm.js是text和wasm(web assembly)是二进制之外,2之间有什么区别?

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

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

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

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