FAQ & トラブルシューティング
一般
zwasm はどの Wasm プロポーザルに対応していますか?
Wasm 3.0 の全 9 プロポーザルに加え、threads、wide arithmetic、custom page sizes に対応しています。詳細は Spec Coverage をご覧ください。
zwasm は Windows に対応していますか?
現時点では対応していません。zwasm は macOS (ARM64) および Linux (x86_64, aarch64) で動作します。JIT とメモリガードページは POSIX API (mmap, mprotect, シグナルハンドラ) を使用しています。
JIT なしで zwasm を使えますか?
はい。デフォルトではインタープリタがすべての関数を処理します。JIT はホットな関数に対してのみ起動されます。特定の関数に対して JIT を無効にする方法はありませんが、呼び出し回数が約 8 回未満の関数は常にインタープリタで実行されます。
WAT パーサとは何ですか?
zwasm は .wat テキスト形式のファイルを直接実行できます: zwasm run program.wat。WAT パーサはコンパイル時に -Dwat=false を指定することで無効化でき、バイナリサイズを削減できます。
トラブルシューティング
“trap: out-of-bounds memory access”
Wasm モジュールがリニアメモリの範囲外のメモリを読み書きしようとしました。これは zwasm ではなく Wasm モジュール側のバグです。モジュールのメモリがデータに対して十分な大きさがあるか確認してください。
“trap: call stack overflow (depth > 1024)”
再帰的な関数呼び出しが深さ 1024 の制限を超えました。これは通常、Wasm モジュール内の無限再帰が原因です。
“required import not found”
モジュールが必要とするインポートが提供されていません。zwasm inspect を使用してモジュールに必要なインポートを確認し、--link またはホスト関数で提供してください。
“invalid wasm binary”
ファイルが有効な WebAssembly バイナリではありません。マジックバイト \0asm とバージョン \01\00\00\00 で始まっているか確認してください。WAT ファイルには .wat 拡張子を使用してください。
パフォーマンスが遅い
zig build -Doptimize=ReleaseSafeでビルドしていることを確認してください。デバッグビルドは 5〜10 倍遅くなります。- ホットな関数 (多数回呼び出される関数) は自動的に JIT コンパイルされます。実行時間の短いプログラムでは JIT の恩恵を受けられない場合があります。
--profileを使用してオペコードの頻度と呼び出し回数を確認できます。
メモリ使用量が多い
- リニアメモリを持つすべての Wasm モジュールはガードページ (仮想メモリ約 4 GiB、物理メモリではない) を確保します。これは正常な動作で、VSIZE は大きく表示されますが RSS は小さいままです。
--max-memoryを使用してモジュールが確保できる実際のメモリ量を制限できます。