こんにちは、吉田行男です。今回は、今、話題の「WebAssembly」についてのさまざまな話題をご紹介したいと思います。
「WebAssembly」とは?
「WebAssembly(Wasm)」は、Webブラウザを含むモダンな環境でソフトウェアを実行する新しい取り組みで、ネイティブに近いパフォーマンスを維持しながら、コンパクトなバイナリー形式の低レベルなアセンブラ風な言語になります。但し、基本的に開発者が直接記述するのではなく、C/C++、C#やRust などの言語のコンパイル先となるように設計されており、それらの言語をウェブ上で実行することができます。 WebAssembly は JavaScript と並行して動作するように設計されているため、両方を連携させることができます。
また、このWebAssemblyをWebブラウザだけでなく、デスクトップPCやサーバ、IoTデバイスなどあらゆる環境で、セキュアに実行することを目的に2019年にインテル、Mozilla、Red Hat、Fastlyの4社が、「Bytecode Alliance」を設立しています。
「WebAssembly」が優れている点は?
- 移植性:
Wasm バイトコードのバイナリー形式は標準化されています。つまり、Wasm を実行できるランタイムは、すべての Wasm コードを実行できます。これは、「一度書けばどこでも実行できる」という Java の考え方に似ています。ブラウザでは、ユーザーのブラウザの 95% でWebAssembly を実行可能です。。サーバには、WasmtimeやWasmerなどのランタイムがあり、リソースに制約のある IoT デバイスでさえ、WAMRを使用することで活用できます。
- Universal:
多くの言語がWasmにコンパイルすることができます。C、C++、Rustなどのシステム言語だけでなく、Go、Python、Rubyなどのガベージコレクションの高水準言語もサポートされています。
- ネイティブに近いパフォーマンス:
Wasm は「ネイティブに近いパフォーマンス」と表現されることがよくあります。これが実際に意味することは、WebAssembly はほとんど常に JavaScript より高速であり、特に計算負荷の高いワークロードではネイティブ コードよりも平均で 1.45 ~ 1.55 倍遅くなりますが、結果はランタイムによって異なります。
- 高速起動時間:
Wasm のコールドスタート時間は、独自のカテゴリを保証するほど重要です。サーバでは、コンテナごとに新しいOSプロセスを作成する必要がないため、Dockerコンテナよりも10 倍から100 倍高速なコールド スタートを実現できます。ブラウザでは、Wasm をデコードしてマシン コードに変換する方が、JavaScript を解析、解釈、最適化するよりも高速であるため、Wasm コードは JavaScript よりも高速にピーク パフォーマンスで実行を開始できます。
- セキュア:
WebAssembly は Web を念頭に置いて設計されているため、セキュリティが優先されています。Wasm ランタイムで実行されるコードは、メモリサンドボックス化され、機能が制限されています。つまり、明示的に許可されていることしか実行できないということです。サンドボックス化されても、Wasmコードはシステムレベルのインタフェースやハードウェア機能など、基礎となるシステムへのアクセスを許可されることがあります。
The State of WebAssembly 2022
ソフトウェアコンサルティング会社のScott Logicが「WebAssembly」の使用状況に関する2回目の年次調査を実施、結果をまとめたものが、2022年6月に発表した「The State of WebAssembly 2022(*2)」になります。
本レポートでは、まず下記のような内容がハイライトとして挙げられています。詳細については、後ほど説明させて頂きます。
- 今年のハイライト
- Rustの使用率と使用希望者の割合がともに上昇
- Python の使用が大幅に増加
- JavaScript は WebAssemblyの有力な言語に
- 「Blazor」の使用率と使用希望者の割合がともに上昇
- Wasmtime は最も広く使用されているランタイム
- サーバーレス、コンテナ化、およびプラグイン ホストとしての WebAssembly の使用は大幅に増加
- WebAssemblyをよく使っている回答者の割合が大きく上昇
- WebAssemblyの成功には、非ブラウザAPIが必要だと考える回答者が最も多い
- 「WebAssembly」で最もよく使われ、最も望まれる利用されている言語は「Rust」
「Rust」が45%で昨年に続き最もよく使われていることがわかりました。ほとんどのWebAssemblyランタイムはRustで書かれているということを考えると当然の結果とも言えます。次に多いのは、今回から選択肢に追加された「JavaScript 」になります。「JavaScript」はWebAssemblyにコンパイルできません。しかし、少しトリッキーではありますが、「JavaScript」のエンジンである「Wasm 」をWebAssemblyにコンパイルし、これを使ってコードを実行するという方法になります。
- 「WebAssembly」の活用されている領域は?
WebAssemblyを何に使用してされているのでしょうか?このアンケートでは、複数回答できる形にしています。まず、回答者の約70%がWeb開発に使用していることがわかります。以下、サーバーレスやコンテナ化という順になっています。但し、これは昨年の調査結果と比較すると少し興味深い結果になっています。
下図のように昨年もWeb開発が最も多かったわけですが、サーバーレスとコンテナ化での使用が増加しています。WebAssemblyがこれらの領域での重要なテクノロジーであることを表しています。最も大きな増加は、プラグイン環境としてのWebAssemblyの使用です。WebAssemblyは、信頼できないコードを安全な環境でホスティングするための素晴らしいランタイムだということです。
「WebAssembly」をめぐる最近の話題
- WebAssembly化したPostgreSQLをWebブラウザ上で実際に動かして学ぶ「Postgres playground」をCrunchy Dataが公開
PostgreSQLの商用サービスを提供しているCrunchy Dataは、WebAssembly化したPostgreSQLをWebブラウザ上で実際に動かしながらPostgreSQLの基本から性能分析などさまざまな機能を学べる「Postgres playground」を2022年8月に公開しました。
7種類のチュートリアルも用意されているので、気軽にPostgreSQLを使って動作を学ぶことできるようになっています。 - PHPとSQLiteをWebAssembly化し、Webブラウザ上でWordPressを実行可能にしたデモをVMwareが公開
VMwareのWasm Labsは、Webブラウザ上でWordPressを実行可能にしたデモを公開しました。一般的にはMySQLが使用されることが多いWordPressですが、この環境ではSQLiteを使用しています。
- Docker DesktopがWebAssemblyランタイムを統合。コンテナと同様にWebAssemblyイメージを実行可能に
Docker Desktopを提供するDocker社は、Docker DesktopにWebAssemblyランタイムを統合することによる、Docker DesktopのWebAssembly対応版のテクニカルプレビューを発表しました。またDocker社はこれに合わせて、WebAssemblyをあらゆるプラットフォームでセキュアに実行できるようにするための仕様策定と実装を進めている団体「Bytecode Alliance」への加盟も発表しています。
- WebAssemblyでクラウドネイティブを実現するクラウドサービス「Fermyon Cloud」がオープンベータで登場
WebAssemblyによるクラウドネイティブなアプリケーションの実現を目指すFermyonは、新たなクラウドサービス「Fermyon Cloud」のオープンベータを発表しました。FermyonはWebAssemblyに特化したスタートアップで、2022年3月に、WebAssemblyを用いたイベントドリブンなWebアプリケーションやマイクロサービスアーキテクチャのアプリケーションを実現するためのSpinフレームワークをリリースしています。Spinフレームワークを用いると、RustやGo、Python、Ruby、AssemblyScript、Grain、C/C++などの言語でHTTPリクエストに対応したインターフェイスを備えたサービスを記述し、WebAssemblyにコンパイルし、イベントドリブンに実行可能な実行環境などを構築できます。
現在、クラウドネイティブなアプリケーションの開発にはDockerコンテナを用いることが一般的ですが、今後はこのWebAssemblyを活用するということも視野に入ってきていると考えても良いと思います。さらに、KubernetesにはWebAssemblyをノードとして用いることを可能にするKrustletという仕組みがあります。Fermyonの創業者兼CEOであるMatt Butcher氏はこのKrustletの開発者です。
まとめ
このように当初は、Webブラウザでネイティブコードのように高速で実行できるバイナリフォーマットして策定されたWebAssemblyですが、その適用範囲は拡大し、コンテナを置き換える可能性も出てきました。今後、注目される技術のひとつであるといって、差支えないと思います。
【参考】
https://www.fermyon.com/blog/introducing-spin
著者:
吉田 行男
2000年ごろからメーカー系SIerにて、Linux/OSSのビジネス推進、技術検証、OSS全般の活用を目指したビジネスの立ち上げに従事。社内外でOSS活用に関する講演、執筆活動を行ってきた。2019年から独立し、さまざまな会社や団体の顧問として活動。OSSの活用やコンプライアンス管理などを支援している。