Rust は人気なプログラミング言語である。 しかしながら今は Rust は Plan 9 での実行をサポートしていない。
したがって Plan 9 で Rust で書かれたプログラムを実行するには、コンパイラを移植するといった大変な作業が必要かと思っていた。しかしながら Wasm を使うことで、特に苦労なく実行することができたので紹介する。
この試みは id:lufiabb が Plan 9 でも Rust を動かせるようにしようと言っていたがきっかけである。
環境
Ubuntu 23.10 がインストールされた AMD64 マシン上で作業している。Plan 9 はQEMU上で実行している。 Plan 9 の OS イメージと Plan 9 向けの Go (Go 1.21 binaries) は 9legacy.org からダウンロードしている。
準備
Rust コードを Wasm へコンパイル
wasm ファイルを生成するのはホストの Linux 上で行った。僕はあまり Rust と Wasm について詳しくないので、下の説明をそのまま実行した。
ここでつくったプログラムは次のことをする。
- 標準出力に
Hello world!
と書き出す。 /helloworld/helloworld.txt
を生成して、そのファイルにHello world!
と書き出す。
生成された wasi_hello_world.wasm を QEMU 上の Plan 9 へ送る。
wazero
Plan 9 に wazero をインストールする。
wazero は Pure Go で記述された Wasm runtime である。 Pure Go のおかげで何も修正せずに Plan 9 で動いた。 go.sum が空っぽなのがすごい。
普段 Linux や Mac で Go のアプリケーションをインストールするのと同じように、 Plan 9 上で次のコマンドを実行する。
go install github.com/tetratelabs/wazero/cmd/wazero@latest
実行
さて実行しよう。 以下は Plan 9 のターミナル上で行ったもの。
% mkdir helloworld % wazero run -mount `{pwd}^:/ wasi_hello_world.wasm Hello world! % cat helloworld/helloworld.txt Hello world!
このようにとくにコードにパッチを当てずにそのまま実行することができた。
考察
Rust コードを Wasm へのコンパイルを Linux 上でやっているのが、微妙な感じである。できれば Plan 9 上でコンパイルしたい。
Plan 9 はネットワークなどもファイルシステムで表現されているので、すでにいまの WASI (preview 1) でネットワークも扱えるのではないか。
このWasm を使った方法によって Plan 9 をサポートしない他の言語で書かれたアプリケーションも Plan 9 で動くのではないか。