什么"使用asm"确切地说?

Afs*_*ani 10 javascript emscripten asm.js

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

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

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

Joh*_*ers 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,
        // ...
    };
}
Run Code Online (Sandbox Code Playgroud)

模块的函数参数允许asm.js调用外部JavaScript并与"普通"JavaScript共享其堆缓冲区.从模块返回的exports对象允许外部JavaScript调用asm.js.

遗漏了"use asm",您的浏览器不会知道它应该将您的代码解释为asm.js模块.它会将您的代码视为"普通"JavaScript.但是,仅仅使用"use asm"不足以将您的代码解释为asm.js. 未能满足上文提到的任何其他标准,您的代码也将被解释为"普通"JavaScript:

在此输入图像描述

有关asm.js的更多信息,请参阅eg.John Resig的文章来自2013年官方规格.


Syn*_*tax 5

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