asm.js

警告:asm.js 规范被认为是已弃用的。开发人员可以考虑使用 WebAssembly 作为 asm.js 的替代方案,用于在浏览器中运行高性能代码。

Asm.js 是一个规范,定义了 JavaScript 的一个子集,该子集具有高度可优化性。本文将探讨 asm.js 子集允许的具体内容、它带来的改进、在哪里以及如何使用它,以及进一步的资源和示例。

asm.js 到底是什么?

它是一个非常小、严格的 JavaScript 子集,只允许诸如 whileif、数字、顶层命名函数以及其他简单构造之类的元素。它不允许对象、字符串、闭包,以及基本上任何需要堆分配的内容。Asm.js 代码在许多方面类似于 C,但它仍然是完全有效的 JavaScript,可以在所有当前引擎中运行。它推动 JS 引擎优化这种代码,并为像 Emscripten 这样的编译器提供了一种明确的代码生成定义。我们将展示 asm.js 代码的外观,并解释它如何帮助以及如何使用它。

JavaScript 的这个子集已经在许多 JavaScript 引擎中使用巧妙的即时 (JIT) 编译技术进行了高度优化。但是,通过定义一个明确的标准,我们可以更进一步地优化这种代码,并从其中获得尽可能高的性能。它更容易在多个 JS 引擎之间进行协作,因为它易于讨论和基准测试。其理念是,这种代码应该在每个引擎中都运行得非常快,如果它没有,则这是一个错误,并且存在一个明确的规范,引擎应该针对该规范进行优化。

它也方便了那些想要在 Web 上生成高性能代码的编译器编写人员。他们可以参考 asm.js 规范,并了解只要遵循 asm.js 模式,该代码就会快速运行。Emscripten 是一个 C/C++ 到 JavaScript 编译器,它会生成 asm.js 代码,使其在多个浏览器上以接近本机的性能运行。

此外,如果引擎选择专门识别 asm.js 代码,还可以进行更多优化。目前,Firefox 是唯一这样做浏览器。

asm.js 语言摘要

asm.js 是一种中间编程语言。asm.js 的性能率非常可预测,因为它仅限于 JavaScript 的一个极度受限的子集,该子集只提供严格类型化的整数、浮点数、算术、函数调用和堆访问。其性能特征比标准 JavaScript 更接近本机代码。使用 JavaScript 的子集 asm.js 已经得到主要 Web 浏览器的支持。由于 asm.js 在浏览器中运行,因此它在很大程度上依赖于浏览器和硬件。