WebAssembly: 意味、利点、ユースケースなど

公開: 2022-10-12

WebAssembly または Wasm は、任意のコンピューター アーキテクチャで実行できるプログラムを作成するためのバイナリ コード形式です。

このシステムは、仮想マシンと、コンピュータ コードを C や C++ などのプログラミング言語から人間が読める .wat およびバイナリ .wasm 形式に変換するコンパイラで構成されます。

WebAssembly の当初の目標は、ブラウザー内でネイティブに近い実行速度を可能にすることで、プログラマーが Web ページ用の高性能アプリケーションを開発できるようにすることでした。 しかし、この技術は現在、ブラウザーを超えてクラウドへと進化しているようです。

このガイドでは、この進化するテクノロジ、その長所と短所、および将来の可能性について知っておく必要があるすべてを示します。

目次

WebAssembly とは?

WebAssembly は、仮想マシン上で実行され、さまざまな言語がコンパイルできるバイナリ コード形式です。 移植できるように設計されており、Web ブラウザーまたはサーバー アプリケーションとして実行できます。

2017 年に最初にリリースされた WebAssembly は、2019 年以来 W3C の推奨事項であり、Mozilla、Google、Microsoft、Red Hat などを含む多数の貢献者によって維持されています。

当初の目標は、ブラウザー内の C/C++ アプリケーションで見られるように、ネイティブに近い実行速度を開発することでした。 また、下位互換性があり、JavaScript に準拠している、安全で、オープン スタンダードで、デバッグ可能で、バージョンのない Web 標準であることも意図されています。

WebAssembly はどのように機能しますか?

WebAssembly は、Java や JavaScript などのランタイム エンジンとして設計されており、ブラウザーやサーバー環境に埋め込んで、.wasm バイナリーまたは .wat テキスト形式でコンパイルされたコンピューター コードを実行できます。

WebAssembly を実行するためのコードを記述するために、開発者はサポートされている多数の言語のいずれかでプログラムを記述します。 次に、WebAssembly コンパイラを使用して、AOT (Ahead of Time) または JIT (Just In Time) でコンパイルします。

このコードは、実行環境でほとんどの作業を行うことができますが、ブラウザーの DOM オブジェクトにアクセスしたり変更したりすることはできません。 このような対話は、JavaScript を通過する必要があります。

サンプル WebAssembly アプリケーションの作成方法

以下に示すように、わずか数ステップで Web ブラウザ用のシンプルな Wasm アプリケーションを作成できます。

  1. Emscripten SDK をダウンロードしてインストールします。
  2. サンプルのhelloworld.cコードを作成するか、必要に応じて C++/Rust で実行します。
  3. ターミナルでemcc helloworld.c -s WASM=1 -s helloworld.htmlを実行して、コードを Emscripten で WebAssembly にコンパイルします。 必要な Wasm バイナリ、HTML、および JavaScript ファイル (グルー コード) が作成されます。
  4. Web ブラウザーを介して helloworld.html ページを提供します。

WebAssembly の利点

WebAssembly とその関連技術を採用する理由は数多くあります。

  • ネイティブに近いパフォーマンス– WebAssembly は、C や C++ などの低レベル言語と同様のパフォーマンスを提供する低レベル設計を備えています。
  • セキュリティ– システムは、システムへのアクセスが制限された仮想環境に隔離することで安全になるように設計されています。
  • オープン スタンダード– 多くの組織や個人が WebAssembly に貢献しており、これは公式の W3C 勧告です。
  • 軽量– WebAssembly は、仮想マシンで実行されるバイナリ コードにコンパイルされます。 このコードは移植可能であり、システム ファイルを必要とせず、付属していません。
  • 多言語サポート– 50 以上の言語を WebAssembly にコンパイルできます。
  • プラットフォームに依存しない – WebAssembly 仮想マシンは、各アーキテクチャが同じランタイム環境を提供するように設計されています。 開発者がしなければならないことは、WebAssembly のコードを記述することだけです。

WebAssembly の限界

  • 進行中の作業– 標準はまだ開発中であるため、多くの機能と改善がまだ行われていません。
  • ガベージ コレクションなし– WebAssembly にはまだガベージ コレクションがありませんが、間もなく実装される可能性があります。
  • DOM アクセスなし– WebAssembly から Web ブラウザーの DOM に直接アクセスすることはできません。JavaScript を経由する必要があります。

WebAssembly 対 Java

Java は、WebAssembly の最も初期の実装の一種です。 一度書けばどこでも実行できる言語として設計されましたが、途中で多くの問題が発生しました。

Java と同様に、WebAssembly は RE (ランタイム環境) を使用してコードを実行しますが、Java とは異なり、選択した言語で WebAssembly を作成できます。

WebAssembly 対 JavaScript

WebAssembly は、JavaScript と同様に、ブラウザーまたは他のホスト環境で実行されます。 ただし、JavaScript がテキスト形式で実行環境に配信され、ジャスト イン タイムでコンパイルされる場合、WebAssembly にはテキスト形式とバイナリ形式の両方があります。

Web ブラウザー内では、JavaScript は DOM にアクセスできますが、WebAssembly はアクセスできません。 ただし、実行速度に関しては、WebAssembly はネイティブ コードに近い実行速度で JavaScript を上回っています。

速度は WebAssembly の優れた点であり、WebAssembly が非常に多くの用途に理想的である理由です。 JavaScript を使用して WebAssembly をブラウザーにロードすると、2 つのコードを一緒に実行してリソースを共有できます。

WebAssembly 対 Docker 対 Kubernetes

Docker と Kubernetes は、クラウド コンピューティングを強化する一般的なテクノロジの 2 つです。 Docker は、開発者がすべてのシステム依存関係を含むアプリケーションを 1 つのパッケージにパッケージ化できるコンテナー テクノロジです。 これにより、アプリケーションを任意のクラウド環境に 1 秒以内で簡単に展開できます。

一方、Kubernetes は、Docker、CRI-O、containerd、および任意の Kubernetes CRI (Container Runtime Interface) 実装などのコンテナー化されたアプリケーションを管理およびデプロイするためのオープンソース システムです。 また、Kubernetes を使用すると、複数のサーバーまたは仮想マシンにまたがるクラウド展開を簡単にスケーリングできます。

この観点から、WebAssembly は Docker に似ており、Kubernetes を使用してコンテナー化されたクラウド アプリケーションとして実行することができます。 また、Docker よりも多くの利点がありますが、おそらくそれに取って代わるものではありません。

ブラウザを超えて

当初、Web サーバーがありました。 フル マシンをサーバー専用にする必要がありました。 次に、サーバーを 1 つまたは複数の CPU スレッドで実行できるようにする仮想マシン (VM) が登場しました。 それでも、専用の VM が必要でした。

クラウド コンピューティングは、アプリケーションをコンテナー化することで、必要なときにのみサーバーを起動して実行できるようにしました。 これにより、使用した分だけ支払う必要があり、専用のマシンが不要になるため、コストの削減につながりました。 しかし、まだいくつかの問題があります。

まず、docker ファイルのサイズは数ギガバイトになる可能性があり、これは起動やその他の管理上の問題でわずかな遅延が発生することを意味します。 ただし、同様の Wasm ファイルは、コンパイル済みのバイナリであるため、サイズは数 MB しかありません。 これにより、Docker よりも起動時間が大幅に短縮され、時間が重要な特定のアプリケーションに最適です。

第二に、WebAssembly の設計は、開発者がシステム リソースを管理および割り当てる必要がないことを意味します。開発者は、選択したプログラミング言語を使用して簡単に要点をつかむことができます。

これらの機能により、WebAssembly はクラウド マイクロ サービスの実行に最適ですが、オペレーティング環境とファイル システムをより詳細に制御する必要があるアプリケーションには、Docker アプリケーションが依然として適しています。

詳細については、WasmCloud や WasmEdge などのプロジェクトが WebAssembly を実行可能なコンピューティング プラットフォームに開発しています。

Wasm ユースケース

WebAssembly には、その独特の性質を考えると、多くのユース ケースがあります。 それらは 3 つの主要なグループに分けることができます。 ブラウザー内、ブラウザー外、およびハイブリッドのセットアップ。

ブラウザ内タイプは自明であり、ブラウザ外は主にサーバー、IoT、およびクラウドの展開を指しますが、ハイブリッドは 2 つの組み合わせを指します。

以下は、Wasm が優れているユースケースです。

  • すでに存在する高パフォーマンス コード– WebAssembly に移植できる古いが素晴らしいコード。
  • 新しい高性能コード– ゼロから設計および実装する必要があるコード。
  • デスクトップ アプリケーションを Web に移植する – これにより、 Web ベースのビデオ編集など、新しい種類の Web ベースのデスクトップ ソリューションが開かれる可能性があります。
  • クラウド コンピューティング– Docker と Kubernetes を組み合わせて実行することで、新たな機会を得ることができます。

以下は、Wasm が優れている特定のアプリケーションとシナリオを示しています。

  • ビデオと画像編集
  • ゲームデザイン
  • AI アプリケーション
  • 仮想および拡張現実アプリケーション
  • 音楽アプリケーション
  • P2P アプリケーション
  • サーバー側アプリケーション
  • クラウド/クラスター計算
  • コンピューター支援設計
  • OS プラットフォームのシミュレーション
  • 暗号化
  • ローカル Web サーバー
  • リモート デスクトップ アプリケーション
  • 科学的な視覚化
  • スマートフォンのハイブリッド ネイティブ アプリ
  • IoT デバイス上

サポートされている言語とフレームワークのリスト

50 を超える言語が WebAssembly にコンパイルされます。最も人気のある言語の一部を次に示します。

  • C++
  • R
  • ルビー
  • 迅速
  • 行け
  • コトリン
  • さび
  • PHP
  • Blazor – .NET 開発者向けのフレームワーク。
  • JwebAssembly – Java バイトコードと、JRuby、Jython、Groovy、Scala、Kotlin などの関連言語のコンパイラ。
  • Yew – WebAssembly を使用してマルチスレッド Web アプリを作成するための Rust フレームワーク.
  • AssemblyScript – WebAssembly コードを作成するために特別に設計された言語。
  • Grain – 強く型付けされた関数型言語.
  • 元子

ここで他の言語を見つけることができます。

WebAssembly ランタイムとツールのリスト

  • 主要なブラウザーはすべて Wasm をサポートしています
  • Pyodide – Pandas、NumPy、SciPy などの Python 科学スタックを備えたブラウザー上の Python ランタイム。
  • ワーム
  • wagi – マイクロサービスとウェブアプリ向け
  • Wasi – モジュラー システム インターフェイス
  • WasmTime – 高速で安全な WebAssembly ランタイム。
  • ワスマー
  • ルセット
  • wasmCloud – クラウド環境
  • Krustlet – Rust で書かれた、Wasm を実行するための Kubernetes kublete。
  • WasmEdge – クラウドおよびエッジ ランタイム環境

結論

WebAssembly とそれがコンピューティングにもたらすものへの旅の終わりに来ました。 ご覧のとおり、多くの可能性が秘められています。

それはまだ進行中の作業ですが、絶え間なく開発されています。 興味のある方は、こちら、こちら、こちらで詳細をご覧ください。