第一日:朝#
1. Rust とは何か#
Rust は、C++ と同様の機能を持つ静的コンパイル言語です。
- rustc は、バックエンドとして LLVM を使用しています。
- Rust と C++ は似たようなシナリオに適しています。
- 非常に高い柔軟性。
- 高度な制御能力。
- マイクロコントローラなどの非常に制約のあるデバイスにもスケーリングダウンできます。
- 実行時やガベージコレクションはありません。
- パフォーマンスを犠牲にすることなく、プログラムの信頼性と安全性に焦点を当てています。
2. Rust を選ぶ理由#
Rust のいくつかの特徴:
- コンパイラによるメモリ安全性
- 実行時の未定義動作がありません
- モダンなプログラミング言語の特徴
2.1 コンパイル時の保証#
コンパイル時の静的なメモリ管理:
- 初期化されていない変数は存在しません。
- メモリリークはありません。
- "ダブルフリー" はありません。
- "解放後の使用" はありません。
NULLポインタはありません。- 忘れられたミューテックスはありません。
- スレッド間のデータ競合はありません。
- イテレータの無効化はありません。
2.2 実行時の保証#
Rust には実行時の未定義動作がありません:
- 配列アクセスには境界チェックがあります。
- 整数オーバーフローは定義されています(パニックまたはラップアラウンド)。
2.3 モダンな特徴#
言語の特徴:
- 列挙型とパターンマッチング
- ジェネリクス
- 追加のオーバーヘッドのない FFI
- ゼロコスト抽象
ツール:
- 強力なコンパイラエラーメッセージ
- 組み込みの依存関係マネージャー
- UT の組み込みサポート
- 優れた言語サービスプロトコルの実装
3. 基本構文#
3.1 スカラー型#
| 型 | リテラル | |
|---|---|---|
| 符号付き整数 | i8、i16、i32、i64、i128、isize | -10、0、1_000、123_i64 |
| 符号なし整数 | u8、u16、u32、u64、u128、usize | 0、123、10_u16 |
| 浮動小数点数 | f32、f64 | 3.14、-10.0e20、2_f32 |
| 文字列 | &str | "foo"、"two\nlines" |
| Unicode スカラー型 | char | 'a'、'α'、'∞' |
| ブール値 | bool | true、false |
| 各型のサイズは次のとおりです: |
iN、uN、fNは_N_ビットを占有します。isizeとusizeはポインタサイズのスペースを占有します。charは 32 ビット幅です。boolは 8 ビット幅です。
3.2 複合型#
| 型 | リテラル | |
|---|---|---|
| 配列(Arrays) | [T; N] | [20, 30, 40]、[0; 3] |
| タプル(Tuples) | (), (T,), (T1, T2), … | (), ('x',), ('x', 1.2), … |
| 配列の代入とアクセス: |
fn main() {
let mut a: [i8; 10] = [42; 10];
a[5] = 0;
println!("a: {:?}", a);
}
タプルの代入とアクセス
fn main() {
let t: (i8, bool) = (7, true);
println!("t.0: {:?}", t.0);
println!("t.1: {:?}", t.1);
}
3.3 参照#
Rust は参照型も提供しています
fn main() {
let mut x: i32 = 10;
let ref_x: &mut i32 = &mut x;
*ref_x = 20;
println!("x: {x}");
}
let mut ref_x: &i32とlet ref_x: &mut i32の違いに注意してください。前者は可変参照を宣言しており、この参照がバインドされている値を変更することができます。後者は可変変数への参照を宣言しています。