[Rust][WASI] Rust コードから WebAssembly を生成して実行する

  • 2022年9月21日
  • 2022年9月21日
  • Rust
  • 140View
  • 0件

はじめに

2022/09/21、Wasmtime のバージョンが 1.0.0 になりました。

Wasmtime とは WASI のリファレンス実装です。
WASI というのは、WebAssembly System Interface の略であり、WebAssembly をブラウザのみならず汎用機場で実行するための API 標準仕様になります。

つまり Java バイトコードのように、一度生成した WebAssembly のバイナリを、あらゆる OS 上で動作させることができるのが Wasmtime になります。

本記事では、Rust コードから生成した WebAssembly を Wasmtime で実行します。

動作環境

  • Windows 11
  • WSL Ubuntu 20.04
  • Rust 1.63.0
  • Wasmtime 1.0.0

Rust コードから WebAssembly 生成

Rust インストール

まず WSL に Rust コンパイラをインストールします。
rustup が必要になりますので、Ubuntu 公式リポジトリからのインストールでは不十分です。
Rust 公式手順でのインストールが必要です。

Rust 公式ページのコマンドを実行して、インストールスクリプトのダウンロードおよび実行をします。

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

途中で以下の選択肢を問われますが、そのまま Enter するとデフォルトでのインストールが行われます。

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>

インストール完了後は source コマンドで PATH 環境変数を更新します。

$ source $HOME/.cargo/env

WebAssembly の生成

まずコンパイルするためのソースコードを用意します。
Wasmtime の公式サンプルと同じで、Hello world を出力するだけのコードです。

fn main() {
    println!("Hello, world!")
}

次に、Rust のターゲットに wasm32-wasi を追加します。
これによって、WASI 用の WebAssembly をコンパイラから出力させることができるようになります。

$ rustup target add wasm32-wasi

コンパイル時に、先ほど追加したターゲットを指定することで WebAssembly が生成されます。

$ rustc main.rs --target wasm32-wasi
$ ls main.wasm
main.wasm

WebAssembly の実行

Wasmtime のインストール

WebAssembly を実行するために Wasmtime をインストールします。
公式の手順に従います。

$ curl https://wasmtime.dev/install.sh -sSf | bash

インストール後、シェルを再起動して環境変数を更新しておきます。

$ exec $SHELL -l

WebAssembly の実行

ここまでできたら wasmtime コマンドで WebAssembly を実行することができます。

$ wasmtime main.wasm
Hello, world!

Hello, world! が出力されました。