据我所知,Asm.js只是一个严格的JavaScript规范,它使用JavaScript功能而且它不是一种新语言。
例如,它不是使用var a = e;
,而是提供var a = e|0;
。
我的问题是,如果asm.js只是一个定义,可以通过改变使用和声明变量和动态类型的方式来实现,"use asm";
实际上做了什么?是否有必要在声明函数体之前放置此字符串?
答案 0 :(得分:7)
Asm.js是一个非常严格的 JavaScript子集,它针对机器而非人类进行了优化。如果您希望浏览器将某些代码解释为asm.js代码,则需要创建一个模块,其中包含以下条件:
"use asm"
pragma 此外,asm.js模块最多只允许三个可选但非常具体的参数:
ArrayBuffer
作为asm.js堆所以,你的模块基本上应该是这样的:
function MyAsmModule(stdlib, foreign, heap) {
"use asm";
// module body...
return {
export1: f1,
export2: f2,
// ...
};
}
模块的函数参数允许asm.js调用外部JavaScript并与" normal"共享其堆缓冲区。 JavaScript的。从模块返回的exports对象允许外部JavaScript调用asm.js。
忽略"use asm"
,您的浏览器不会知道它应该将您的代码解释为asm.js模块。它会将您的代码视为"普通" JavaScript的。但是,仅使用"use asm"
并不足以将代码解释为asm.js.不符合上文提到的任何其他标准,您的代码也将被解释为"普通" JavaScript:
有关asm.js的更多信息,请参阅eg。 John Resig's article from 2013或official specs。
答案 1 :(得分:5)
"使用asm"是一个pragma,它告诉JavaScript引擎具体如何解释它。虽然它是有效的JavaScript并且可以在没有编译指示的情况下使用,但FireFox可以对Asm.js子集执行其他优化以提高性能。要做到这一点,它必须知道它是Asm.js。