ブラウザのC++およびWebAssemblyアクセラレーション
WebAssemblyを使ってブラウザでC++とRustを実行する
JavaScriptは多くのことに優れていますが、重い計算のために設計されたわけではありません。物理エンジンを実行したり、リアルタイムでビデオを処理したり、ブラウザでコードをコンパイルしたい場合、JavaScriptでは遅すぎることがあります。WebAssembly(略称Wasm)は、C++、Rust、Goなどの言語で書かれたコードをブラウザで直接、ネイティブに近い速度で実行できるようにすることで、この問題を解決します。
WebAssemblyの仕組み
C++やRustなどの言語でコードを書き、.wasmバイナリファイルにコンパイルし、JavaScriptと一緒にブラウザに読み込みます。ブラウザはこのバイナリをネイティブアプリケーションのようにマシンコードにコンパイルします。その結果、計算集約型のタスクは同等のJavaScriptよりもはるかに高速に実行されます。
.wasmファイルはサンドボックス環境で実行されます。DOMやファイルシステムに直接アクセスすることはできません。代わりに、明確に定義されたインターフェースを介してJavaScriptと通信します。JavaScriptはWebAssemblyモジュールによってエクスポートされた関数を呼び出し、WebAssemblyモジュールはJavaScriptからインポートされた関数を呼び出すことができます。データは共有メモリバッファを介して共有されます。
さまざまな言語のためのツールチェーン
最も簡単な始め方は言語によって異なります。CおよびC++の場合、Emscriptenが最も成熟したツールチェーンです。コードをWebAssemblyにコンパイルし、ロードとメモリ管理を処理するJavaScriptグルーコードを提供します。また、グラフィック用のSDL、POSIXスレッド、SIMD命令もサポートしています。
Rustの場合、wasm-packが標準ツールです。Cargo(Rustのパッケージマネージャー)と統合し、TypeScriptバインディングを自動生成します。Goの場合、TinyGoは小さなWebAssemblyバイナリを生成します。そしてAssemblyScriptは、TypeScript風の構文を使用してWebAssemblyを記述できます。
パフォーマンス特性
WebAssemblyは、数学、暗号化、圧縮、物理、機械学習推論などのCPUバウンドのタスクに対して、ネイティブに近い速度で実行されます。起動時間はJavaScriptよりも高速です。バイナリ形式の方が効率的にコンパイルできるためです。ストリーミングコンパイルにより、ブラウザはダウンロード中にWebAssemblyをコンパイルできるため、起動時間がさらに短縮されます。
最大のパフォーマンスを得るには、並列演算にSIMD命令を有効にし、Web Workersを使用してメインスレッド外でWebAssemblyを実行し、JavaScriptとWebAssembly間の呼び出し回数を最小限に抑えます。各呼び出しにはオーバーヘッドがあります。
実際のアプリケーション
以前はブラウザでは不可能または実用的ではなかった多くのことが、現在では実現可能になっています。画像や動画の処理はリアルタイムで可能です。FFmpeg.wasmはブラウザ内で完全なFFmpegライブラリを実行します。暗号化ライブラリはネイティブ速度で動作できます。Box2DやRapierのような3D物理エンジンは、ゲームやシミュレーションを支えています。
おそらく最も印象的なユースケースは、ブラウザ内でアプリケーション全体を実行することです。UnityとUnreal Engineの両方がゲームをWebAssemblyにエクスポートでき、コンソール品質のゲームをブラウザにもたらします。AutoCADはWebAssemblyを介してブラウザで実行されます。また、SQLite、Figma、Google Earthなどのツールには重要なWebAssemblyコンポーネントがあります。
未来
WebAssemblyはもはやブラウザだけのものではありません。WASI(WebAssembly System Interface)は、ファイル、ネットワーキング、クロックのシステムコールを標準化し、WebAssemblyをサーバー、エッジデバイス、さらにはユニバーサルプラグインフォーマットとして実行できるようにしています。コンポーネントモデルにより、異なる言語で書かれたWebAssemblyモジュールがシームレスに相互運用できるようになります。WebAssemblyは、コードがどこで実行されるかに関係なく、ユニバーサルランタイムになりつつあります。
一緒に取り組みましょう
さらに詳しい情報やプロジェクトのヘルプ、またはアイデアの構築が必要ですか?
簡単な質問でもフルプロジェクトでも、お気軽にどうぞ。お問い合わせいただき、あなたのアイデアを一緒に実現しましょう。
お問い合わせ →