RustでWebAssemblyやってみた


TL;DR

  • Rustにちょっと触りたかっただけという噂

だいたいWebAssemblyとは

  • ざっくりいうと、バイナリプログラムをブラウザ経由で実行できる
  • 小さいファイルサイズ、持ち運びしやすい、ネイティブに近い速い実行速度
  • watファイルとwasmファイルがあり、watは人が読めるwasmはバイナリぐらいの理解で大丈夫
  • ざっくりじゃない説明が欲しい方はこちら
  • WebAssemblyをつくるにはc/c++/rustが対応しています
    • 今回はRustでやってみます

まずはRustのセットアップから

  • 公式に書いてある通りです
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • ~/.cargo/bin を PATHに追加しておきましょう
  • すでにインストールしてるひとは、rustup updateで最新バージョンにアップデートしましょう

wasm-packをインストールします

  • これも公式に書いてあり通りです
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

cargo-generateをインストールします

  • コンパイルするのでまあまあ時間かかります
  • 私のmacbookproではファンがウィンウィンいうてました
cargo install cargo-generate

npmもインストール

  • 割愛しますね
    • nodebrewとかnパッケージを使ってインストールしてください

テンプレートからプロジェクト作成します

cargo generate --git https://github.com/rustwasm/wasm-pack-template
  • project名入れろって言われるので適当に入れる

ビルド

wasm-pack build

npmでの簡易表示

npm init wasm-app www
cd www
npm install
npm run start
  • ブラウザでhttp://localhost:8080/にアクセス
  • やたー表示できたー

感想(あくまで個人の感想です、感じ方には個人差があります)

  1. できたwasmファイルが297バイトには恐怖を感じるほど小さい、キロバイトじゃなくてバイト
  2. コンパイルめんどくさい(PHPやりすぎですね)
  3. jsでは重い処理(画像とか動画)を代わりに任せられそう
  4. unityから呼び出すとかいう使い方が合っているような気がする
  5. WASIという技術も今開発されているのでそちらでコンテナ技術側で活路を見出すのかもしれない