[英]What is the difference between asm.js and WebAssembly?
我最近一直在阅读有关asm.js和WebAssembly的内容:
http://ejohn.org/blog/asmjs-javascript-compile-target/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/
我仍然对一些事情感到困惑:
asm.js是带有“高度优化”指令的JS子集。 基本上,您可以声明类型(int,float),并且js引擎(在浏览器中也可以在node.js中)将更快地执行指令。 如果与WebGL一起使用,您的应用程序会进行大量的计算或图形处理,则将具有很多好处。
Web程序集是JS的二进制格式,所有JS不仅是asm.js。 它不是字节码,而是解析器计算的AST的二进制编码。 它有2大好处:
我们已经可以为非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月:
除了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平台的集成更加高效自然。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.