📝

AssemblyScriptでWasmを作ってみる

2023/12/12に公開

この記事は、WebAssembly Advent Calendar 2023の12日目の記事です。


WebAssembly (Wasm) と言えば、RustやGo、Cなど多様な言語でコードを書いてコンパイルができます。そんな中でも今回はおそらく利用者が多いであろうTypeScriptと同じような書き心地で開発できるAssemblyScriptについて紹介します。

AssemblyScriptとは

AssemblyScriptは、WebAssemblyのためのプログラミング言語で、TypeScriptに似た構文を持つことが特徴です。この言語を使うと、Webブラウザや他のWebAssembly対応環境で、高速に動作するアプリケーションを開発することができます。JavaScriptやTypeScriptの開発者にとっては、馴染みのある形式であるため、既存のスキルを活用しながら、高性能なアプリケーションを開発することが可能です。また、AssemblyScriptは静的型付けを採用しているため、エラーを早期に発見し、デバッグを容易にすることができます。さらに、WebAssemblyの低レベルの機能にアクセスすることで、メモリ管理や計算の最適化など、細かな制御も可能になります。

このような特徴から、AssemblyScriptは、ゲーム開発、数値計算、大規模データ処理など、高いパフォーマンスが求められる分野での使用が期待されています。

AssemblyScriptの特徴

AssemblyScriptの主要な特徴と強みには、ざっと以下のようなものがあります:

  • TypeScriptのような構文:AssemblyScriptはTypeScriptに似た構文を持ち、JavaScriptやTypeScriptの開発者にとって非常に学習しやすいです。これにより、既存のスキルセットを応用できるので、学習曲線を緩やかにできます。
  • WebAssemblyの高性能:AssemblyScriptで書かれたコードはWebAssemblyにコンパイルされ、ブラウザやサーバーで高速に実行されます。そのため、Wasmの性能の恩恵をしっかり受けることが可能です。
  • 静的型付け:静的型付けにより、コードの安全性が向上し、ランタイムエラーを減らすことができます。これは、大規模なアプリケーションの開発や保守において大きな利点です。
  • 低レベルアクセスと最適化:AssemblyScriptはWebAssemblyの低レベルの機能への直接アクセスを可能にし、メモリ管理やパフォーマンスの最適化が行えます。
  • ポータブルなコード:WebAssemblyは多くのプラットフォームでサポートされているため、AssemblyScriptで書かれたコードは幅広い環境で動作します。

このように、AssemblyScriptはTypeScriptの書き心地でWasmの恩恵を受けることができるという意味で広範なアプリケーションでの利用が期待される言語です。

ただし、TypeScriptの全ての機能をサポートしているわけではないので、詳細はAssemblyScriptの公式サイトを参照してください。
https://www.assemblyscript.org/

AssemblyScriptを使っているプロジェクト

AssemblyScriptの実用的な応用例は、特にゲーム開発、ブロックチェーン技術、データ処理、グラフィックス処理などの分野で目立ちます。以下の公式サイトでAssemblyScriptを使っているプロジェクトを確認することができます。

https://www.assemblyscript.org/built-with-assemblyscript.html

目につくものをあげてみましょう。

BigIntは、任意の大きな整数を扱う数学用のAssemblyScriptのクラスです。これに限らず、暗号学のライブラリなどもAssemblyScriptで開発されていることが多いです。

https://github.com/polywrap/as-bigint

また、ブロックチェーン分野でよく利用されるTheGraphもAssemblyScriptを利用しています。これはブロックチェーン上のデータを取得するためのツールですが、使っていると自然とAssemblyScriptを使っていることに気づきます。

https://github.com/graphprotocol/graph-tooling/tree/main/packages/ts

Wasmの処理性能やポータビリティを活かすことと、TypeScriptの開発者にとって親しみやすい構文を活かすことで、AssemblyScriptは多くの分野で活用され始めています。

AssemblyScriptを使ってみる

AssemblyScriptはNode.jsで動作します。適当なディレクトリに移動して、以下のコマンドを実行してください。

mkdir as-sample
cd as-sample
npm init

次に、以下のコマンドを実行して、AssemblyScriptでの開発に必要なライブラリをインストールします。

npm install --save-dev assemblyscript

コンパイラをインストールすると、現在のディレクトリに新しいプロジェクトをセットアップするためコマンドが利用できます。

npx asinit .

これにより、以下のようにファイルが生成されます。

.
├── asconfig.json
├── assembly
│   ├── index.ts
│   └── tsconfig.json
├── build
├── index.html
├── node_modules
├── package-lock.json
├── package.json
└── tests
    └── index.js

AssemblyScriptのコードはassemblyフォルダ内のindex.tsに書きます。以下のようなコードを書いてみましょう。

export function addArrays(a: Int32Array, b: Int32Array): Int32Array {
  if (a.length != b.length) {
    throw new Error('Arrays must have the same length');
  }

  let result = new Int32Array(a.length);
  for (let i = 0; i < a.length; i++) {
    result[i] = a[i] + b[i];
  }

  return result;
}

このコードは、2つの配列の要素をそれぞれ加算する関数です。

コードが書けたらコンパイルです。npm run asbuildコマンドを実行してください。

$ npm run asbuild

> as-sample@1.0.0 asbuild
> npm run asbuild:debug && npm run asbuild:release

> as-sample@1.0.0 asbuild:debug
> asc assembly/index.ts --target debug

> as-sample@1.0.0 asbuild:release
> asc assembly/index.ts --target release

ここまでの作業で、buildフォルダ内に生成物がたくさん生成されます。これらのファイルをWebページやNode.jsアプリケーションから読み出すことで利用できます。簡単ですね!

まとめ

個人的にAssemblyScriptは他の言語と比べて知名度が低いなと感じていますが、使い慣れたTypeScriptと同じ感覚でWasmに手が出せるという意味では面白いのではないかと思っています。まだまだWasmもAssemblyScriptも発展途上なので、今後の発展が楽しみです。

Discussion