ひょんなことからWASMを学習することになり、いろいろ調べてみました。
WASMって何?
WASMはWebAssemblyの略称で、、、くらいしか知らない状態なので。
webassembly.org
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 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は仮想命令セットアーキテクチャあるいはプログラミング言語の一種である[2]。略称はWasm[3]。C・Rustなど様々なプログラミング言語のコンパイルターゲットとしてWasmバイナリは生成され、ウェブブラウザを含む様々な環境内のスタックベース仮想マシンにより実行される。
あるプログラミング言語で記載したプログラムをコンパイルしてWasmバイナリを生成して、Webブラウザにアップすることで利用できるということっぽい。
やはり、
- プログラムを書く
- コンパイルする
- アップする
だけでOKか???
@IT
WebAssemblyは、2015年にオープンソースプロジェクトとして初めて公開されました。唐突に登場したわけではなく、前述したasm.jsの試行錯誤を経て、そのバイナリフォーマット版のような位置付けで登場しました。WebAssemblyは、独自の命令セットを持つ仮想マシンの1方式であり、専用のアセンブリ言語で記述するほかに、C++などのプログラミング言語のコンパイルターゲットとしてバイナリを生成できます。そのバイナリをWebブラウザ内の仮想マシンで動作させることで、ネイティブコードに匹敵する高速なプログラムの実行を可能にしています。
歴史を辿るとよりわかりやすい。
Javaをやってきた人間からするとこの画像もわかりやすい。
そして、C系言語だけではなく、RustやGoといった新しい言語、使い慣れたPythonまであるので、開発はしやすいかも。
- モジュール
- テーブル
- メモリ
- インスタンス
- エクスポート
- インポート
を押さえておいて、
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;
})
という呼び出し方を覚えておけばなんとかなるか???
「ほだぎ」さんの記事
この記事は結構興味深い。
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でした。