什么“使用asm”确切地说?

时间:2014-05-03 19:21:06

标签: javascript emscripten asm.js

据我所知,Asm.js只是一个严格的JavaScript规范,它使用JavaScript功能而且它不是一种新语言。

例如,它不是使用var a = e;,而是提供var a = e|0;

我的问题是,如果asm.js只是一个定义,可以通过改变使用和声明变量和动态类型的方式来实现,"use asm";实际上做了什么?是否有必要在声明函数体之前放置此字符串?

2 个答案:

答案 0 :(得分:7)

Asm.js是一个非常严格的 JavaScript子集,它针对机器而非人类进行了优化。如果您希望浏览器将某些代码解释为asm.js代码,则需要创建一个模块,其中包含以下条件:

  • 所有代码都是完全静态类型的,并且仅限于极其严格的asm.js JavaScript子集
  • 您的模块以"use asm" pragma
  • 开头

此外,asm.js模块最多只允许三个可选但非常具体的参数:

  • 标准库对象,提供对JavaScript标准库子集的访问
  • 外部函数接口(FFI),提供对自定义外部JavaScript函数的访问
  • 堆缓冲区,提供单个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:

enter image description here

有关asm.js的更多信息,请参阅eg。 John Resig's article from 2013official specs

答案 1 :(得分:5)

"使用asm"是一个pragma,它告诉JavaScript引擎具体如何解释它。虽然它是有效的JavaScript并且可以在没有编译指示的情况下使用,但FireFox可以对Asm.js子集执行其他优化以提高性能。要做到这一点,它必须知道它是Asm.js。