第一システム部の小浜です。
今回はWebAssemblyについて簡単に調べてみました。
参考文献
- https://dev.classmethod.jp/articles/wasmtime/ WasmtimeでWebAssemblyを動かしてみる | DevelopersIO
用語解説、概念説明はこちらから。 - https://takahirox.github.io/WebAssembly-benchmark/ JavaScript vs WebAssembly easy benchmark
ベンチマークサイト。ブラウザの中で実行されるのでアクセスしてRunボタンをクリックすると実行がはじまる。 - https://rustwasm.github.io/docs/book/game-of-life/introduction.html Tutorial – Rust and WebAssembly
Rust 言語 と WebAssembly のチュートリアル。実際に動かしてみたい人はこちら。
用語解説
■ WebAssembly(WASM)
WebAssemblyは、ブラウザ上においてネイティブレベルのパフォーマンスで
動作することを目的に策定されたバイナリフォーマットです。
C/C++/Rust/Goなどのプログラム言語をコンパイルしてWASMとして動かすことができます。
■ WASI
WASIとは、WebAssembly System Interfaceの略で、
WebAssemblyをブラウザ以外の環境で実行するためのシステムインターフェイスです。
このインターフェイスによって、WASMがOSのリソースにアクセスできます。
アプリケーションのバイナリファイルは同じもので、異なるCPU, 異なるOS上で動作するファイルとなります。
まとめると以下になります。
- WASMはブラウザ上で動作できるようにWebAssemblyのcore APIにJavascriptインターフェイスとWeb apiを加えたもの。
- WASIはOS上で動作できるようにWebAssemblyのcore APIにWASI API(POSIXライク)を加えたもの。
WASIの実装として、Wasmer ( https://wasmer.io/ ) や WasmEdge ( https://wasmedge.org/ ) 、Wasmtime ( https://wasmtime.dev/ ) などがあります。
WebAssemblyベンチマーク
WASMはブラウザ上で実行するので、WASM版とJavaScript版の実行速度が比較できるような作りのサイトになっています。
- https://takahirox.github.io/WebAssembly-benchmark/ JavaScript vs WebAssembly easy benchmark
2022/08 現在、JavaScriptの方が高速になっているテストケースが多く、少々意外な結果でした。
JavaScript実行エンジンの高速化は目覚ましいです。
感想
実行速度という点ではWASM/WASIに利点があまり無いように感じます。
ネイティブバイナリを生成するC/C++/Rust言語は別として、JavaScriptはかなり高速に動作すると認識を改める必要がありそうですね。
中間バイトコードに変換して実行するタイプの言語(Javaなど)でも実行速度でJavaScriptに負ける可能性も出てきそうです。