AssemblyScriptでHello, world!してみた

github.com

AssemblyScriptという、TypeScriptのサブセットでありWebAssemblyにコンパイルできる言語があります。

※ WebAssemblyについては WebAssembly の基礎 - nmi.jp などをどうぞ

TSのサブセットとはいえ、WebAssemblyにコンパイルしやすくするために若干互換性がない部分もあります。たとえば、 ||&& といった演算子の結果はJSだと左辺ないし右辺の値ですが、ASの場合はboolになります。

とはいえ assembly.d.ts のおかげで普通にvscodeで開発できるので、生のWebAssemblyを書くよりはだいぶマシでしょう。

標準ライブラリは std/ 以下をみるといくらか定義されていて、たとえばstring.tsをみると文字列操作の様子がわかります。

https://github.com/AssemblyScript/assemblyscript/blob/master/std/string.ts

いまのところ usize を汎用ポインタ型として使うので非常に読みにくいですが、まあC言語を知っていれば読めないことはないでしょう。

…はい、TSのサブセットとはいうものの、ポインタ操作などは完全にC言語です。GCもないので、文字列操作をするにはmalloc()free() でメモリを操作するコードを書くことになりますし、free() をし忘れると当然メモリリークになります。

とりあえず触ってみようと思い、hello()とadd(x, y)だけするコードを書いてみました:

https://github.com/gfx/hello-assemblyscript

package.jsonとindex.json をみれば分かる通り、assemblyscript がコンパイラで assemblyscript-loader がコンパイルしたwasmのローダーです。

NodeJS v8.0 からWebAssemblyのサポートが入ったので、NodeJSがあれば手元ですぐ試せます。 npm install && make で実行できるかと思います。

WebAssemblyはemscriptenを使えばCのコードから生成できるので、ASの用途は限られるとは思います。ただemscriptenに比べるとランタイムがコンパクトで使い方もES modules準拠なのはメリットかもしれません。emscriptenにくらべると開発環境のセットアップも非常に楽です。

独自性の強い TSの皮をかぶったC言語で、しかも既存の資産もないという状況はかなり厳しいように見えますが、たとえばMessagePack encoder/decoderやJSON processorのような、小規模で速度が求められるようなケースでは使えるかもしれません。