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程序集)是二进制之外,两者之间有什么区别?
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平台的集成更加高效自然。