Rust
概要
Rustはメモリ安全性に焦点を当てたコンパイル型のシステム言語です。ほとんどの言語はガベージコレクタ、つまり使わなくなったメモリをバックグラウンドで自動的に片づける掃除役を動かします。Rustはその掃除役を置かず、代わりにプログラムをビルドする間にメモリが正しく扱われていることを自ら証明します。図書館の本を思い浮かべてください。一度に一人だけが本を手に取り書き込めて、すでに返却されて処分された本はシステムが貸し出しを拒みます。だから、もう存在しないものをうっかり使ってしまうことがありません。Rustの所有権と借用のモデルは、データに対してまさにこの役割を果たします。このモデルは、プログラムが実行される前の時点で、データ競合(コードの二か所が同じものを同時に書き換えること)やuse-after-freeのバグ(すでに片づけられたメモリを使うこと)が起きないことを保証します。その結果、Cレベルの速さを、足を撃つ余地をはるかに減らした形で得られます。
強み
- プログラムをビルドする間にチェックされるメモリ安全性とスレッド安全性。ガベージコレクタ(ほとんどの言語がバックグラウンドで動かすメモリの掃除役)は不要。
- CやC++に匹敵するパフォーマンス。
- 豊かな型システム、パターンマッチング、そして第一級のパッケージマネージャー(Cargo。Rustに組み込まれたビルド・パッケージ管理ツール)。
- 何が間違っていて、どう直せばよいかを説明する優れたコンパイラエラー。
トレードオフ
- 急な学習曲線 — ボローチェッカー(上で述べた「一度に一人だけ」という本のルールを強制するRustの仕組み)を体得するには相応の時間がかかる。
- 高水準言語よりも書くのが遅く、コンパイルにも時間がかかる。
- 単純なスクリプトや手早いプロトタイプにはオーバースペック。
- 非同期Rustやライフタイムの多いジェネリックなコードは、本当に込み入ったものになり得る。
使いどころ
パフォーマンス、信頼性、リソース制御がすべて同時に重要なときにRustを選びましょう。システムソフトウェア、ゲームエンジン、コマンドラインツール、WebAssembly、組み込み、パフォーマンスがクリティカルなサービスなどです。使い捨てのスクリプトには不向きで、そこでは安全性の保証が摩擦に見合いません。
バイブコーディングとの相性
AIアシスタントはもっともらしいRustを生成しますが、真の裁定者はボローチェッカーです。コンパイラエラーを貼り戻して反復することになると見ておきましょう。Rustの診断は的確でモデルがそれに基づいて動けるため、これはうまく機能します。AIには、エラー処理でResultと?に頼らせ、ライフタイムと格闘するよりも所有型や明確な借用を優先させ、クレート(crate。Rustの再利用可能なコードパッケージ)を(Cargo.tomlのエントリつきで)明示的に提案させましょう。安全性と挙動を検証できるようcargo testのケースを求めましょう。モデルがunsafeを提案してきたら、押し返してまず安全な代替案を求めましょう。
fn main() {
let nums = vec![3, 1, 4, 1, 5, 9, 2, 6];
let sum: i32 = nums.iter().filter(|&&n| n % 2 == 0).sum();
println!("Sum of evens: {sum}");
}