asm.js和WebAssembly的区别是什么?
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代码是否及时编译并运行?编译成什么?
- 除了asm.js是文本和wasm (web assembly)是二进制之外,两者之间有什么区别?
- 这对于在浏览器中运行的其他脚本语言意味着什么?以蟒蛇为例,它会是
- python代码编译成wasm?或
- python解释器(Cpython)编译成wasm并解释python?
asm.js代码是否及时编译并运行?编译成什么?
asm.js是常规的javascript代码,并像往常一样由JS解释器编译成字节码。但是,具有asm支持的解释器应该进行提前编译,并且可能由于静态类型而生成更有效的代码表示。详见http://asmjs.org/
asm和wasm之间的区别是什么(除了文本和二进制)?
暂时没有。wasm应该是向后兼容的,可编译为asm(这也是像普通JS一样可执行的)。然而,随着对它的支持的增长,它可能会在未来扩展更多的功能。
这对于在浏览器中运行的其他脚本语言意味着什么?
后者,因为Python仍然需要被解释。不需要解释器的脚本语言当然可以直接编译成(w)asm,只要有一个编译器(链)支持它作为目标。
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、javaapplet、Flash或Silverlight这样的新插件,因为一切都将在JS沙盒中运行。
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 assembly)是二进制之外,两者之间有什么区别?
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平台更有效、更自然的集成。
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- emu -model、emu -restless和emu之间的主要区别(优缺点)是什么?
- function()在jQuery中是什么意思?这个和$(这个)有什么区别