WASI是一个新的API体系, 由Wasmtime项目设计, 目的是为WASM设计一套引擎无关(engine-indepent), 面向非Web系统(non-Web system-oriented)的API标准. 目前, WASI核心API(WASI Core)在做覆盖文件, 网络等等模块的API, 但这些实现都是刚刚开始实现, 离实用还是有很长路要走.
目前支持wasi的运行时有以下几种:
WAVM是WebAssembly虚拟机,设计用于非Web应用程序。
WAVM使用LLVM将WebAssembly代码编译为具有接近本机性能的机器代码。在某些情况下,它甚至可以胜过本机性能,这要归功于它能够生成针对运行代码的确切CPU进行了调整的机器代码。
WAVM还利用虚拟内存和信号处理程序来执行WebAssembly的边界检查的内存访问,其成本与本机的未经检查的内存访问相同。
WAVM阻止WebAssembly代码访问WebAssembly虚拟机*之外的状态,或调用未与WebAssembly模块明确链接的本机代码。
对于centos可以使用官方预编译rpm包进行安装
yum install -y https://github.com/WAVM/WAVM/releases/download/nightly%2F2020-05-28/wavm-0.0.0-prerelease-linux.rpm
clone官方库
git clone https://github.com/WAVM/WAVM
cd Examples
wavm run helloworld.wast
wavm run zlib.wasm
wavm run trap.wast
wavm run echo.wast "Hello, world!"
wavm run helloworld.wast | wavm run tee.wast
wavm run --enable simd blake2b.wast
disassemble通过disassemble可以将wasm拆解为wast可读格式
wavm disassemble zlib.wasm zlib.wast
WAVMOBJECTCACHE_DIR 环境变量为wavm设置运行时缓存
export WAVM_OBJECT_CACHE_DIR=/path/to/existing/directory
wavm run huge.wasm # Slow
wavm run huge.wasm # Fast
通过执行
rustup target list
创建项目
cargo new --lib testwasi
Cargo.toml中lib的配置如下
[lib]
name = "testwasi"
path = "src/lib.rs"
crate-type =["cdylib"]
// # 直接把把名字作为符号写到目标文件中
#[no_mangle]
pub extern fn test(a: i32, b: i32) {
let z = a + b;
println!("The value of x is: {}", z);
}
.cargo/config添加以下内容,制定编译结果为wasi格式
[build]
target = "wasm32-wasi"
执行 cargo build
或执行 cargo build--target=wasm32-wasi
# wavm run --function=test --abi=wasi target/wasm32-wasi/debug/testwasi.wasm 1 2
The value of x is: 3
wasm虽然一开始是为了解决js的性能问题,但是由于其高性能,跨平台,众多运行时支持,已经不局限于web端,走向服务端,现在已经应用于servicemesh、serverless等方向,个人认为其可能成为下一代的container,相信其未来必定有更广泛的应用场景。