Asm.js
asm.js是一个中間語言,设计目的是使采用C等编程语言编写的计算机软件可运行为网络应用程序,同时性能特征明显优于标准JavaScript。 asm.js包括一个JavaScript的严格子集,其中的代码采用具有手动内存管理的静态类型语言(就像C语言)编写,代码使用一个源代码至源代码编译器(例如基于LLVM的Emscripten)翻译。通过将语言特性限制在适合提前优化和其他性能改进的范围内,性能得到了提高。 Mozilla Firefox是第一个实现针对asm.js优化的浏览器,从Firefox 22开始使用。[2] 设计asm.js由JavaScript语言的一个严格子集组成。它可以显著提高采用具有手动内存管理(例如C)的静态类型语言编写的网络应用程序在使用源代码至源代码编译器转换为JavaScript后的性能。Asm.js的目标并不是提高手写JavaScript代码的性能,也不实现增强性能以外的其他目的。 通过将语言特性限制在适合提前优化和其他性能改进的范围内,其旨在具有比标准JavaScript更接近于本地(原生)代码的性能特征。[3]通过使用JavaScript的一个子集,asm.js很大程度上支持所有主要的网页浏览器[4],这不同于WebAssembly或Google Native Client等途径。 代码生成asm.js通常不直接编写,而是作为一种通过编译器生成的中间语言,该编译器获取C++或其他语言的源代码,然后输出asm.js。 例如,提供下列C语言代码: int f(int i) {
return i + 1;
}
Emscripten将输出下列JavaScript代码: function f(i) {
i = i|0;
return (i + 1)|0;
}
注意新增的 size_t strlen(char *ptr) {
char *curr = ptr;
while (*curr != 0) {
curr++;
}
return (curr - ptr);
}
它对应以下asm.js代码: function strlen(ptr) {
ptr = ptr|0;
var curr = 0;
curr = ptr;
while (MEM8[curr]|0 != 0) {
curr = (curr + 1)|0;
}
return (curr - ptr)|0;
}
在生成的代码中,变量MEM8实际上是一个类型缓冲区的逐字节“视图”,它充当asm.js代码的堆(heap)。 性能因为asm.js在浏览器中运行,所以性能很大程度上取决于浏览器和硬件。编译为asm.js的C程序的初步基准通常比使用Clang的本地编译慢一倍以上。[5] 这种超过普通JavaScript的性能增益主要是由于100%的类型一致性以及几乎没有垃圾回收(内存是手动管理的大型类型数组)。这个更简单的模型没有动态行为,没有内存分配或释放,只有一组简单、定义明确的整数和浮点操作,从而可实现更好的性能和优化潜力。[來源請求] Mozilla在2013年12月的基准测试显示:“使用float32优化的Firefox可以运行所有基准,只比原生速度慢不到1.5倍。[6] Mozilla指出本地编译代码的性能不是单个度量,而是一个范围,使用不同的本地编译器(此例中为Clang与GCC)将提供不同性能的代码。“事实上,在一些基准测试比如Box2D、FASTA和copy中,asm.js与Clang比较接近,或者比Clang到GCC还接近Clang。在一种情况下,asm.js甚至在Box2D上略微击败Clang。” 实现Emscripten项目提供了可以编译C和C++(或其他任何可转换为LLVM IR的语言)代码为asm.js的工具。[7] 所有支持JavaScript较新版本的浏览器都应该能支持运行asm.js代码,因为它是该规范的子集。 部分浏览器的实现针对asm.js进行了特别优化:
采用目前几乎所有基于asm.js的应用程序都是使用Emscripten或Mandreel编译为asm.js的C/C++应用程序。 到目前为止,已有不少编程语言、应用程序框架、程序、函式庫、游戏、游戏引擎及其他软件已被移植。[10]部分名单见下: 编程语言
应用程序框架程序和库
游戏引擎游戏
仿真器数学计算
参见
参考资料
外部链接
|
Portal di Ensiklopedia Dunia