書籍概要

エンジニア選書

Rustで学ぶWebAssembly
――入門からコンポーネントモデルによる開発まで

著者
発売日
更新日

概要

Webブラウザー上でプログラムを高速に実行するための技術として開発されたWebAssembly(Wasm)ですが,近年では「特定のプログラミング言語・アーキテクチャに依存しない」「プログラムをサンドボックス内で安全に実行できる」という強みに注目が集まっています。さらに,新たに導入される予定の「コンポーネントモデル」によって,大規模なプロジェクトでもWebAssemblyを利用しやすくなる環境が整いつつあります。本書では,プログラミング言語としてRustを採用し,以下の3つの観点で,“新しい”WebAssemblyについて手を動かしながら理解を深めます。

  • Rustで書いたプログラムから,どうWebAssemblyを作るのか
  • WebAssemblyを,どうRustのプログラムに組み込むのか
  • 作成したWebAssemblyを,どう使い回すのか

目次

第1章 プログラミング言語Rustの準備

1.1 Hello, world!

  • 1.1.1 変数と束縛
  • 1.1.2 関数定義と呼び出し
  • 1.1.3 プリミティブなデータ型
  • 1.1.4 構造体
  • 1.1.5 所有権と参照
  • 1.1.6 変更可能な参照
  • 1.1.7 関連関数とメソッド
  • 1.1.8 トレイト:Rustにおけるインターフェース定義

1.2 エラーハンドリング

  • 1.2.1 文字列に関する2つの型
  • 1.2.2 HelloWorldオブジェクトから文字列への変換
  • 1.2.3 文字列からHelloWorldオブジェクトの復元
  • 1.2.4 Option型のエラーハンドリング
  • 1.2.5 Result型のエラーハンドリング

1.3 ライブラリーの利用

  • 1.3.1 クレート
  • 1.3.2 Rustの名前空間
  • 1.3.3 use宣言
  • 1.3.4 ferris_says::sayの利用
  • 1.3.5 実行例

1.4 まとめ

第2章 WebAssemblyとは

2.1 WebAssemblyの特徴

  • 2.1.1 ビルドターゲット
  • 2.1.2 信頼できないコードの実行
  • 2.1.3 WAT:Wasmのテキストフォーマット

2.2 Wasmの利用例

  • 2.2.1 マルチプラットフォーム展開の例
  • 2.2.2 Wasmによるプラグイン開発の例

2.3 Wasmの標準化プロセス

2.4 仕様の進化とコンポーネントモデル

  • 2.4.1 Wasmモジュール
  • 2.4.2 モジュールとインスタンス
  • 2.4.3 データ表現に関する仕様の不在
  • 2.4.4 コンポーネントモデル

2.5 まとめ

第3章 RustによるWebAssembly作成入門

3.1 RustによるWasmコンポーネント作成の流れ

3.2 cargo-componentのインストール

3.3 Hello, world!

  • 3.3.1 cargo componentの利用
  • 3.3.2 ライブラリークレートの利用

3.4 grepコマンドクローンを作ろう

  • 3.4.1 プロジェクトフォルダーの作成
  • 3.4.2 依存関係の追加
  • 3.4.3 コマンドライン引数の宣言
  • 3.4.4 ファイルの読み込み
  • 3.4.5 サンドボックス化された実行環境
  • 3.4.6 指定したパターンにマッチする行のみ出力

3.5 まとめ

第4章 他のプログラムから利用されるWasmコンポーネント

4.1 ライブラリーコンポーネント向けのプロジェクト作成

4.2 WIT入門

  • 4.2.1 WITによるインターフェース定義
  • 4.2.2 ワールド:コンポーネントの定義
  • 4.2.3 パッケージ名

4.3 ワールドの実装

  • 4.3.1 greetableインターフェースの実装

4.4 Wasmを実行するプログラムの作成

  • 4.4.1 プロジェクトの作成
  • 4.4.2 ライブラリーコンポーネントの利用

4.5 ライブラリーコンポーネントの利用(コード生成編)

  • 4.5.1 WITからのコード生成
  • 4.5.2 インスタンスとラッパーオブジェクトの作成
  • 4.5.3 生成されたラッパーオブジェクトの利用
  • 4.5.4 実行例

4.6 エクスポートについて

4.7 まとめ

第5章 依存関係の解決と合成

5.1 import:依存関係の記述

  • 5.1.1 ワールドの追加
  • 5.1.2 greetプロジェクトが実装するワールドの明示
  • 5.1.3 hello-worldワールドを実装するプロジェクトの作成
  • 5.1.4 hello-world-implを実装

5.2 Wasmコンポーネントの合成

  • 5.2.1 wacコマンドのインストール
  • 5.2.2 コンポーネントの合成

5.3 ホストコードによる実装の提供

  • 5.3.1 バイナリークレートの作成
  • 5.3.2 依存するインターフェースの実装
  • 5.3.3 コンポーネントのインスタンス化
  • 5.3.4 インスタンスの提供する関数の呼び出し
  • 5.3.5 実行例

5.4 WebAssembly System Interface(WASI)

5.5 wasi:cli/importsの実装

  • 5.5.1 wasmtime-wasiを依存関係に追加
  • 5.5.2 Greet構造体にメンバー変数を追加
  • 5.5.3 WasiViewトレイトを実装
  • 5.5.4 WASIの実装をLinkerオブジェクトに追加
  • 5.5.5 実行結果
  • 5.5.6 CLIアプリの実行

5.6 まとめ

第6章 コマンドラインインターフェースアプリケーションの作成

6.1 グリッチアート

6.2 本章で作成するCLIアプリ

6.3 コンポーネントレジストリーへ登録

  • 6.3.1 Wargとは
  • 6.3.2 wa.devへのユーザー登録
  • 6.3.3 Wargクライアントのインストール
  • 6.3.4 wa.devへCLIから接続する

6.4 WITによるインターフェース定義

  • 6.4.1 witファイルを保持するフォルダーの作成
  • 6.4.2 WITにおけるユーザー定義型

6.5 WITパッケージをコンポーネントレジストリーに登録

6.6 インターフェースを実装

  • 6.6.1 Rustプロジェクトの作成
  • 6.6.2 インターフェースの実装
  • 6.6.3 Wasmパッケージの登録

6.7 CLIアプリの改変

  • 6.7.1 ワールドの指定
  • 6.7.2 必要なクレートを依存関係に追加
  • 6.7.3 プログラムの変更
  • 6.7.4 Wasmコンポーネントとしてビルド
  • 6.7.5 Wasmコンポーネントの合成
  • 6.7.6 実行結果

6.8 補足として

  • 6.8.1 WITのデータ型について
  • 6.8.2 パッケージのバージョン管理

6.9 まとめ

第7章 サーバーアプリケーションの開発

7.1 本章で作成するサーバーアプリケーション

7.2 Hello, wasi:http/proxy

  • 7.2.1 プロジェクトの作成
  • 7.2.2 実装
  • 7.2.3 Webブラウザーを使った動作確認
  • 7.2.4 リソース

7.3 Spinの導入と利用

  • 7.3.1 Spinの導入
  • 7.3.2 Spin向けのプロジェクト作成
  • 7.3.3 hello_wasi_http.wasmの組み込み
  • 7.3.4 アプリの起動

7.4 echo APIの作成

  • 7.4.1 コンポーネントの追加
  • 7.4.2 spin.tomlの編集
  • 7.4.3 echo APIの実装
  • 7.4.4 アプリのビルドと起動
  • 7.4.5 curlコマンドを使った動作確認

7.5 グリッチアートを作るAPIの作成

  • 7.5.1 プロジェクトフォルダーの作成
  • 7.5.2 Web APIの実装
  • 7.5.3 コンポーネントの合成
  • 7.5.4 Spinアプリへの組み込み

7.6 まとめ

第8章 Wasmコンポーネントとコンテナーランタイム

8.1 Wasmコンポーネントを動かすコンテナーイメージ

8.2 Docker Desktopのインストール

  • 8.2.1 初期設定
  • 8.2.2 起動確認
  • 8.2.3 Wasmコンポーネントの有効化

8.3 Wasmコンポーネントを動かすコンテナーイメージの作成

  • 8.3.1 Dockerfileの作成
  • 8.3.2 コンテナーイメージの作成
  • 8.3.3 コンテナーイメージの実行

8.4 Spinアプリを動かすコンテナーイメージの作成

  • 8.4.1 Spinアプリの整理
  • 8.4.2 Dockerfileの作成
  • 8.4.3 コンテナーイメージの作成
  • 8.4.4 コンテナーイメージの実行

8.5 まとめ

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2024年12月25日最終更新)

P.67 2つめの端末画面 3行目

/somewhere/hello-world-cli
/somewhere/hello-wasi-cli

(以下2024年11月11日更新)

P.42 端末画面 2行目

$ cargo build --target wasm32-wasip1
$ cargo build -r --target wasm32-wasip1

補足情報

本書で利用するクレートとバージョン番号の一覧を以下に示します。

(2024年11月26日更新)

クレート     バージョン    
anyhow 1.0.86
bitflags 2.6.0
clap 4.5.13
ferris-says 0.3.1
png-glitch 0.3.0
rand 0.8.5
serde 1.0.204
serde_json 1.0.120
spin-sdk 3.0.1
wasmtime 21.0.1
wasmtime-wasi 21.0.1
wit-bindgen-rt 0.29.0

商品一覧