asm.js 代码是否及时编译并运行?编译成什么?
不同的浏览器以不同的方式编译 asm.js 代码。截至 2015 年 8 月:
- Firefox 将 asm.js 编译为机器码(并缓存机器码以供将来加载相同的 asm.js)[ 1 ]。
- 在 Windows 10 中作为实验标志,Edge 还将对 asm.js [ 2 ] 进行一些 Ahead-of-Time 验证和编译。
- Chrome 专门识别 asm.js 开头的“use asm”指令,以便更积极地解析和分析代码并调整编译启发式。
- Safari 不对 asm.js 进行特殊处理。
除了 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 平台更有效和自然地集成。