引言
web assembly是一种可以使用非js编程语言编写代码并且能在浏览器上运行的技术方案,也是一种新的字节码格式,其目的是为了充分发挥硬件能力以达到原生的执行效率。
web assembly 中文地址:点这里
关于 WebAssembly 的背景
早在2019年12月5日,Web Assembly正式成为W3C的标准,加入到了HTML,CSS,Javascript的行列中,成为了前端的第四剑客。
首先来看看JS代码等执行过程:
- 拿到了 JS 源代码,交给 Parser,生成 AST
- ByteCode Compiler 将 AST 编译为字节码(ByteCode)
- ByteCode 进入翻译器(JIT),翻译器将字节码一行一行翻译为机器码(Machine Code),然后执行
有了web assembly之后:
关于 WebAssembly 的优势
文件加载:Web assembly文件体积更小,所以下载速度更快
解析:解析Web assembly比解析js要快
编译和优化:编译和优化所需的时间较少,因为在将文件推送到服务器之前已经进行了更多优化,js需要为动态类型多次编译代码
重新优化:Web assembly代码不需要重新优化,因为编译器有足够的信心可以在第一次运行时获得正确的代码。
执行:执行速度更快,web assembly指令更接近机器码
垃圾回收:目前的web assembly不直接支持垃圾回收,垃圾回收都是手动控制,所以比自动垃圾回收的效率更高
安全:可以放hash和签名等
关于 WebAssembly 的应用
web assembly的应用场景很广泛,可用于视频和音频编解码器,图形和3D、多媒体和游戏,密码计算或便捷式语言实现等领域。比如在大型的js/html应用中复用一部分计算复杂的逻辑,就像一个助手库一样,可以提高一些性能。
下载对应的工具
这边用第一个工具作为示例
按照官网示例 clone 代码
git clone https://github.com/emscripten-core/emsdk.git
进入指定文件夹
cd emsdk
执行脚本文件
source ./emsdk_env.sh
接下来需要编写一个 c++ 文件
int add(int x, int y)
{
return x + y;
}
int square(int x)
{
return x * x;
}
int fib(int x)
{
if (x <= 0)
return 0;
if (x <= 2)
return 1;
return fib(x - 1) + fib(x - 2);
}
接着在 emscripten 目录下执行命令
emcc ../../demo/wasmDemo/helloworld.cpp -Os -s WASM=1 -s SIDE_MODULE=1 -o helloworld.wasm
这样就会生成一个 helloworld.wasm 文件
也可以使用一个在线的工具去把c++代码编译成wasm格式
一个在线的WasmExplorer工具: 点这里
该工具同样可以编译成wasm格式文件,并且可以下载到本地
最后创建一个html文件
在script中加入下列代码:
fetch('helloworld.wasm')
.then((response) => response.arrayBuffer())
.then((bytes) => WebAssembly.compile(bytes))
.then((results) => {
const instance = new WebAssembly.Instance(results)
const a = instance.exports
console.log(a)
console.time('test wasm')
a._Z3fibi(40)
console.timeEnd('test wasm')
console.time('test js')
fib(40)
console.timeEnd('test js')
})
其中hellowrold.wasm存在于当前路径下
打开html文件
当看到在控制台打印log信息:
说明基于web assembly的happy path已经完成了
从 log 信息中可以看到对于斐波那契这个函数 wasm 执行的速度是要比 js 执行的速度快将近1倍之多
关于 WebAssembly 的未来
在web assembly的高性能、轻量和跨平台甚至可以脱离浏览器这样强大的特性下,在未来 web assembly的应用场景会越来越广阔,也就需要广大开发者们去维护开发这个前端第四剑客,同时 WebAssembly 也是由 W3C 主要负责开发,各大厂商,包括 Microsoft、Google、Mozilla 等赞助和共同维护的一个项目,相信 WebAssembly 会有一个非常值得期待的未来