五分钟了解asm.js和WebAssembly

Asm.js是什么?

相信很多读者都或多或少地听说过Asm.js这个名词,但它究竟是什么意思呢?

先看一眼官方的定义:

an extraordinarily optimizable, low-level subset of JavaScript

极度优化的底层的javascript子集

可以看到主要的三个关键词。

  1. 极度优化。asm.js是一种提升js执行效率的解决方案。

    asm.js能带来非常高的效率提升。甚至能让浏览器运行3d游戏。

  2. 底层的。

底层到什么程度呢?就相当于是浏览器js引擎中的C语言了。

asm.js它的变量一律都是静态类型,并且取消垃圾回收机制。

当浏览器的JavaScript 引擎发现运行的是 asm.js时,就会跳过语法分析这一步,将其转成汇编语言执行。另外,浏览器还会通过 GPU 调用 WebGL 执行 asm.js,使其运行得更快。

据称,asm.js 在浏览器里的运行速度,甚至可以达到原生代码运行速度的一半。

3. javascript子集。

asm.js虽然语法没有脱离javascript的范畴,但是javascript中很多语法在asm.js中是不能使用的。

比如asm.js只提供了两种数据类型:32位带符号整数和64位带符号浮点数。其他数据类型,比如字符串、布尔值或者对象,asm.js 一概不提供。它们都是以数值的形式存在,保存在内存中,通过 TypedArray 调用。

asm.js的数据类型

又比如asm.js的变量要求事先声明类型,并且不得改变。这样虽然使其丧失了javascript灵动多变的特性,但是就节省了类型判断的时间,提高了运行效率。

再比如asm.js甚至连垃圾回收机制也抛弃了,所有内存操作都由程序员自己控制。

如何编写Asm.js?

虽然名字叫“asm.js”,虽然asm.js也可以直接用javascript来编写,但是这样写出来的代码可读性非常差。

而且asm.js的初衷就是将C/C++程序移植到浏览器上来。

所以通常的做法是使用C/C++这样的静态类型和手动回收内存的语言编写程序,然后使用编译器将编写的程序编译为asm.js。

Emscripten是目前流行的asm.js编译器。

Emscripten 的底层使用的是 LLVM 编译器。通过一系列的处理将C/C++编译成asm.js。

C/C++ ⇒ LLVM ==> LLVM IR ⇒ Emscripten ⇒ asm.js

Emscripten

asm.js和WebAssembly的异同

WebAssembly和asm.js具有相同的作用,就是C/C++代码转成 javascript引擎可以运行的代码。

但asm.js生成的是javascript代码,而WebAssembly生成的是WASM格式的二进制字节码。

所以理论上WebAssembly速度更快。

而asm.js的兼容性比WebAssembly好,所有浏览器都支持asm.js的运行(不谈效率)。

发展到现在,Emscripten编译器也已经支持生成asm.js和WASM两种格式的代码。

asm.js和WebAssembly的作用?

一是可以提高应用在浏览器的运行速度。比如游戏、计算量巨大的算法等。

二是有利于移植一些C/C++代码写的程序。比如其他语言的解释器等。

这样就为浏览器提供了更大的可能。可以预见,在不久的将来,人们只要打开浏览器就可以搞定一切工作了。

猜你喜欢

转载自blog.csdn.net/licheng680/article/details/85458734