■Part 1 入門
■Chapter1 プログラミング言語 Rust
●1-1 Rust の魅力
●1-2 とにかく実行速度が速い
Rust は機械語に直接コンパイルされる
ガベージコレクションをもたない
「ゼロコスト抽象化」を追求している
●1-3 モダンな言語機能が一通り入っている
不変・可変を明示的に制御できる
filter, map などを使ってコレクションを操作できる
代数的データ型とパターンマッチング
強力な型推論
トレイト
●1-4 OS から Web アプリケーションまで幅広く実装できる
●1-5 ツール群がとても充実している
Cargo
エディタサポート
標準フォーマッタ rustfmt、標準リンター clippy
●1-6 「安全性」が強力に担保されている
●1-7 エディションという考え方によって互換性を担保している
●1-8 Rust の利用事例
■Chapter2 環境構築
●2-1 Webサイトで試せるRust - The Rust Playground
●2-2 開発環境を構築する
rustupをインストール
動作確認
cc
エディタ
Rust Language Server(rls)
rust-analyzer
cargo-edit
リリーストレインモデル:nightly, beta, stable
●2-3 まとめ
■Chapter3 Rustの基本
●3-1 基本的な文法
基本的な型
変数宣言
制御構文
関数
マクロ
●3-2 Rustを支える言語機能
ゼロコスト抽象化
所有権と借用
スレッド安全性
非同期処理
●3-3 クレートとモジュール
入門 クレート
入門 モジュール
●3-4 Cargo - ビルドシステム・パッケージマネージャ
サブコマンド
Cargo.toml
●3-5 テスト
assertマクロ
パニックを発生させるテスト
普段は無視するテスト
testsモジュール
testsディレクトリ
ドキュメントのテスト
■Part 2 実践
■Chapter4 プログラムを作成する
●4-1 プロジェクトの準備
アプリケーションの仕様
プロジェクトの作成
コマンドライン引数の処理
●4-2 計算ロジックを追加する
アプリケーションの枠組みの作成
逆ポーランド記法の計算ロジックの作成
●4-3 テストを書く
●4-4 エラーハンドリングを追加する
エラーをハンドリングしない実装
Resultでエラーを受け取る
独自のエラーを定義する
エラー処理クレートを使う
逆ポーランド記法計算機へのanyhowの適用
●4-5 ファイルパスの表現について
●4-6 実行パスへのインストール
●4-7 まとめ
■Chapter5 Webアプリケーションの開発
●5-1 Webフレームワークのセットアップ
Hello world!
エラーハンドリングの定義
●5-2 テンプレートエンジン
Web アプリの設計
HTML テンプレート
HTML の表示
●5-3 データベース
テーブルの設計
SQLite に Rust でアクセスする
サーバーアプリケーションでアクセスする
●5-4 Todo アプリを仕上げる
POST リクエストを受け取る
●5-5 Docker イメージの作成
Dockerfile の作成
イメージビルドの高速化
イメージサイズの削減
●5-6 まとめ
■Chapter6 WebAssembly
●6-1 WebAssemblyとは
●6-2 開発の準備
npm
cargo-generate
wasm-pack
●6-3 サンプルプログラム:マンデルブロ集合を描く
マンデルブロ集合とは
マンデルブロ集合を計算するプログラム
wasmを呼び出すJavaScriptの実装
JavaScriptから呼び出せるようにする
JavaScriptとの速度比較
●6-4 サンプルプログラム:ナンバープレースを解く
ナンバープレースとは
ナンバープレースを解くプログラム
Rustの実装
JavaScript側の実装
●6-5 まとめ
■Chapter7 GUIアプリケーション
●7-1 RustにおけるGUIの現状
GUIクレートの紹介
IcedによるGUIの実装
●7-2 ウィンドウ
プロジェクトディレクトリの準備
アプリケーション基盤の作成
main関数からの実行
●7-3 ウィジェット
ウィジェットの配置
フォントの使用
ウィンドウのサイズ変更
●7-4 メッセージ
メッセージと状態変数の定義
メッセージの送信
メッセージの受信
●7-5 サブスクリプション
レシピの作成
サブスクリプションの作成
メッセージの受信
時間の表示
完成
■Chapter8 組み込みシステム
●8-1 環境構築
ターゲットとするプラットフォームについて
クロスコンパイルの環境構築
QEMU
●8-2 Hello, world!
●8-3 Lチカ
LEDの操作方法
Peripheralsの取得
Peripheralsの有効化
GPIOの取得
LEDの操作
ウェイトを入れる
Lチカのプログラム
●8-4 embedded-hal
単一のPeripherals
クロックの凍結
型制約されたピン設定
その他のデバイス
●8-5 組み込み向けクレート
alloc
heapless
パニックハンドラ
cortex-m-rtic
●8-6 参考資料
■Chapter9 開発ツール
●9-1 実践Cargo
プロジェクトのディレクトリ構成
フィーチャ
依存クレートの修正
ワークスペース
サブコマンド
●9-2 フォーマッタ・リンター
rustfmt
clippy
●9-3 コードカバレッジ
cargo-tarpaulin
●9-4 ベンチマーク・プロファイラ
cargo bench
criterion
cargo-profiler
flamegraph
hyperfine
●9-5 CI
Travis CI
GitHub Actions
■Chapter10 プロダクトをリリースする
●10-1 シングルバイナリ
●10-2 ビルドの再現性
Cargo.lock
rust-toolchain
●10-3 バイナリサイズの最適化
最適化のオプション
サイズ比較
●10-4 Profile-Guided Optimization
実行方法
●10-5 クレートの信頼性
rustsec.org
cargo-audit
cargo-crev
●10-6 ファジング
cargo-fuzz
●10-7 プライベートなクレート
cargo publishを禁止する
代替レジストリ
■Part 3 Tips
■Chapter11 いろいろなRustの発展的Tips
●11-1 マクロ
宣言的マクロ
手続きマクロ
関数的マクロ
deriveマクロ
アトリビュートマクロ
●11-2 FFIによる他言語との連携
サンプル:RustからC言語の関数を呼ぶ
サンプル:RubyからRustの関数を呼ぶ
FFIを使う上での注意点
その他のバインディングを作るクレート
まとめ
●11-3 パニック
自己診断としてのパニック
パニックとResultの使い分け
パニックが起こるとどうなるか
パニックを捕捉する
巻き戻しが起こらない場合
パニックハンドラを置き換える
パニックとポイズニング
パニックのまとめ
●11-4 unsafe
UB (未定義動作)
安全性と健全性
unsafeアンチパターン
契約で理解するunsafe
unsafeの2つの使い方
妥当性不変条件と即時UB
unsafeをできるだけ安全に使うために
valgrind
デバッガを使う
サニタイザ
参考資料
unsafeのまとめ
●11-5 Rust のエディション
エディションとは何か?
エディションの歴史
今後予定されているエディション
エディション間の互換性について
Cargo でのエディションの設定方法
●11-6 Rust製のOSS
ripgrep
Alacritty
Rust製のOSSでよく使われるライセンス
cargo-license
●11-7 Rust のコミュニティ
Rust のコミュニティについて
Rust 商標ポリシーについて
最新情報を得るために
日本のコミュニティの現状
●11-8 Rust と競技プログラミング
●11-9 Rustを仕事で使う
業務で使われている例
自社の業務にRustを取り入れるためのヒント
まとめ
索 引
■Column 目 次
機械語とは何か
ゼロコスト抽象化
関数型プログラミング言語 Rust?
ビルトインマクロ
PartialEqとPartialOrd
2015エディションのモジュールシステム
Rust の文字列型
Rust におけるasync/await と非同期ランタイム
Webフレームワーク
汎用 SQL ライブラリ: diesel
Rust とサーバーレスアプリケーション
Rust と Prometheus
wasm-bindgen
web-sys
Tierについて
xargoとstd Aware Cargo
cross によるクロスコンパイル
svd2rust
RustとOS
バイナリにリビジョンを埋め込む
清潔なマクロ
2015エディションのマクロと名前解決