WebAssembly(WASM)はJavaScriptを除き、ブラウザ上での動作が保証された実行環境です。WASMはあくまでも実行環境であり、プログラミング言語ではありません。そのため、WASMバイナリに変換できる言語は幾つも存在します。
そうした言語を使うことで、普段自分が作っているプログラミング言語からWASMバイナリを生成できます。JavaScript以外の言語を使ってWebアプリケーションの開発が可能になります。
この記事では主なプログラミング言語と、その利用法を紹介します。
Rust
RustはMozillaの開発するプログラミング言語で、WebAssembly向けに開発するのであれば一番お勧めの言語になります。元々RustやC、C++がWebAssembly向けに開発できる言語となっていたので、最新の機能を一番早く実装されるでしょう。
Rustは元々CやC++を置き換える存在として開発されています。CやC++よりもモダンで、メモリ安全なプログラミングを行う際によく用いられています。
C/C++
CやC++もWebAssembly開発にお勧めの言語です。すでにCやC++で開発されているソフトウェアをWebAssembly化する試みも数多く行われています。SQLite3をWASM化するSQLite3 WASM/JSはその一つです。
C/C++からWASMバイナリにする場合にはEmscriptenを利用します。変換する際に、それを利用するHTMLファイルも生成してくれます。もちろん全てのAPIが動作する訳ではないので、コードの修正は必須ですが、既存の資産が利用できるメリットは大きいでしょう。
Go
を付けてコンパイルすればWASMバイナリが生成されます。Goは言語として公式にWebAssemblyをサポートしています。そのため、情報も充実しているイメージがあります。GOARCH=wasm GOOS=js
ただし、まだ実験的な機能であったり、生成されるバイナリファイルのサイズが大きいのが難点です。
Java
JavaではTeaVMというライブラリがJavaの中間ファイルからWASMバイナリを生成します。面白いのは中間ファイルなので、元々のソースコードを必要としないことです。
つまり技術的にはJavaだけでなく、ScalaやKotlinなどJVMで動く中間ファイルであれば利用できるようです。
Kotlin
Kotlinについては開発元であるJetbrainにてKotlin/Wasmが開発されています。まだ実験的ということですが、KotlinからWASMバイナリを生成する機能です。
WASMのGCを必要としているため、ChromeやFirefoxの特別なフラグを必要とします。
AssemblyScript
AssemblyScriptはTypeScriptのサブセット言語です。言語体系はTypeScriptですが、全機能が使える訳ではありません。
そしてAssemblyScriptを変換して、WebAssemblyに変換できます。新しい言語を覚えずにTypeScriptだけで済むのは大きな利点です。
.NET
.NETではBlazorというフレームワークを利用することでWASMバイナリを生成できます。.NET系の言語、C#やVB.NETなどで利用できるようです。
まだ比較的新しいフレームワークですが、成熟すれば.NETを使った開発時に利用できるでしょう。
まとめ
今回はWebAssemblyバイナリを生成できるプログラミング言語を紹介しました。RustやC、C++以外の言語でもWebAssemblyは開発できます。ぜひ自分の好きな言語でトライしてください。
WebAssemblyは多くの場合、JavaScriptよりも高速に実行できます。機械学習のようなクライアント側での計算処理が増える場合やゲームなど、多くの場面で利用できるでしょう。