Rust

在 WebAssembly 生态中,Rust 是一等公民编程语言之一。对开发者来说,所有编译为 WebAssembly 的 WasmEdge 拓展都有相对应的 Rust 的开发接口。 在这一章节中,我们将会向你展示如何将你的 Rust 应用程序编译为 WASM 字节码,并且在 WasmEdge Runtime 中运行它。

前置条件

开始前,你需要安装 Rust 以及 WasmEdge。 同时你也应该将 wasm32-wasi 添加到 Rust 工具链中。

rustup target add wasm32-wasi

Hello world

Hello world 示例是一个独立的 Rust 应用程序,可以被 WasmEdge 命令行接口 执行。它的源代码在这里

如下是 main.rs 的完整代码,它将输出在运行的时候接收到的命令行参数。

  1. use std::env;
  2. fn main() {
  3. println!("hello");
  4. for argument in env::args().skip(1) {
  5. println!("{}", argument);
  6. }
  7. }

Hello world: 构建 WASM 字节码

cargo build --target wasm32-wasi

Hello world: 在命令行中运行应用程序

我们将使用 wasmedge 命令来运行这个程序。

$ wasmedge target/wasm32-wasi/debug/hello.wasm second state hello second state

一个简单的函数

add 示例是一个 Rust 库函数,可以被 WasmEdge 命令行接口 接口在 --reactor 模式下执行。

如下是 lib.rs 的完整代码,它将输出在运行的时候接收到的命令行参数。 它提供了一个简单的 add() 函数。

  1. #![allow(unused)]
  2. fn main() {
  3. #[no_mangle]
  4. pub fn add(a: i32, b: i32) -> i32 {
  5. return a + b;
  6. }
  7. }

一个简单的函数: 构建 WASM 字节码

cargo build --target wasm32-wasi

一个简单的函数: 在命令行中运行应用程序

我们将使用 WasmEdge 的 --reactor 模式来运行这个程序。我们将函数的名字以及它的输入参数作为命令行参数。

$ wasmedge --reactor target/wasm32-wasi/debug/add.wasm add 2 2 4

传递复杂的参数

当然,在大多数情况下,你不会使用命令行参数来调用函数。 相反地,你可能会需要使用一个 WasmEdge 提供的语言 SDK 来调用函数、传递参数以及接收返回值。 以下是一些关于复杂参数和返回值的 SDK 示例。

提升性能

如果要让这些应用程序达到原生 Rust 的性能,你可以使用 wasmedgec 命令对 wasm 程序进行提前编译(AOT),然后使用 wasmedge 命令运行它。

$ wasmedgec hello.wasm hello.wasm $ wasmedge hello.wasm second state hello second state

对于 --reactor 模式,

$ wasmedgec add.wasm add.wasm $ wasmedge --reactor add.wasm add 2 2 4

更多资料

  • 通过 WASI 访问系统服务 展示了 WebAssembly 程序如何访问底层系统服务,比如文件系统和环境变量。
  • Tensorflow 展示了如何使用 WasmEdge Tensorflow Rust SDK 来为 WebAssembly 创建基于 Tensorflow 的 AI 推理应用程序。
  • 简单的网络通信 展示了如何使用 WasmEdge 网络通信 Rust SDK 来创建简单的 HTTP 客户端以及服务端应用程序。
  • 非阻塞的网络通信 展示了如何使用 WasmEdge 网络通信 Rust SDK 来创建一个高性能、非阻塞、并发连接的网络应用程序。
  • 服务器端渲染 展示了如何使用 Rust 构建一个可交互的 Web 程序,并在服务器上使用 WasmEdge 来渲染 HTML DOM UI。用来渲染 HTML DOM 的 Rust 源代码会被编译为 WebAssembly,在浏览器中或是服务器上运行。
  • 命令接口 展示了如何使用 WasmEdge 命令行接口 Rust SDK 来为 WebAssembly 创建原生的命令行应用程序。