Unengineered Weblog

PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND

Rust で書かれたプログラムを Plan 9 上で動かす (Wasm で)

Rust は人気なプログラミング言語である。 しかしながら今は Rust は Plan 9 での実行をサポートしていない。

doc.rust-lang.org

したがって Plan 9 で Rust で書かれたプログラムを実行するには、コンパイラを移植するといった大変な作業が必要かと思っていた。しかしながら Wasm を使うことで、特に苦労なく実行することができたので紹介する。

この試みは id:lufiabbPlan 9 でも Rust を動かせるようにしようと言っていたがきっかけである。

環境

Ubuntu 23.10 がインストールされた AMD64 マシン上で作業している。Plan 9QEMU上で実行している。 Plan 9 の OS イメージと Plan 9 向けの Go (Go 1.21 binaries) は 9legacy.org からダウンロードしている。

9legacy.org

準備

Rust コードを Wasm へコンパイル

wasm ファイルを生成するのはホストの Linux 上で行った。僕はあまり Rust と Wasm について詳しくないので、下の説明をそのまま実行した。

wasmbyexample.dev

ここでつくったプログラムは次のことをする。

  • 標準出力に 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 が空っぽなのがすごい。

wazero.io

普段 LinuxMac で 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 で動くのではないか。