Cargo xtask


マインスイーパーのマトリックス処理を書き直しました。2020年5月以前のマインスイーパーはjavascriptのみで書かれたマトリックス演算をおこなっていました。2020年5月にweb-assemblyを使用した、マトリックス演算に変更しました。それぞれの式の評価において、javascriptのような型チェック処理を省いていいるので、処理速度の向上が期待できます。

web-assemblyのための言語

Rustをweb-assembly生成のための言語に選びました。当時Rustがソフトウェア開発者の間で人気になっていることを知って、興味を持っていました。個人的な感想では、モダンなc++といった印象です。RustはCargoという標準パッケージマネージャを持っています。アプリやライブラリを作成する時に、必要とするライブラリの依存関係を管理してくれます。node.jsのnpm、phpのcomposer、pythonのpipのような感じです。処理型のためのライブラリをマニュアルで用意する必要はないです。

wasm-bindgenのカスタマイズ

web-assemblyを生成する場合、wasm-packを使うのが一般的でしょう。私もwasm-packを使って、web-assemblyとjavascriptのインターフェイスを得ることができました。kotlinのアプリでweb-assemblyを使う予定です。kotlinは静的型志向言語です。type declarationファイルがあった方が、kotlinの特性を生かすことができます。Rustもまた型志向言語です。wasm-packがtype declarationファイルを生成するのは、容易なことです。しかし、生成されたtype declarationは、私の要求にあっていませんでした。type declaration ファイルは、遅延コンパイルの表記となっていない買ったのです。私は、web-assemblyファイルをfetchして、コンパイルした後に遅延した形で使用したかったのです。私はwasm-packをカスタマイズして私の要求にあったtype declarationを生成する必要がありました。wasm-packのソースを調べて、wasm-bindgenがtype declarationを生成していることを理解しました。wasm-packはラッパーになっていたのでした。Wasm-bindgenをカスタマイズしました。当初wasm-packを使ってカスタマイズしたwasm-bindgenを使うことを考えましたが、wasm-bindgenをダウンロードするurlがハードコーディングされていたので、カスタマイズしたwasm-bindgenを使うことはできませんでした。すでに、wasm-bindgenについて十分理解できていたので、wasm-packを使う必要もなくなっていました。

ライブラリビルド後に wasm-bindgenを実行する

wasm32-unkonwn-unknownのライブラリをビルドした後に、wasm-bindgenを実行する必要があります。Wasm-bindgenはweb-assemblyとtype declarationを生成するために、いつくかの情報をライブラリから得ているようでした。ライブラリビルドが終わった後に追加のコマンドを実行するCargoの標準的な方法を見つけようとしました。Carogが提供していたのは、ライブラリをビルドする前に実行する方法だけでした。ライブラリビルドの後に、コマンドを実行するいくつかのツールをみつけることができました。”cargo-make”が私の要求を実現してくれそうでした。しかし、新しい用法を覚えなければなりませんでした。その時は、よいですが、6ヶ月後もすれば、すっかり忘れてしまうだろうと思いました。 ビルド完了後のカスタムコマンドをRust言語自体で実行したいと思いました。こちらのではCargoのビルドコマンド終了後のカスタムコマンドについてディスカッションされてました。Cargoがビルドコマンド実行後に自動的に追加のコマンドを実行するような機構を持つのには時間がかかりそうです。このディスカッション中に”xtask“というアイディアを見つけました。xtaskは、cargo-makeのようなツールではありません。それは、つかのタスクをcargoに行わせる方法です。 実際xtaskはCargoから見ると、workspaceの一つです。私にとっては、良いアイディアに思えました。カスタムタスクを作るのにRust言語を使用することができました。

web-assemblyのリリースと使用

プロジェクトはgithub.com上にpushしました。web-assemblyはnpm package directoryに公開しました。マインスイーパー で現在使用されています。