[转] 2ality 上的 Nodejs asm.js 介绍

[转] 2ality 上的 Nodejs asm.js 介绍

asm.js: closing the gap between JavaScript and native 感觉好深… 求整 C++ 的兄弟来讲解…

看起来好像 asm.js 作为 JS 的子集, 规定了各种语法对应的类型, 给当成静态语言了 Mozilla 支持 asm.js 的 OdinMonkey 引擎跑分也超高的样子

Firefox 22 里 asm.js 被 enable 了的 https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/22#JavaScript

不知道 JS 引擎怎么识别 asm.js 的代码…


2 回复

[转] 2ality 上的 Node.js asm.js 介绍

简介

asm.js 是一种严格规范化的 JavaScript 子集,旨在为 JavaScript 提供一种接近于编译型语言(如 C 或 C++)的性能。通过定义特定的语法和类型,asm.js 允许 JavaScript 引擎优化这些代码,从而实现接近原生代码的执行速度。

asm.js 的基本概念

asm.js 主要通过以下几点来提升性能:

  1. 类型化数据asm.js 代码中所有的变量都必须明确指定类型。
  2. 严格的语法asm.js 代码需要遵循严格的语法结构。
  3. 内存管理asm.js 代码通常使用 ArrayBufferTypedArray 来管理内存。

示例代码

以下是一个简单的 asm.js 示例代码,展示了如何定义一个函数,并利用 asm.js 的特性:

// 定义一个 asm.js 模块
var Module = {
    'intArray': new Int32Array(new ArrayBuffer(4 * 10)), // 预分配数组
    'floatArray': new Float32Array(new ArrayBuffer(4 * 10)) // 预分配数组
};

var MyModule = (function() {
    'use asm';

    // 导入外部模块
    var intArray = Module.intArray;
    var floatArray = Module.floatArray;

    // 定义一个函数,计算数组元素之和
    function sumArray(array) {
        var i = 0;
        var sum = 0;
        while (i < array.length) {
            sum = +sum + +array[i | 0]; // 使用 asm.js 的类型转换语法
            i = i + 1 | 0; // 类型转换
        }
        return sum | 0; // 返回整数结果
    }

    // 返回对象
    return {
        'sumArray': sumArray
    };
})();

// 使用 asm.js 函数
console.log(MyModule.sumArray(Module.intArray)); // 输出数组元素之和

如何识别 asm.js 代码

浏览器中的 JavaScript 引擎(例如 Firefox 的 OdinMonkey 引擎)通过以下方式识别 asm.js 代码:

  • 语法检查:引擎会检查代码是否符合 asm.js 的严格语法。
  • 类型检查:引擎会验证所有变量和操作符的类型是否正确。
  • 优化:一旦确定代码符合 asm.js 规范,引擎会对这些代码进行优化,以提高执行速度。

总结

asm.js 作为一种 JavaScript 子集,通过严格的语法和类型化数据,使得 JavaScript 代码可以达到接近原生代码的性能。尽管 asm.js 目前主要由 Mozilla 在 Firefox 中支持,但随着技术的发展,其他浏览器也可能逐渐引入对 asm.js 的支持。对于希望提升 JavaScript 应用性能的开发者来说,了解和使用 asm.js 是一个值得探索的方向。


asm.js 是一种 JavaScript 子集,它通过严格的类型限制使得编译器能够对代码进行更高效的优化。这使得 asm.js 代码可以在不使用额外编译步骤的情况下运行得更快。Mozilla 的 OdinMonkey 引擎是专门为执行 asm.js 代码而设计的,它可以将 asm.js 代码编译成更高效的机器码。

下面是一个简单的 asm.js 示例代码:

// 定义一个模块
var module = (function() {
    "use strict"; // 启用严格模式

    // 声明一个模块对象
    var M = {};

    // 声明一个实例化函数
    function Instance(stdlib) {
        "use asm";

        // 声明变量并指定类型
        var fround = stdlib.Math.fround;
        var sqrt = stdlib.Math.sqrt;

        // 定义函数并指定参数类型和返回值类型
        function foo(x, y) {
            x = fround(x);
            y = fround(y);

            return fround(sqrt(x * x + y * y));
        }

        // 将函数暴露给外部
        M.foo = foo;

        return M;
    }

    // 实例化模块并传入标准库
    return Instance({
        Math: self.Math
    });
})();

// 使用模块中的函数
console.log(module.foo(3, 4)); // 输出 5

在上面的例子中,我们定义了一个 asm.js 模块,它包含一个名为 foo 的函数。该函数接收两个浮点数作为输入,并返回它们之间的欧几里得距离。"use asm" 指令表示这段代码应该以 asm.js 方式执行。此外,我们还声明了变量和函数的类型,并在必要时使用了类型转换(如 fround)以确保类型正确。

回到顶部