FigmaやPhotoshopが、なぜブラウザの中でネイティブアプリ並みの速度で動くのか。答えの多くはWebAssembly(WASM)にあります。ブラウザの高速化技術としてひっそり標準化されたこの仕組みは、いまや設計ツールから暗号処理、サーバーサイドのプラグインシステムまで、静かに広い範囲を支えています。
WASMとは何か
WebAssemblyは、スタックベースの仮想マシン(計算の途中結果を積み上げて処理する方式の仮想マシン)向けに設計されたバイナリ命令フォーマットです。C・C++・Rust・Go(TinyGo)・AssemblyScriptなど様々な言語のコンパイル先として使え、コンパイル済みのバイナリをほぼネイティブに近い速度で実行できます。2017年に主要ブラウザが足並みを揃えて対応し、その後W3Cの標準として仕様が固まりました。JavaScriptを置き換える技術ではなく、JavaScriptから呼び出して使う「もう一つの実行エンジン」という位置づけです。
サンドボックスという設計
WASMの核心は、サンドボックス(外に手が届かない隔離された実行場所)という設計にあります。WASMモジュールは自分専用の線形メモリ(linear memory)領域だけにアクセスでき、ホスト環境の任意のメモリ番地やファイルシステムに直接触れることはできません。ホスト側(JavaScriptなど)が明示的に許可した関数だけを呼び出せる仕組みになっており、この制約のおかげで、出所の分からないコードであっても安全に実行できます。ネイティブアプリなら致命的なメモリ破壊バグも、WASMのサンドボックスの外には影響しません。
実際に採用されている場所
WASMの採用事例は、ブラウザの外にも広がっています。
- Figma: デザインツールの描画エンジンをC++からWASMにコンパイルして提供しており、大規模なファイルでもブラウザ上でネイティブアプリに近い操作感を実現している
- Adobe Photoshop(Web版): 数十年分のC++コードベースをWASMへ移植し、ブラウザだけでレイヤー編集やフィルタ処理を動かしている
- 1Password: ブラウザ拡張の暗号処理コアをRustで書き、WASMとしてブラウザ内で動かしている
- Envoy Proxy: プロキシの拡張機能(WASMフィルタ)としてWASMプラグインシステムを採用しており、Istioのようなサービスメッシュ基盤にも広がっている
- wasmCloud / Wasmtime: コンテナに代わる軽量な実行単位として、サーバーサイドでもWASMランタイムを使う動きが出てきている
どれも「重い処理をブラウザやサンドボックスの中で安全に、かつ高速に動かしたい」という同じ動機から採用されています。仕様そのものはWebAssembly公式サイトで公開されています。
得意なこと、向かないこと
WASMが力を発揮するのは、CPU負荷の高い計算処理です。画像・動画のエンコード/デコード、暗号処理、パーサー、圧縮・展開、数値計算といった処理は、JavaScriptのJITコンパイル(実行しながら機械語へ変換する方式)よりも安定して高速に動く傾向があります。JITは実行時に頻繁に通る経路を最適化するため実行のたびに速度がばらつきますが、WASMは事前にコンパイルされたバイナリを実行するだけなので速度が安定しやすくなります。
一方で向かない場面もあります。ホスト言語側とWASM側でデータをやり取りする際、文字列やオブジェクトのような複雑な構造はそのまま渡せず、線形メモリ上に並べ直してコピーする必要があります。小さな処理を頻繁に呼び出すような使い方だと、このコピーの手間が処理本体の速度向上を打ち消してしまうことがあります。WASMは「大きな処理を一括で渡して、一括で結果を受け取る」ような使い方と相性が良く、細かい関数呼び出しを何度も行うような使い方には向きません。
まとめ
WASMは「ブラウザの中だけの高速化技術」ではありません。FigmaやPhotoshopのような大規模アプリケーションの移植先として、あるいはEnvoyのようなプラグインシステムの基盤として、静かに実用の範囲を広げています。サンドボックス化された線形メモリモデルのおかげで安全に異言語のコードを持ち込め、CPU負荷の高い処理では安定した速度が出やすい一方、データのやり取りにはコストがかかります。何でも速くなる魔法ではなく、向いている処理を見極めて使う技術です。
自社で検討する際の目安は二つあります。速くしたい処理が、一度にまとめて渡せる重い計算なのか、それとも細かな呼び出しの積み重ねなのか。そして、外部から持ち込んだコードを自社の環境で動かす必要があるかどうか。前者が重い計算で、後者が該当するのであれば、WASMを調べる価値があります。