第一日:朝#
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
の違いに注意してください。前者は可変参照を宣言しており、この参照がバインドされている値を変更することができます。後者は可変変数への参照を宣言しています。