Wasm(WebAssembly)について

概要

WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine.

https://webassembly.org/

WebAssembly は現代のウェブブラウザーで実行できる新しい種類のコードです。ネイティブに近いパフォーマンスで動作する、コンパクトなバイナリー形式の低レベルなアセンブリー風言語です。さらに、 C/C++、C# や Rust などの言語のコンパイル先となり、それらの言語をウェブ上で実行することができます。 WebAssembly は JavaScript と並行して動作するように設計されているため、両方を連携させることができます。

https://developer.mozilla.org/ja/docs/WebAssembly
  • スタックベースの仮想マシン用のバイナリ命令フォーマット
  • 2017年のversion 1.0以来、4つの主要なブラウザエンジンに実装されている
    • Firefox
    • Google chrome
    • Safari
    • Microsoft Edge
  • WebAssemblyモジュールはWebアプリ(またはNode.js)にインポートすることができ、Javascriptを補完し、並行して動作する
Wasm ecosystemイメージ

Wasmのゴール

  1. モバイルや IoTを含む幅広いプラットフォームで利用可能な一般的なハードウェア機能を利用して、ネイティブ速度で実行するようにコンパイルできるコンパイル ターゲットとして機能する、移植可能でサイズ効率と読み込み時間効率の高いバイナリ形式を定義する
  2. 以下の段階的に実装する
    • C/C++を対象とした、asm.js とほぼ同じ機能を備えた標準のMVP(Minimum Viable Product)
    • C/C++以外の言語の対応も含む、追加機能
      • 当初はスレッド、例外処理、SIMDの機能に注目されていた
        • SIMDはSingle Instruction, Multiple Dataの略でCPUの1サイクルで複数の命令を同時に実行する工夫
  3. 既存の Web プラットフォーム内で実行し、うまく統合できるように設計する
  4. テスト用の最小限のシェルから本格的なアプリケーション環境までブラウザ外の環境(Non-Web environment)でも対応する
    • Non-Web environmentは例えば、データセンターのサーバー、IoT デバイス、モバイル/デスクトップアプリも含む
    • Non-Web environmentは、feature testingとdynamic linkingにより
      Non-Web environments may provide different APIs than Web environments, which feature testing and dynamic linking will make discoverable and usable.
    • Non-Web environmentは、node.jsのようにJavascriptのVMを含む場合もあるが、WebAssemblyはJavascriptのVMがなくても実行できるようにする
    • WebAssembly の仕様自体は、大きな移植可能なlibc のようなライブラリを定義しようとしないが、WebAssemblyの仕様の一部にlibcにある関数のような機能がある
      • libcは、よく使われるC言語の関数ライブラリ(例えばprintf()、fopen()など)
      • libcにあるような機能はWebAssembly semanticsの中核である
        • たとえば、多くのシステムで呼び出しプロセスに割り振られるスペースを変更することができるsbrk関数に似たWebAssembly関数でgrow_memoryオペレーターがある。また、将来的にはダイナミックライブラリをロードするdlopenに似たオペレーターなどが実装される
    • Web environmentとNon-Web environmentで仕様を共有できるが、WebAssemblyの仕様とは別物
      • 似たようなスタンスの事例に、JavascriptのモジュールをロードするLoaderが挙げられる(LoaderはWeb環境にもnode.js環境にも対応するように作られているが、Javascriptの仕様とは別物である)
    • ソースコードのレベルで移植を可能にするため、ホスト環境に組み込まれている機能に対する、ソースコードレベルのインターフェイス由来のライブラリを提供する
  5. プラットフォームを作成する
    • WebAssembly用の新しいLLVMバックエンドとそれに付随するclangポートを構築する
      • LLVMはLow Level Virtual Machineの略でコンパイラーおよびコンパイラーを構築するためのツールキット
        https://www.heavy.ai/technical-glossary/llvm
    • WebAssembly を対象とする他のコンパイラやツールを宣伝する
    • 便利なツールを提供する

特徴

  • ブラウザで様々なプログラミング言語で書かれたプログラムが実行できる
  • ほぼネイティブのスピードで動作する
  • どのブラウザでも同様に動作する

期待されるアプリケーション

  • 画像認識
  • CAD
  • リアルタイムレンダリング
  • VR/AR
  • データの視覚化・シミュレーション
  • ゲーム
  • 画像・動画編集

主要団体

W3C WebAssembly Community / Working Group

  • WebAssembly のオープンスタンダードは、W3C Community Groupと W3C WebAssembly Working Groupで開発されている
    • W3C
      • World Wide Web Consortiumの略
      • 1994年10月にMITで設立
      • Webの可能性を最大限に引き出すことをミッションとした、Web標準を開発する国際コミュニティ
    • W3Cは様々なGroupが所属している
      • Community and Business Group
        • Community Groupは参加無料のオープンフォーラムであり、Web開発者等の関係者がレポート作成、議論、テストを行い、Webの専門家コミュニティとつながることができる
        • Business Groupは短期的に Web の開発に影響を与えたいイノベーターに、志を同じくする利害関係者と協力するためのベンダー中立のフォーラムを提供する
      • Working Group
        • 標準化トラックのテクニカル レポート、ソフトウェア、テスト スイート、および他のグループの成果物のレビュー等の成果物を目的とする
      • その他、Interest GroupsやPermanent Groupsがあるが割愛

Bytecode Alliance

  • 調査中
  • セキュリティに関する知見に重点が置かれている

WASI(WebAssembly System Interface)

参考