WebAssemblyゼミの講師を@saza_kuとさせてもらいました
新設のゼミでして、Wasm楽しいよという独り言と、受講生の方々が優秀すぎましたという備忘録です
WebAssemblyゼミとは?
WebAssembly(Wasm)は仮想命令セットです。RustやGoをはじめ様々な言語で記述されたアプリケーションをWasmターゲットにコンパイルできます。
Wasmは仮想命令セットですので、x86などのCPUで実行できるようWasmの命令を解釈するソフトウェアが必要になります。これをWasmランタイムと呼んでいまして、本ゼミはWasmランタイムを実装するゼミです。
Wasmの仕様を読み解きながら、基本的なWasmランタイムを実装し、ちょっとしたアプリケーションを動かす、というのがゼミの当初のゴールでした(このゴールはすぐに良い意味で破られます)
応募課題
応募課題ではWasmバイナリのparseやWasmランタイムの最初の一歩を作ってもらいました。応募段階でフィボナッチが動いていたりメモリ操作ができていたりとかなりの完成度の方がちらほらいて、選考には苦戦した記憶があります。応募していただいた方に為になるような課題になっていたら良いのですがこれは難しいですね...
事前準備
6月-当日にかけては事前準備期間です。負担にならない程度に、当日は実質3日間しかないので開発を進めておこうというという時間です。
本ゼミではWasmの基本的な仕様に沿ったランタイムの実装を進めてもらいました。週1でsyncをして様子を聞いたり、講師の方からWASIやWasm I/Oの話をしたりとゆるゆると進めました。
ゆるゆる進めていたつもりでしたが、気づいたらDoomが動いていました。
自作WebAssemblyランタイムでDoomが動いた!
— ふぁ (@faa0311) 2024年8月8日
Python + Numpy なのでフレームレートはカス pic.twitter.com/OUyqEF7kbo
Doomを動かすには、Wasmの基本的な命令に加え、WASI(WebAssembly System Interface)と呼ばれる、Wasmがシステムのリソース(ファイル、ネットワークなど)にアクセスするときに発行するAPIの処理を実装する必要があります。
実装スピードが早すぎることを認識します
当日
キャンプ期間は、主に各々のWasmランタイムに好きな拡張を入れていく時間となりました。スライドの掲載許可ももらったので簡単に紹介します。
1人目:Wasmライブマイグレーション + InfiniBandを使って送る
実行途中のWasmバイナリを、別マシンにその実行途中のステータスを送ることで処理を移譲する仕組みを実装してくれました。InfiniBandを使いたいとのことで、彼のWasmランタイムのステータスはなんと400Gの帯域を通って転送されています。Wasmバイナリを転送することで処理を委譲する、というこの仕組みを使ったユースケースもたくさん考えていました
2人目:Wasm GC対応 + セルフホスト
github.comWasm GCを自作Wasmランタイムに実装してくれました。Wasm GCは仕様が大きく、自分も追えてなかった仕様なのですが、仕様読み解き力の高さを発揮し、3日間でちゃんと動くサブセットを実装していました。
セルフホストしたWasmランタイム上で、Wasmアプリケーションが動いている様子
3人目:WASIモリモリ実装
WASIを脅威のスピード感でモリモリ実装してくれました。
HTTP serverが動いている様子
Wasm化されたファイル配信HTTP serverを自作Wasmランタイムで動かし、Wasm化されたDoomを配信し、V8がDoomを実行している様子(ややこしい)
さいごに
Wasmはいろんなことができて楽しいなあとは以前から思っていましたが、今回は新しい楽しみ方を受講生の方から教えてもらった気がします。
Wasmは応用先が広い形態であると同時に、仕組みを理解するにあたって仕様があること、コアの仕様がそこまで大きくないこと、テストがあること、あたりの環境が良くて、今回のような2, 3ヶ月で入門して好きに応用するのに良いのかもしれないな...
他のゼミはじめキャンプ全体のことも書きたいことあるけれど、一旦このあたりで。
パワフルな受講生に元気をもらった一週間でした