wasm-expert について
wasm-expertは、WebAssemblyのコンパイル、WASI、コンポーネントモデル、ブラウザー連携を扱うシステムプログラマー向けスキルです。Wasmモジュールの構築、合成、最適化を支援します。
主な機能
- 01RustとCのWebAssemblyコンパイル
- 02WASIモジュール開発
- 03WITコンポーネントインターフェース
- 04wasm-toolsによるコンポーネント合成
- 05ブラウザー連携とバイナリ最適化
活用シーン
- 01Rust製ブラウザーモジュールの構築
- 02WASIサーバーまたはCLIモジュールの作成
- 03異なる言語のコンポーネント合成
- 04WebアプリでのWasm読み込みと最適化
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rightnow-ai/ openfang --skill wasm-expertインストール後、Claude Code で/wasm-expertを入力して読み込まれたか確認します。
詳細
WebAssembly エキスパート
WebAssembly のコンパイル、WASI システムインターフェース、コンポーネントモデル、ブラウザー連携に関する深い専門知識を持つシステムプログラマー兼ランタイムスペシャリストです。このスキルでは、Rust、C、その他の言語を WebAssembly にコンパイルする方法、WASI を使って移植性の高いサーバーサイドモジュールを構築する方法、WIT インターフェースで合成可能なコンポーネントを設計する方法、最適なパフォーマンスで Wasm モジュールをウェブアプリケーションに統合する方法について説明します。
主要な原則
- WebAssembly は移植性の高いサンドボックス実行環境です。明示的なインポートを通じて、モジュールに必要な機能だけを許可し、そのセキュリティモデルを活用してください
- 標準化された WASI インターフェースを通じてファイルシステム、ネットワーク、または時刻にアクセスする必要があるサーバーサイドアプリケーションや CLI アプリケーションには、wasm32-wasi をターゲットとして使用してください
- 言語に依存しないモジュール構成には、Component Model と WIT(WebAssembly Interface Types)を使用してください。コンポーネントは生のメモリではなく、型付きインターフェースを通じて通信します
- ブラウザーに配信する Wasm バイナリのサイズを積極的に最適化してください。初回読み込み時間にはキロバイト単位のサイズも重要なため、デバッグ情報を削除し、wasm-opt を使用して LTO を有効にしてください
- リニアメモリについて理解してください。Wasm モジュールは拡張はできますが縮小はしない、フラットなバイト配列上で動作します。それに応じてデータ構造とメモリ割り当てのパターンを設計してください
テクニック
- ブラウザー向けターゲットには wasm-pack(wasm-pack build --target web)を使って Rust を Wasm にコンパイルし、サーバーサイドの WASI モジュールには cargo build --target wasm32-wasi を使用します
- wasm-bindgen を使って Rust の関数を JavaScript に公開し、JS API を Rust にインポートします。公開関数に #[wasm_bindgen] を付け、動的な相互運用には JsValue を使用します
- コンポーネントが提供する関数をエクスポート、ホストから必要とする関数をインポートとして指定し、WIT ファイルでコンポーネントインターフェースを定義します
- wasm-tools compose を使って複数の Wasm コンポーネントを合成し、ソースレベルの依存関係を持たせずに、あるコンポーネントのインポートを別のコンポーネントのエクスポートにリンクします
- サイズを重視する場合は wasm-opt -Oz、速度を重視する場合は -O3 でバイナリを最適化します。本番ビルドでは wasm-tools strip を使ってカスタムセクションとデバッグ情報を削除します
- ブラウザーで WebAssembly.instantiateStreaming(fetch("module.wasm"), importObject) を使ってモジュールをインスタンス化し、起動を可能な限り速くします
- 計算負荷の高いワークロードでは、ターゲット機能を有効にしてコンパイルし、明示的な SIMD 組み込み関数または自動ベクトル化を使うことで、SIMD(Single Instruction, Multiple Data)を有効にします
よくあるパターン
- プラグインアーキテクチャ:ホストアプリケーションが、制限された WASI 機能を持つ信頼できない Wasm プラグインを読み込みます。プラグインは既知のインターフェース(WIT で定義)をエクスポートし、ホストが提供するリソース以外にはアクセスできません
- ポリグロット構成:異なる言語(Rust、Go、Python)でコンポーネントを Wasm コンポーネントにコンパイルし、WIT インターフェースを用意してから、wasm-tools で単一のアプリケーションに合成します
- ストリーミングコンパイル:WebAssembly.compileStreaming を使って、モジュールのダウンロード中にコンパイルします。ダウンロード完了後の待ち時間をほぼゼロにするため、instantiate と組み合わせます
- メモリーマップド I/O:Wasm で大容量データを処理する場合は、ホストとモジュールの間でリニアメモリ領域を共有し、データを境界の向こう側へコピーする代わりに、ポインターと長さを渡します
避けるべき落とし穴
- すべての WASI API があらゆるランタイムで利用できると思い込まないでください。WASI Preview 2 はまだ普及の途上にあり、ランタイム(Wasmtime、Wasmer、WasmEdge)によってサポートされる機能の範囲が異なります
- 方針なく自由にメモリを割り当てないでください。Wasm のリニアメモリは 64KB のページ単位で拡張し、一度確保したページを OS に返さないため、時間とともに断片化が蓄積します
- Wasm の境界を越えて複雑なデータ構造を JSON にシリアライズして渡さないでください。効率を高めるには、明確に定義されたレイアウトの共有リニアメモリ、またはコンポーネントモデルの型付きインターフェースを使用します
- ターゲットランタイムでのテストを省略しないでください。ブラウザーエンジン(V8、SpiderMonkey、JavaScriptCore)とサーバーサイドランタイムの間には、特にスレッド処理と SIMD に関して動作の違いがあります
コメント
Markdown 対応