一句话概括
- asm.js:是一个 JavaScript 的严格子集,旨在让 JS 引擎能够进行极致的静态优化,从而接近原生代码的运行速度。它是一场“静默的革命”。
- SIMD.js:是一组 JavaScript API,用于直接操作 CPU 的 SIMD 指令,实现对数据的大规模并行处理。它是一场“精准的加速”。
它们共同的目标是:解决 JavaScript 在浏览器中执行计算密集型任务时性能不足的问题,让 Web 能够承载游戏、科学计算、多媒体处理等重型应用。
1. asm.js
解决了什么问题?
在 asm.js 出现之前,人们认为用 JavaScript 写 3D 游戏、视频编码、CAD 软件等是天方夜谭。因为 JS 是动态类型、解释执行的语言,性能与 C/C++ 等编译型语言相差甚远。
asm.js 的核心思想是: 通过一套严格的编写规则,让 JavaScript 代码的类型和行为在编译时(AOT) 就能被完全确定。这样 JS 引擎(如 Firefox 的 OdinMonkey)就可以跳过大量的动态类型检查和分析,直接生成高度优化的机器码。
它是如何工作的?
asm.js 不是一种新语言,而是编写 JavaScript 的一套“契约”。其核心特征:
-
严格的类型注释:使用按位操作符来“暗示”类型。
// 普通 JS:动态类型 let a = 10; a = 10.5; // 合法,a 从整数变为浮点数 // asm.js 风格:强制类型 let a = 10 | 0; // `|0` 表示 a 是一个 32 位整数 (int) a = (a + 1) | 0; // 所有运算都要强制类型 a = 10.5 | 0; // 结果是 10,始终是整数 let b = +10.5