WAH: ヘッダーファイル1つで作られたWebAssemblyインタープリター
(github.com/lifthrasiir)久しぶりにCライブラリを作ってみました。文字どおり、Cヘッダーファイル1つにすべてが入っているWebAssemblyインタープリターです。もちろん、ただインタープリターだけがぽつんとあるわけではなく、
- WebAssembly 3.0仕様を100%サポートしています。GCなども含め、ひととおり入っています。
- WebAssemblyにはdeterministic profileという、どの環境でも同じ結果が出るようにするオプションがありますが、このオプションを実装しています。そのため、再現可能な結果を得るのに役立ちます。
- x86-64とAArch64 NEON向けのアーキテクチャ別最適化が適用されています。
- 信頼できないコードをサンドボックス化するために必要な機能が入っています。Fuel meteringにより、命令実行で燃料(
fuel)を消費しながら実行し、燃料が尽きたら停止したり、実行中に一定時間後の割り込みをかけたり、メモリ使用量を制御したりする機能をサポートしています。 - このように実行途中で停止しても、再び実行を再開できるようなAPIになっています。
- WebAssemblyモジュールをコードだけで生成したり、1つのモジュールに複数のモジュールをリンクしたりできます。
- コンパイル時にも機能を制限でき(コンパイルされるコードが減ります)、実行時にも機能を制限できます。
- 最初からABIを固定することを目標に設計されています。データ構造をCスタックに割り当て可能ですが、あらかじめレイアウトを固定してあるため、バージョンが上がってもABIが壊れません。
- さらに、やりすぎと思えるほどテストが大量にあり、ファズテストもかなり実施しました。(実はfuzzerは今も動き続けています……)
もともとは別のプロジェクトの一部になる予定だったので、ここまで本気で作り込むつもりはなかったのですが、WebAssembly参照実装のテスト(spectestと呼ばれます)を回すには結局すべて実装しなければならず……気がつけば100%実装していました。どうしてこうなったのでしょう。
最近の流れに合わせて、コードは初期にはGemini CLI、中盤以降はClaude CodeとときどきCodexで書き、計画には主にCodexを活用しました。個人的には、コーディングエージェントがハードコアなシステムプログラミングでも、うまくステアリングすればかなり良い仕事ができることを証明するプロジェクトでもありました。バイブコーディングをするとそれっぽいものは出てきても細部はめちゃくちゃ、という評価への反例になれたらという気持ちも少しありました。
2件のコメント
テストすべき仕様が明確なら、コーディングエージェントでワークフローを組んで収束させるアプローチはかなりうまく機能する気がします。vinext や pretext のような事例も思い浮かびます。
別の話ですが、もしよければジャーナルの CSS 配信を一度確認していただけないでしょうか……? かなり時間が経っていても周囲に紹介したい良い記事が多いのですが、デスクトップでアクセスすると CSS が読み込まれないんです(泣)
CSSを配信していたサーバーがダウンしてしまいました……申し訳ありませんが、しばらくの間は Wayback Machine をご利用ください……