我最近一直在阅读关于asm.js和WebAssembly:
http://ejohn.org/blog/asmjs-javascript-compile-target/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/
我仍然对一些事情感到困惑:
答案 0 :(得分:44)
asm.js 是JS的一个子集,"高度可优化"说明。基本上你可以声明类型(int,float)和js引擎(在浏览器中,但是node.js中)将更快地执行指令。如果您的应用程序在与WebGL一起使用时进行大量计算或图形,则会有好处。
web assembly 是JS的二进制格式,所有JS,不仅仅是asm.js.它不是字节码,它是解析器计算的AST的二进制编码。它有两大好处:
我们已经可以为不是JS的浏览器编写代码:EMSCripten可以在JS代码中编译c ++代码。其他转换编译器已经可以将代码编译成JS。 使用asm.js代码可以在进行数学运算时运行得更快。 使用Web程序集,代码将更紧凑,浏览器将能够更快地处理它(因为它将能够跳过解析)。 您没有像DirectX,JavaApplets,Flash或Silverlight那样加载新插件,因为所有内容都将在JS沙箱中运行。
答案 1 :(得分:40)
asm.js代码是否及时编译并运行?编译成什么?
asm.js是常规的javascript代码,并且由JS解释器一如既往地编译成字节码。但是,具有asm支持的解释器应该提前进行编译,并且可能由于静态类型而生成更有效的代码表示。有关详细信息,请参阅http://asmjs.org/。
asm和wasm之间有什么区别(文本与二进制除外)?
没有,现在。 wasm应该是向后兼容的,compilable to asm(它可以作为普通的JS执行)。然而,随着对它的支持增长,它可能会在more features扩展。
这对于在浏览器中运行的其他脚本语言意味着什么?
后者,相反,因为Python仍然需要被解释。不需要解释器的脚本语言当然可以直接编译为(w)asm,因为有一个编译器(链)支持它作为目标。
答案 2 :(得分:19)
asm.js代码是否及时编译并运行?编译成什么?
不同的浏览器以不同的方式编译asm.js代码。截至2015年8月:
除了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的限制,可由dynamic linking future feature的wasm解决。更进一步,wasm寻求提供GC integration和JIT compilation support两者,这两者都可以更有效和自然地与Web平台集成。