Rust 对于 WebAssembly的支持是最为完善的。毕竟 Mozilla 当初开发rust 是很大一部分为了编写Servo(浏览器渲染引擎)。
此外我们介绍的wasmer和wasmtime两个wasm运行时,也是使用rust编写的。
对于使用rust编写wasm模块以及rust程序代码中使用wasm模块,这里不再详细讲述。之前的文章中,很多举例都是基于rust实现。
今天我们主要看看rust对于wasi的支持。如果是纯内存运算,并不能体现出wasi的伟大意义--可以安全,高性能地与主机os交互(file, socket等)。
今天我们一个简单的demo,演示一下。
1:创建rust项目
$ cargo new --bin wasi_hello_world
2: 编写main.rs
use std::io::prelude::*;
use std::fs;
fn main() {
println!("Hello world!");
let mut file = fs::File::create("/helloworld/helloworld.txt").unwrap();
write!(file, "Hello world!n").unwrap();
}
代码非常简单,会在/helloworld
路径下创建一个helloworld.txt
文件, 然后写入Hello world!
内容。
3:编译代码为wasm
cargo build --release --target wasm32-wasi
Compiling wasi_hello_world v0.1.0 (/Users/iyacontrol/rust/wasi_hello_world)
Finished release [optimized] target(s) in 1.63s
当然如果你之前没有安装过wasm32-wasi target,需要首先执行:
rustup target add wasm32-wasi
编译成功,在target/wasm32-wasi/release/
目录下 生成 wasi_hello_world.wasm
。
4:运行
要授予使用Wasmtime CLI写入目录的功能,我们需要使用--mapdir标志。 --mapdir允许我们将客户机的虚拟文件系统上的/helloworld目录映射到主机文件系统上的当前目录。
wasmtime --mapdir /helloworld::. target/wasm32-wasi/release/wasi_hello_world.wasm
Hello world!
同时,在当前目录生成了一个helloworld.txt
文件。
总结
不过 目前来看,整个wasi都不够完整成熟。包括对wasi支持最好的rust。
WASI仍在快速成长,并且有许多项目正在利用WASI来做有趣的事情!
未来边缘计算以及serverless,都少不了wasi的身影。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。