[转] 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 的代码…
[转] 2ality 上的 Node.js asm.js 介绍
简介
asm.js 是一种严格规范化的 JavaScript 子集,旨在为 JavaScript 提供一种接近于编译型语言(如 C 或 C++)的性能。通过定义特定的语法和类型,asm.js 允许 JavaScript 引擎优化这些代码,从而实现接近原生代码的执行速度。
asm.js 的基本概念
asm.js 主要通过以下几点来提升性能:
- 类型化数据:
asm.js代码中所有的变量都必须明确指定类型。 - 严格的语法:
asm.js代码需要遵循严格的语法结构。 - 内存管理:
asm.js代码通常使用ArrayBuffer和TypedArray来管理内存。 
示例代码
以下是一个简单的 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)以确保类型正确。
        
      
                    
                  
                    
