高性能WebAssembly Runtime开源项目Wasmer 1.0登场

开源WebAssembly Runtime项目Wasmer发布1.0版本,这是一个讲究性能,可让WebAssembly超轻量容器在任何客户端上执行的Runtime,包括桌面、云计算到物联网设备。Wasmer能以接近原生的速度,在沙盒环境执行WebAssembly,而可插拔的特性,能支持像是LLVM和Cranelift等不同的编译框架,Wasmer也通过WebAssembly测试组件测试,支持WASI与Emscripten。

官方表示,不只在浏览器中,WebAssembly(Wasm)会是未来软件执行和容器化的关键组件。通过Wasm进行软件容器化,可以让二进制文件在不需要修改的前提下,于Linux、macOS、Windows以及网页浏览器等环境执行,并保护主机不受恶意程序代码、错误和bug影响。Wasmer容器的特点之一,便是在Docker容器因过于笨重无法运行之处,执行容器化工作负载。

在Wasmer 1.0中,官方特别强化了编译性能,因为Wasmer使用的后端编译器,皆可以平行编译函数,所以Wasmer 1.0得以大幅提高编译速度,比起旧版本Wasmer 0.17 .1,Wasmer 1.0的编译速度是旧版的9倍。Wasmer 0.17.1与Wasmer 1.0在不同编译框架,编译clang.wasm所花费的时间,可以明显看出Wasmer的性能提升,以及高效的编译速度表现。

以编译框架Singlepass来说,从原本Wasmer 0.17.1编译需花费18秒,在Wasmer 1.0只剩2秒,而LLVM也从1,140秒加速到只需117秒,都是9倍速的编译速度提升,还有Cranelift编译时间也从27秒降至9秒,速度是之前的3倍。官方还提到,使用Wasmer CLI时,编译仅会进行一次,借由缓存结果以优化未来执行。

Wasmer的另一个特点,便是提供可插拔的基础设施,能够同时支持多种编译器,1.0版本现在支持Singlepass、Cranelift以及LLVM,根据用户需求,用于区块链可以选择Singlepass,而开发时可以使用Cranelift,需要拥有最佳性能的生产阶段,可以使用LLVM。

而除了编译器,Wasmer还支持了可插拔引擎,Wasm引擎是一个抽象层,可以决定编译器管理汇编程序代码的方法,执行像是加载以及串行化等工作。Wasmer 1.0现在支持JIT引擎,能够将产生的程序代码,直接推送到内存中,且还支持原生引擎,能够产生可作为共享对象加载的原生程序代码。

在边缘运算上,Wasmer 1.0也改进了过去支持物联网应用的方式,之前用户在部署Wasm应用程序时,需要连同Wasmer以及编译器,都一起放到物联网设备上,而从Wasmer 1.0开始提供无头(Headless)版本,通过支持AOT(Ahead Of Time)编译,用户可以仅执行大小只有数百KB的无头Wasmer,并在任何设备上执行预编译的Wasm二进制文件。

官方要让没有高端WebAssembly知识的开发者,也能轻松的使用Wasmer,因此设计易于使用的API,在Wasmer 1.0,官方以标准Wasm-C-API为基础,进一步改进API,使其结构更相似通用API,并且具有弹性。官方提到,随着WebAssembly生态系统成熟,社群逐渐统一与WebAssembly交互的API,由于Wasmer在早期版本,先构建类似功能的Wasmer-C-API,但随着通用API的出现,他们建议用户切换使用标准Wasm-C-API。

另外,Wasmer也跟上支持Apple Silicon的浪潮,Wasmer 1.0开始支持由Apple以ARM为基础,自行设计的芯片Apple Silicon,而Wasmer成为第一个非直译服务器端WebAssembly虚拟机,支持在Apple Silicon上执行Wasm。