Rust

Mozilla Research が開発し 2015 年に 1.0 をリリースしたシステムプログラミング言語。所有権(ownership) と 借用(borrow) の型システムにより、GC なしでメモリ安全性をコンパイル時に保証する。

核心: 所有権システム

Rust の最大の特徴は、メモリ安全性をランタイムコスト(GC)なしで実現すること。3 つのルールで成立する:

  1. 各値にはただ 1 つの所有者(owner)がある
  2. 所有者がスコープを抜けると値は自動的に drop される
  3. ある時点で、値への参照は「可変参照 1 つ」か「不変参照 複数」のどちらか一方のみ

この 3 番目のルール(借用規則)が、data race をコンパイル時に排除する。

let mut v = vec![1, 2, 3];
let r = &v;        // 不変借用
// v.push(4);      // コンパイルエラー: 不変借用中に可変操作できない
println!("{:?}", r);
v.push(4);         // r のスコープが終わったので OK

ライフタイム

参照が有効な期間をコンパイラに伝える仕組み。多くの場合は省略可能(ライフタイムエリジョン)だが、構造体に参照を持たせる場合などに明示が必要。

struct Parser<'a> {
    input: &'a str,  // Parser は input より長生きできない
}

ライフタイムは型の一部であり、「この参照はここまで有効」という契約をコンパイル時に検証する。

型システムの特徴

機能説明
enum + パターンマッチ代数的データ型(ADT)。Option<T> / Result<T, E> が言語の中核
トレイトHaskell の型クラスに近い。ポリモーフィズムの基盤
ジェネリクス + 単相化コンパイル時にジェネリクスを具体型に展開。ランタイムコストゼロ
! (never 型)返らない関数の戻り値型。panic! や無限ループ
impl Trait存在型の軽量構文。戻り値型の抽象化に使う

エラーハンドリング

例外を使わない。Result<T, E> と ? 演算子でエラーを型として伝播する。

fn read_config(path: &str) -> Result<Config, Error> {
    let text = std::fs::read_to_string(path)?;  // エラーなら即 return
    let config = toml::from_str(&text)?;
    Ok(config)
}

panic! は回復不能エラー用。通常のエラーハンドリングには使わない。

非同期プログラミング

async / await 構文を言語が提供するが、ランタイム(executor)は言語に含まれず、ライブラリとして提供される。

async fn fetch(url: &str) -> Result<String, reqwest::Error> {
    let body = reqwest::get(url).await?.text().await?;
    Ok(body)
}

主要な非同期ランタイム:

ランタイム特徴
tokioデファクトスタンダード。マルチスレッド work-stealing
async-stdstd に似た API。tokio の対抗馬だったが勢い減少
smol軽量。シンプルさ重視

ゼロコスト抽象

Rust の設計原則。抽象化を使っても、手書きの低レベルコードと同等の性能が出ること。

ツールチェイン

ツール役割
rustupツールチェイン管理(stable / nightly / ターゲット追加)
cargoパッケージマネージャ + ビルドシステム。Cargo.toml で依存管理
rustcコンパイラ本体。LLVM バックエンド
clippylint ツール。イディオマティックでない書き方を指摘
rustfmtコードフォーマッタ
rust-analyzerLSP サーバー。IDE 補完・型推論表示
miriundefined behavior を検出するインタプリタ

クレート(パッケージ)エコシステム

crates.io が中央リポジトリ。主要なクレート:

領域クレート
非同期ランタイムtokio, async-std
Web フレームワークaxum, actix-web, rocket
HTTP クライアントreqwest, hyper
ハッシュテーブルhashbrown (std HashMap のバックエンド)
データ並列rayon (work-stealing ベースの par_iter)
シリアライズserde (+ serde_json, toml, etc.)
CLIclap, argh
エラーハンドリングanyhow, thiserror
ORM / DBsqlx, diesel, sea-orm
ロギングtracing, log
WASMwasm-bindgen, wasm-pack

Rust が選ばれる領域

領域理由例
CLI ツール起動が速い、単一バイナリ配布ripgrep, fd, bat, delta
Web バックエンド高スループット、低レイテンシCloudflare Workers, Discord
組込み / OSGC なし、メモリ制御Linux カーネルモジュール
WASMコンパイルターゲットとして一級対応Figma, SWC
ゲームエンジン性能 + 安全性Bevy
暗号通貨 / ブロックチェーン性能 + 正確性Solana, Polkadot

C / C++ との比較

C / C++Rust
メモリ安全性プログラマの責任コンパイラが保証
data race検出困難コンパイル時に排除
ビルドシステムCMake / Make / 乱立cargo(統一)
パッケージ管理conan / vcpkg / 手動crates.io + cargo(統一)
学習曲線中(ただし安全に書くのは難)高(借用チェッカーの壁)
性能同等同等(LLVM バックエンド共通)

押さえどころ(カード化候補)

関連

Graph