Open6

Rust🦀 and WebAssembly🕸 をやる

YENDYEND

Why Rust and WebAssembly?

https://rustwasm.github.io/docs/book/why-rust-and-webassembly.html

  • 低レベル(Low-Level)の制御
    • 間接参照、単相化、メモリの制御をプログラマが行えるようになる
  • 小さい.wasn
    • garbage collectorを含まないためコードサイズが小さい
  • 全てを書き換える必要なない
    • パフォーマンスが重要な箇所からJS -> Rustに置き換えてみる
  • 他との相性
    • RustとWebAssemblyは既存のJSツールと統合されており、ECMAScriptモジュールをサポートしている
YENDYEND

What is WebAssembly?

https://rustwasm.github.io/docs/book/what-is-webassembly.html

  • WebAssembly(wasm)は、シンプルなマシンモデルと実行可能フォーマット
    • ネイティブに近い速度で実行されるように設計されている
  • プログラミング言語としてのWebAssemblyにはテキストとバイナリの二つのフォーマットが存在する
    • .watテキストフォーマットはS式を使用し、Lisp系言語に似ている
    • wasnバイナリはより低レベルで設計され、wasm 仮想マシンによって直接処理されることを意図している
  • 線形メモリ(Linear Memory
    • 単一の連続したバイト配列として表される
    • メモリはページサイズ(64K)の倍数で拡大することができるが、縮小することはできない
  • WebAssemblyはWebだけのものかか?
    • JavaScriptやWebコミュニティ全般で注目を集めているが、wasmはホスト環境についての前提を設けていない
    • ポータブル実行可能("portable executable")
YENDYEND

Tutorial: Conway's Game of Life

https://rustwasm.github.io/docs/book/game-of-life/introduction.html#tutorial-conways-game-of-life

  • Rust と JavaScript に経験があり、WebAssembly を学びたい人向け
  • 学ぶこと
    • Rust ツールチェーンを用いて WebAssebly にコンパイルする方法
    • 開発のワークフロー
    • Rust、WebAssembly、JSの長所を最大限活用するAPIの設計方法
    • WebAssemblyのデバッグ方法およびプロファイリング
    • .wasmバイナリをより小さく、ネットワーク上でのダウンロードを高速化する方法
YENDYEND

Setup - Tutorial

https://rustwasm.github.io/docs/book/game-of-life/setup.html

Rust ツールチェーン

https://www.rust-lang.org/tools/install

$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ rustup --version
rustup 1.27.1 (54dd3d00f 2024-04-24)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.81.0 (eeb90cda1 2024-09-04)`
$ cargo --version                    
cargo 1.81.0 (2dbb1af80 2024-08-20)

wasm-pack

https://rustwasm.github.io/wasm-pack/installer/

$ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
$ wasm-pack --version
wasm-pack 0.13.0

cargo-generate

$ cargo install cargo-generate
$ cargo-generate --version
cargo generate 0.22.0

npm

$ npm install npm@latest -g
$ npm -v
10.9.0