開発

QRコードに収まるWebAssemblyインタープリタ、2944バイトの実装

WebAssemblyのインタープリタがQRコード1枚分の2944バイトに収まるという驚異的なサイズコーディングの成果が公開された。libcを回避し、リンカースクリプトとインラインアセンブリを駆使した実装の全貌を紹介する。

5分で読める SINGULISM 編集チームが確認・編集

QRコードに収まるWebAssemblyインタープリタ、2944バイトの実装
Photo by Google DeepMind on Unsplash

WebAssembly(Wasm)のインタープリタをQRコード1枚に収めることに成功したという、ある開発者の挑戦が注目を集めている。そのサイズはわずか2944バイト。これは主要なWasm実行環境であるWasmtimeの0.006%に満たず、C言語で書かれた最小限の「Hello, world!」プログラムよりも小さい。

QRコードの限界に挑む

QRコードが格納できるデータの上限は2953バイト。開発者はこのわずかな余裕の中で、Wasmのコードを実行できるインタープリタを作り上げた。

「プロジェクトがこれほど単純なら、アセンブリ言語で一気に書くだろう。しかし、それは開発速度に壊滅的な影響を与える」と開発者は説明する。サイズコーディングの世界では、実験と大規模な変更を繰り返すスピードが不可欠だ。

メタデータとの戦い

gccに「-Os」などの最適化フラグを投げても、C言語の最小プログラムですら大きすぎる。問題は言語そのものではなく、シンボル情報やELFセクション、動的リンクといった「メタデータ」にある。

開発者はリンカースクリプトを駆使し、コード、グローバル変数、定数をすべて一つのセクションにまとめた。不要なアラインメント(データの設定調整)を排除することで、バイナリを極限まで詰め込んだ。これによりコードは書き込み可能に、データは実行可能になったが、開発者は「この実験においてセキュリティは目標ではない」と明言している。

さらに「strip —strip-section-headers」コマンドでシンボル情報とセクション情報を削除し、カーネルがプログラムを実行するために最低限必要なセグメント情報だけを残した。

libcを捨て、直接システムコールを叩く

最も効果的なカットはlibcの排除だった。libcは主にプログラムの初期化とシステムコールの呼び出しを担うが、Linuxには安定したユーザーレベルABIが存在する。

開発者はインラインアセンブリでわずか23バイトのスタブを作成し、main関数を直接呼び出すようにした。readやwriteといったシステムコールも、アセンブリの「syscall」命令を直接使えば数バイトで済む。

「x86にはレガシーCISC命令という隠し技がある」と開発者は付け加える。古い命令形式が、この極限のサイズ削減を支える一因となった。

実用性と限界

このインタープリタは「Lime1」と呼ばれるWasmの機能サブセットと、WASI(WebAssembly System Interface)の一部を実装している。実際にRustで書かれた推測ゲームや、公式リリース版のQuickJS(JavaScriptエンジン)を動作させることもできている。

もちろん、限界もある。すべてのWasm機能を網羅しているわけではなく、実行速度も遅く、セキュリティも保証されていない。しかし、これだけのサイズでWasmコードを解釈実行できるという事実は、エンジニアリングとして極めて興味深い。

サイズコーディングの面白さ

このプロジェクトは、バイナリサイズを極限まで削減する「サイズコーディング」と呼ばれる分野の面白さを体現している。每一バイトを削り落とす作業は、コンピュータの低レベルな仕組みへの深い理解を要求する。

開発者は「楽しかったし、この技術を共有したいと思った」と振り返る。QRコードという身近な技術と、WebAssemblyというモダンな実行環境が交わるこの実験は、プログラミングの持つ可能性を改めて考えさせるものだ。


FAQ

Q: WebAssemblyのインタープリタをQRコードに収めるメリットは何ですか? A: 物理的な配布や共有が極めて簡単になることです。QRコードをスキャンするだけでWasm実行環境を入手でき、インフラが整っていない環境や、セキュリティ上の理由からダウンロードが制限されている状況でも利用可能になります。また、サイズコーディング技術の研究や教育目的にも価値があります。

Q: このインタープリタは実用的なシステムに使えますか? A: 現時点では実用的とは言えません。開発者自身が「遅く、セキュリティも保証されていない」と明記しています。しかし、WASIの一部を実装しているため、限定的なケースでは動作します。このプロジェクトの価値は、2944バイトという極限のサイズでWasmが実行可能であることを証明した点にあります。

Q: サイズコーディングとは何ですか? A: プログラムのバイナリサイズを極限まで小さくするプログラミング技術や競技です。ゲームジャムやCTF(Capture The Flag)の一部、デモシーンなどで盛んです。今回ののプロジェクトでは、C言語からリンカースクリプト、インラインアセンブリまで、あらゆる手段を駆使してサイズ削減が行われました。

出典: Lobsters

コメント

← トップへ戻る