使用 wavm 运行 wasi wasm 程序
wasi介绍
WASI是一个新的API体系, 由Wasmtime项目设计, 目的是为WASM设计一套引擎无关(engine-indepent), 面向非Web系统(non-Web system-oriented)的API标准. 目前, WASI核心API(WASI Core)在做覆盖文件, 网络等等模块的API, 但这些实现都是刚刚开始实现, 离实用还是有很长路要走.
目前支持wasi的运行时有以下几种:
wasmer
wasmtime
wavm
wavm介绍
WAVM是WebAssembly虚拟机,设计用于非Web应用程序。
特点
快速
WAVM使用LLVM将WebAssembly代码编译为具有接近本机性能的机器代码。在某些情况下,它甚至可以胜过本机性能,这要归功于它能够生成针对运行代码的确切CPU进行了调整的机器代码。
WAVM还利用虚拟内存和信号处理程序来执行WebAssembly的边界检查的内存访问,其成本与本机的未经检查的内存访问相同。
安全
WAVM阻止WebAssembly代码访问WebAssembly虚拟机*之外的状态,或调用未与WebAssembly模块明确链接的本机代码。
安装
对于centos可以使用官方预编译rpm包进行安装
用法示例
clone官方库
运行官方示例程序
拆解wasm为wast
disassemble通过disassemble可以将wasm拆解为wast可读格式
设置cache
WAVMOBJECTCACHE_DIR 环境变量为wavm设置运行时缓存
使用rust 实现wasi规范的wasm程序
查看rust支持的目标
通过执行
asmjs-unknown-emscripten 通过emscripten 工具链编译为asmjs,asmjs也是为了解决js性能问题
wasm32-unknown-unknown。此目标直接使用 llvm 后端编译成 wasm。 它适合纯 rust 代码编译,譬如你没有 C 依赖的时候。 跟 emscripten 目标比起来,它默认就生成更加洗练的代码, 而且也便于设置搭建。此处查看如何设置搭建.
wasm32-unknown-emscripten。此目标利用 emscripten 工具链编译成 wasm。 当你具有 C 依赖的时候就得使用它了,包括 libc
wasm32-wasi wasi规范的目标
创建rust lib项目
创建项目
项目配置
Cargo.toml中lib的配置如下
代码实现
编译
.cargo/config添加以下内容,制定编译结果为wasi格式
执行cargo build
或执行cargo build --target=wasm32-wasi
使用wavm运行rust编译的wasm程序
总结
wasm虽然一开始是为了解决js的性能问题,但是由于其高性能,跨平台,众多运行时支持,已经不局限于web端,走向服务端,现在已经应用于servicemesh、serverless等方向,个人认为其可能成为下一代的container,相信其未来必定有更广泛的应用场景。
欢迎关注微信公众号:有点技术
版权声明: 本文为 InfoQ 作者【Foliage】的原创文章。
原文链接:【http://xie.infoq.cn/article/c4753b42dde09a6940657e963】。文章转载请联系作者。
评论