一般に World Wide Web として知られるものの始まりに向けて、JavaScript がありました。 JavaScript は、Brendan Eich が Netscape をサポートする言語を作成した 1995 年から存在しています。Netscape は、残念なことに現在は機能していませんが、当時としては革新的だった美的には美しい Web ブラウザです。 それ以来、ECMAScript 標準は、Web ブラウザーで実行されるアプリケーションの大部分を代表する Web 開発を支える役割を果たしてきました。
最近では、WebAssembly (Wasm) (実際にはしばらく前から存在していた) が登場しました。 World Wide Web Consortium (W3C) が 2019 年に Web 標準として指定した後、HTML、CSS、および JavaScript を含む 4 番目の Web 標準になりました。 しかし、Web ブラウザ アプリケーションは Wasm の中心的かつ歴史的なユース ケースを代表してきましたが、重要なのは、適切に構成された CPU でどこでも実行できるように設計されているということです。これは、Wasm と JavaScript の両方が分岐し、一部のユース ケースではより統合される場所です。
Wasm と JavaScript は密接な関係を保っていますが、Wasm は JavaScript 以外にも非常に重要な役割を果たしています。 簡単に言えば、Web ブラウザーで JavaScript をより効率的に実行できるようにするという Wasm の当初の目的は、依然として統合の重要な要素です。 この統合は現在、Web ブラウザを超えて、JavaScript だけでは最適ではなかったエッジ アプリケーションやサーバー アプリケーションにまで及びます。
これは、Wasm が CPU レベルでバイナリ形式で実行される方法によるものです。 また、JavaScript とは異なり、Wasm はプログラミング言語ではないことも忘れてはなりません。 Wasm の主な利点の 1 つは、その機能により JavaScript に加えて、Python、Rust、もちろん Go、.NET、C++、Java、PHP など、さまざまな言語に対応できることです。
したがって、WebAssembly は必要に応じて JavaScript を統合できますが、もちろん JavaScript の統合に限定されません。 この JavaScript との統合と使用は、特に Web アプリケーションの領域において、WebAssembly と JavaScript の共生の基礎となっています。
これは、そうでなければ解釈される言語とそのランタイムを Wasm モジュールにコンパイルすることで、Wasm が JavaScript のパフォーマンスを向上させることができるからだと、Enterprise Management Associates (EMA) のアナリストである Torsten Volk 氏は The New Stack に語った。 すでにコンパイルされたコードは、JavaScript など、実行時にまだ解釈する必要があるコードよりも一般的に高速に実行される、と彼は言いました。
Wasm と JavaScript の統合は、幅広いアプリケーションでうまく機能します。 それらには、エッジ ロケーションでのブラウザーベースの機械学習、パフォーマンスを必要とするブラウザー ゲーム、低レイテンシーの実行を必要とする拡張現実や仮想現実のアプリ、および一般に、迅速な起動が必要なアプリケーションが含まれます、と Volk 氏は述べています。
さらに、JavaScript は優れた汎用言語ですが、Fermyon Technologies の CEO で共同設立者の Matt Butcher 氏は The New Stack に、「別の言語の長所を活かすことができる」ことが理にかなっている場合もあります。 「負荷の高い数値処理は、C++ または Rust でより効率的に実装される可能性があります。 Python のパッケージは、まさに必要なことをすでに実行しているかもしれません」と Butcher 氏は述べています。 「あるいは、ブラウザで実行する必要のある複雑なレガシー コードを抱えているかもしれません。 WebAssembly は、これらのユース ケースを解き放ちます。」
共有された歴史
実際、JavaScript の約 20 年後に Wasm が作成されて以来、JavaScript と WebAssembly の歴史的な共進化は補完的であり、JavaScript の使用例をより多くのパフォーマンスを必要とするアプリケーション ワークロードに拡大することを目指している、と Volk 氏は述べています。
「純粋なコンピューティング パフォーマンスだけでなく、画像処理などのタスクについても、WebAssembly は JavaScript よりもはるかに高速であるというメリットを確かに示しています。 しかし、文脈はそれよりもはるかに複雑であることは間違いありません」と Volk 氏は述べています。 「モバイル アプリケーションや Web アプリケーションのコーディング タスクを軽くするために JavaScript コードが必要になるなど、計算時間の短縮がそれほど重要かどうかは、常に問題になっているわけではありません。」
WebAssembly のインタラクション モデルの歴史的な重要性は、ブラウザベースの JavaScript コードが他の言語で記述されたライブラリとやり取りする方法を作成することだったかもしれませんが、最も重要であることが証明されているのは、WebAssembly の最終的な設計である、と Butcher 氏は述べています。 「WebAssembly は、外部環境についてほとんど想定していません。 重要なのは、JavaScript を想定していないことです」と彼は言いました。 「これにより、Wasm はブラウザのコンテキストを超えて進化しやすくなりました。」
新しいコンポーネント モデルの仕様はその好例です。 これは、WebAssembly バイナリが関数をインポートおよびエクスポートして、他の WebAssembly バイナリで使用できるようにする方法を説明しているためだとブッチャー氏は述べています。 「JavaScript は必要ありません。これは WebAssembly の本来の範囲をはるかに超えていますが、元の仕様が書かれた方法により実現できます」と Butcher 氏は述べています。
WASMの方が優れていると言えますか?
純粋な計算パフォーマンスだけでなく、画像処理などのタスクについても、WebAssembly は JavaScript よりもはるかに高速であるというメリットを確かに示しています。 しかし、間違いなく、コンテキストはそれよりもはるかに複雑です。 モバイル アプリケーションや Web アプリケーション アプリケーションのコーディング タスクを軽量化するために JavaScript コードが必要になるなど、計算時間の高速化がそれほど重要かどうかは、実際には常に問題になっているわけではありません。
「ブラウザ内で、WebAssembly の最大の恩恵は、他の言語のライブラリを使用できる可能性だと思います。 パフォーマンスは良好で、Figma などの Web アプリケーションに役立ちます。 しかし、コードの再利用は、多くの Web アプリケーションに広く適用できます」と Butcher 氏は述べています。
「ブラウザのエコシステムについては、WebAssembly がその補助的な性質を超えて移動することはないと思います。JavaScript に取って代わるのではなく、JavaScript にアドオンの利点を提供するでしょう」と彼は言いました。 「WebAssembly の真の可能性はブラウザを超えており、そのセキュリティ サンドボックス、パフォーマンス プロファイル、および開発の容易さにより、クラウドでのイノベーションに最適です。」
JavaScript はほとんどの人がアクセスできる言語であり、コミュニティがサポートする多くのライブラリを提供しているため、「車輪を再発明する必要なく、大量のユースケースをサポートします」と Volk 氏は述べています。 「Wasm を ReactJS やその他の一般的な JavaScript フレームワークと組み合わせることができるという事実は、開発者が本格的なエンタープライズ アプリをシンプルかつレスポンシブな方法で提供できるようにすることで、JavaScript の使用例の範囲をさらに広げます」と Volk 氏は述べています。
セキュリティ関連
Wasm は、JavaScript のみでデプロイされたコードと比較して、セキュリティ上の利点を提供します。 Wasm は、JavaScript アプリケーションをデプロイできる「強力なコンパイラ」として使用される場合、JavaScript コードをより安全にするのに役立ちます。 たとえば、Wasm は JavaScript をブラウザから分離し、メモリの安全性を確保し、JavaScript の動的に型付けされたものと比較して悪用が難しい厳密に型付けされた変数を実装します。 「全体として、Wasm で JavaScript を実行すると、アプリ全体の優れた ‘セキュリティ アップグレード’ が提供されます」と Volk 氏は述べています。
実際、Wasm は多くの面でセキュリティ上の利点を提供します。 これは、サイバー資産管理およびガバナンス ソリューションのプロバイダーである JupiterOne の最高情報セキュリティ責任者である Sounil Yu 氏が次のように伝えたからです。
- JavaScript のコンパイラとしての Wasm は、脆弱性の攻撃面を減らし、メモリの安全性を高め、コードを隠し、実行環境をサンドボックス化し、既存のセキュリティ エコシステムを活用することで、アプリケーションのセキュリティを向上させることができます。 Wasm には限られた命令セットと優れたメモリ管理があり、脆弱性の攻撃対象領域を減らし、バッファ オーバーフローなどの一般的なタイプの脆弱性を防ぐのに役立ちます。
- Wasm コードは、人間が判読できないため、攻撃者がコードをリバース エンジニアリングするのが難しく、脆弱性を発見して悪用するのが難しくなります。
- Wasm はサンドボックス環境で実行することもできます。これにより、システムの残りの部分からコードを分離して、機密情報へのアクセスや違法な操作の実行を防ぐことができます。
- CNCF の wasmCloud のような Wasm フレームワークは、より高いレベルの抽象化を提供することで、Wasm のセキュリティ フットプリントをさらに拡張し、開発者が各アプリケーションに埋め込むコードの量を減らします。 また、wasmCloud は、アーティファクトへの署名、組み込みモニタリングの有効化、アプリケーションのパッチ適用の自動化を容易にすることで、開発者のセキュリティ負担を軽減します。
しかし、JavaScript が本質的に安全でないとは言いません。 実際、JavaScript は「非常に安全にすることができます」。 ラルフ・スクイラス Microsoft のプリンシパル プログラム マネージャーである Azure Core Upstream は、電子メールの返信で次のように述べています。 「ブラウザは、地球上で最も攻撃を受けやすい表面の 1 つです。 しかし、WebAssembly は、Veriwasm のようなツールが利用する数学的に証明可能なサンドボックス モデルを使用して、詳細な防御を容易にします」と Squillace は述べています。
「さらに、今後のコンポーネント モデルを使用して、攻撃対象領域を制限することができます。たとえば、ホストはファイル システム API を提供しない可能性もあります。今後の世界では、この種の制限が重要であることが証明されるでしょう」と Squillace 氏は述べています。 「しかしだまされてはいけません。ホストは依然として設定ミスを犯し、モジュールに過大な電力を与える可能性があります!」