What is WASM???

ひょんなことからWASMを学習することになり、いろいろ調べてみました。

WASMって何?

WASMはWebAssemblyの略称で、、、くらいしか知らない状態なので。

webassembly.org

WebAssembly

WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.

WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.

WASMは、スタックベースのVM用のBinary Instruction Formatのこと。

プログラミング言語のための可搬性のあるコンパイルターゲットとして設計されている。

それによって、クライアントアプリ、サーバアプリの両方をデプロイできるようになる。

スタックベースのVM?

Binary Instruction Format?単純なバイナリファイル形式のことかな?

可搬性のあるコンパイルターゲット?コンパイルしたバイナリのことかな?

とにもかくにも

クライアントアプリとサーバサイドアプリの両方をデプロイできる

のがミソのようだ。

Mozilla Developer Network

WebAssembly | MDN

WebAssembly is a new type of code that can be run in modern web browsers – it is a low-level assembly-like language with a compact binary format that runs with near-native performance and provides languages such as C/C++, C# and Rust with a compilation target so that they can run on the web.

WebAssembly is a new type of code that can be run in modern web browsers — it is a low-level assembly-like language with a compact binary format that runs with near-native performance and provides languages such as C/C++, C# and Rust with a compilation target so that they can run on the web. It is also designed to run alongside JavaScript, allowing both to work together.

WebAssemblyは、モダンWeb Browser上で実行できるコードの新しい形。

ローレベルのアセンブリのような言語で、コンパクトなバイナリフォーマットなのでネイティブに近いパフォーマンスで実行できるし、C/C++、C#やRustのような言語を使って、コンパイルしてWeb上で実行できる。

Javascriptと一緒に実行できるように設計されていて、その両者を一緒に動作させることもできる。

とにもかくにも、

C系の言語とRustとかを使ってWeb上で実行できる

ようだ。

Wikipedia

WebAssembly – Wikipedia

WebAssemblyは仮想 命令セットアーキテクチャあるいは プログラミング言語の一種である。略称は Wasm。 C・ Rustなど様々なプログラミング言語のコンパイルターゲットとしてWasmバイナリは生成され、 ウェブブラウザを含む様々な環境内の スタックベース 仮想マシンにより実行される。 ネイティブコード相当の 高速性・隔離環境でのメモリ安全な実行による 安全性・仮想マシンによるハードウェア/プラットフォーム 可搬性・ソースプログラミング言語 中立性などを特徴とする。この命令セットはバイナリ形式で定義されており、また アセンブリ言語ライクなテキスト形式も定義されている(その意味で 低水準プログラミング言語 といえる)。 Wasm自体は命令セットアーキテクチャであり、Linuxカーネルが提供するようなシステムコール(例: ファイルI/O)、Webブラウザが提供するようなDOMアクセスなどを提供していない。上記の安全性や可搬性はこの特徴に由来している。それと同時に、WasmエコシステムとしてはシステムコールやDOMアクセスがAPIとして個別に定義されており、Wasmランタイムが実装することでそれらの機能を提供している(例: システムコールを提供する WASI )。シンプルでオープンなISAとランタイムごとのAPIを組み合わせることでWasmエコシステムは高い拡張性を有している。例えばWasmをHTTPプロキシでのフィルタスクリプトとして利用するプロジェクトが存在する。 WebAssemblyはポータブルな スタックマシンであり、既存のウェブブラウザで広く用いられている JavaScriptと比べ、構文解析と実行が高速になるよう設計されている。WASM specification はWASMの言語仕様および 実行ファイル形式 を定義する。 Wasmは高水準の アセンブリ言語 として設計されている。x64等のアセンブリ言語にみられない特徴として以下がある。 値に定義される型は i32 / i64 / f32 / f64 の4種類である。char/stringは型としてサポートされない。また、 高級言語のように関数が 構造体 型を取り回すようなコードが直接的には記述できない。 デフォルトでは外部と隔離されている( サンドボックス)。計算結果を渡したり外部関数を呼び出したりするために、WASMは imports/ exports 機能を提供する。対象となるオブジェクトは関数・テーブル・メモリ・グローバル変数の4種類。 exports

WebAssemblyは仮想命令セットアーキテクチャあるいはプログラミング言語の一種である[2]。略称はWasm[3]。C・Rustなど様々なプログラミング言語のコンパイルターゲットとしてWasmバイナリは生成され、ウェブブラウザを含む様々な環境内のスタックベース仮想マシンにより実行される。

あるプログラミング言語で記載したプログラムをコンパイルしてWasmバイナリを生成して、Webブラウザにアップすることで利用できるということっぽい。

やはり、

  • プログラムを書く
  • コンパイルする
  • アップする

だけでOKか???

@IT

フロントエンドを高速化する第4のWeb言語――「WebAssembly」とは?

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。 連載:いろんな言語で試す、WebAssembly入門  本連載のサンプルコードをGitHubで公開しています。 こちら からダウンロードしてみてください。 …

WebAssemblyは、2015年にオープンソースプロジェクトとして初めて公開されました。唐突に登場したわけではなく、前述したasm.jsの試行錯誤を経て、そのバイナリフォーマット版のような位置付けで登場しました。WebAssemblyは、独自の命令セットを持つ仮想マシンの1方式であり、専用のアセンブリ言語で記述するほかに、C++などのプログラミング言語のコンパイルターゲットとしてバイナリを生成できます。そのバイナリをWebブラウザ内の仮想マシンで動作させることで、ネイティブコードに匹敵する高速なプログラムの実行を可能にしています。

歴史を辿るとよりわかりやすい。

No Title

No Description

Javaをやってきた人間からするとこの画像もわかりやすい。

そして、C系言語だけではなく、RustやGoといった新しい言語、使い慣れたPythonまであるので、開発はしやすいかも。

No Title

No Description

  • モジュール
  • テーブル
  • メモリ
  • インスタンス
  • エクスポート
  • インポート

を押さえておいて、

WebAssembly.instantiateStreaming(fetch('sample.wasm'), importObject)
.then((obj) => {
    // エクスポートされた関数の呼び出し
    obj.instance.exports.function();
    // メモリの読み込み
    const i32 = new Uint32Array(obj.instance.exports.memory.buffer);
    // テーブルの読み込み
    const table = obj.instance.exports.table;
})

という呼び出し方を覚えておけばなんとかなるか???

「ほだぎ」さんの記事

WebAssemblyの歴史について

最近、Node.jsとDenoの開発者であるRyan Dahlさんが JavaScript Containers という記事を書いていることを知った。 …

この記事は結構興味深い。

Node.jsの開発者のRyan DahlのJavaScript Containersという記事。

Alon ZakaiのThe History Of WebAssemblyというYoutube。

AlonのYoutubeでは、

  • JITコンパイラや、Adobe FlashとJava Appletを思い出させるNPAPI
  • Emscriptenとasm.js
  • Unityとの関わり
  • LLVMの話
  • WASIの仕様策定によりサーバサイドWASMも加速

など非常に興味深い、かつ、TechのDeepなところの話で、こういう話を知っておくのは大事だし、世の中にはとんでもなくすごいエンジニアがいるんだなと実感。

まとめ

  • Rustが良さそうだけど、Pythonも含め色々な言語でWASMを実装できる
  • クライアントサイドだけでなく、サーバサイドでもWASMを活用できる
  • Webの未来

WebAssemblyは確かに数年前に聞いたことがあったし、ちょっと読んだかもしれないんだけど、すっかり忘れていたし、こういった技術にしっかりアンテナを貼っておくというのが重要だと感じたWASMでした。