1. 简单百科
  2. asm.js

asm.js

asm.js 是一种ECMAScript 的严格子集,旨在允许使用C 等编程语言编写的计算机软件作为网络应用程序运行,同时保持比标准JavaScript 更高的性能。

设计原理

asm.js 是JavaScript 的一个严格子集,包含手动内存管理和静态类型的代码,这些代码可以通过源代码至源代码编译器(如基于LLVM 的Emscripten)转换为JavaScript。asm.js 的设计使得其性能能够接近本地代码,且能够在所有主流网页浏览器上运行。

代码生成

asm.js 不是直接编写的,而是通过编译器生成的一种中间语言。例如,对于一段C 语言代码,Emscripten 将输出相应的ECMAScript 代码。在生成的代码中,变量MEM8 表示一个类型缓冲区的逐字节“视图”,充当asm.js 代码的堆。

性能表现

asm.js 的性能依赖于浏览器和硬件。编译为asm.js 的C 程序的基准测试通常比使用clang 的本地编译慢一倍以上。然而,Mozilla Application Suite 的基准测试显示,使用float32 优化的Firefox 可以运行所有基准,仅比原生速度慢不到1.5 倍。

实现情况

Emscripten 提供了将C 和C++ 等语言编译为asm.js 的工具。asm.js 支持ECMAScript 6,因此所有支持该规范的新版浏览器都可以运行asm.js 代码。一些浏览器实现了针对asm.js 的特殊优化,如Mozilla Firefox 自Firefox 22 开始使用OdinMonkey 进行优化,而Microsoft Edge 使用Chakra 引擎实现asm.js 支持。

广泛采用

asm.js 已经被广泛应用于各种编程语言、应用程序框架、程序、库、游戏引擎和游戏等方面。其中包括C/C++、Lua VM、PerlPythonRuby 等编程语言,以及pepper.js、Qt 等应用程序框架。此外,还有OpenGL、SDL、SDL2、Vim、FreeType、SQLite、GNU Privacy Guard、ctags、gnuplot、Graphviz、zlib 等程序和库,以及虚幻引擎3、Unreal Engine 4、Unity、ScummVM、Godot 等游戏引擎,以及毁灭战士SuperTux、Dune II、BananaBread 等游戏。

技术发展

随着WebAssembly 的出现,asm.js 大多已经过时。WebAssembly 具有更快的解析速度,而asm.js 主要作为WebAssembly 的备用方案。WebAssembly 组织提供的程序可以将WebAssembly 转换为asm.js,但不存在专门的asm.js 到WebAssembly 的转换器。

参考资料

为什么现如今asm.js鲜有耳闻?.blog.2024-11-15

历史篇:为什么会有 WebAssembly 这样一门技术?.blog.2024-11-15

Asm.js的简单介绍.Asm.js的简单介绍.2024-11-15