エンジニア選書シリーズRustで学ぶWebAssembly
――入門からコンポーネントモデルによる開発まで
――入門からコンポーネントモデルによる開発まで
2024年10月10日紙版発売
2024年10月10日電子版発売
清水智公 著
B5変形判/256ページ
定価3,300円(本体3,000円+税10%)
ISBN 978-4-297-14413-5
書籍の概要
この本の概要
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 まとめ
この本に関連する書籍
-
Rustで作るプログラミング言語 ——コンパイラ/インタプリタの基礎からプログラミング言語の新潮流まで
小さなプログラミング言語から本格的なプログラミング言語へ……ステップバイステップでの開発を通して,プログラミングそのものへの理解を深めよう!
-
実践Rust入門[言語仕様から開発手法まで]
Rustは2015年に安定版がリリースされた新しい言語です。静的型付けと関数型言語などにみられる高度な抽象化のしくみを取り入れており,高品質で再利用性の高いプログラ...