5.

Rust(.rs)完全ガイド — 所有権・借用・ライフタイム・Cargo・メモリ安全

編集
この記事の要点
  • Rust は Mozilla の Graydon Hoare が 2006 年に個人開発を開始、2010 年に Mozilla プロジェクトとして公開、2015 年に 1.0 リリース
  • ソースコード拡張子は .rs。GC を使わずに所有権(ownership)・借用(borrowing)・ライフタイムでメモリ安全を保証
  • コンパイル時に「データ競合・use-after-free・dangling pointer」を排除。C / C++ 同等の性能でメモリ安全
  • パッケージマネージャ cargoCargo.toml が公式。cargo build / run / test / doc で完結
  • ゼロコスト抽象(zero-cost abstraction):高水準な書き方をしてもランタイムオーバーヘッドが生じない
  • Stack Overflow Developer Survey で「最も愛されている言語」を 8 年連続で獲得した実績(〜2023)
  • 用途は OS / ブラウザエンジン(Firefox の Servo)・WebAssembly・組み込み・CLI・高性能サーバー

概要

Rust は、Mozilla の Graydon Hoare が 2006 年に個人プロジェクトとして始め、2010 年に Mozilla 公式プロジェクトとなり、2015 年 5 月 15 日に 1.0 がリリースされた比較的新しいシステムプログラミング言語です。設計目標は明快で「C / C++ と同等の性能を保ちながら、メモリ安全とデータ競合の排除をコンパイル時に保証する」こと。ガベージコレクション(GC)を使わずに実現している点が革新的です。ソースコードの拡張子は .rs、ビルド成果物は単一バイナリ(または .rlib / .so / .dll)です。

Rust の中核概念は 所有権(ownership)借用(borrowing)ライフタイム(lifetime) の三本柱です。すべての値はただひとつの「所有者」を持ち、所有者がスコープを抜けると自動的に解放されます。値を他の関数に渡すと所有権が移動(move)し、参照(&T / &mut T)として「借りる」こともできますが、可変参照は同時にひとつしか存在できないというルールがコンパイル時に検査されます。これにより、データ競合や use-after-free がコンパイル段階で根絶されます。

Rust は ゼロコスト抽象を掲げており、ジェネリクス・トレイト(trait)・イテレータなどの高水準機能を使っても、最終的な機械語は手書き C と同等以下のコストになるよう設計されています。Result<T, E> / Option<T> による明示的なエラーハンドリング、パターンマッチ、代数的データ型(enum)も特徴です。

用途は システムプログラミング・ブラウザエンジン(Servo, Firefox の一部)・WebAssembly・組み込み・OS 開発(Linux カーネル 6.1 で公式採用)・CLI ツール(ripgrep, fd, bat, exa)・高性能 Web サーバー(actix-web, axum) など広範です。Microsoft・AWS・Google・Cloudflare などが本番投入を進めています。

ファイル種類とビルド成果物

拡張子 / ファイル役割
.rsRust ソースコード
Cargo.tomlプロジェクト定義・依存・ビルド設定(TOML 形式)
Cargo.lock依存の正確なバージョン固定
.rlibRust 専用静的ライブラリ
.so / .dll / .dylib動的ライブラリ(C ABI 互換)
実行バイナリ(拡張子なし / .execargo build --release の最終成果物

ビルドフロー: .rsrustc → LLVM IR → 機械語 → 単一バイナリ。target/debug/ がデバッグビルド、target/release/ が最適化ビルドです。

「Hello, World」

fn main() {
    println!("Hello, World");
}

// 所有権と借用の例
fn greet(name: &String) {  // &String で借用(move しない)
    println!("Hello, {}", name);
}

fn main2() {
    let name = String::from("Rust");
    greet(&name);            // 借用なのでこの後も name は使える
    println!("name is still: {}", name);
}
$ cargo new hello
$ cd hello
$ cargo run
   Compiling hello v0.1.0
    Finished dev [unoptimized + debuginfo] target(s) in 0.5s
     Running `target/debug/hello`
Hello, World

パッケージ管理・ビルドツール

Rust 公式の Cargo はビルドツール・パッケージマネージャ・テストランナー・ドキュメント生成器を兼ねる万能ツールで、Rust と一体で配布されます。依存は crates.io から取得します。

# Cargo.toml
[package]
name = "myapp"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
cargo build                # デバッグビルド
cargo build --release      # 最適化ビルド
cargo run                  # ビルドして実行
cargo test                 # テスト
cargo clippy               # リンタ(lint)
cargo fmt                  # フォーマッタ
cargo doc --open           # ドキュメント生成 + ブラウザで開く

関連言語との比較

項目RustC++Go
メモリ管理所有権(コンパイル時)手動 / RAII / スマートポインタGC
性能C++ と同等最高クラスC++ より 10〜30% 遅め
並行処理安全Send / Sync で型保証プログラマ責任goroutine だが競合は起き得る
学習コスト非常に高(所有権の壁)
パッケージマネージャcargo / crates.io(公式)vcpkg / Conan(非公式・乱立)go modules(公式)

注意点・落とし穴

  • borrow checker との戦い:初学者の最大の壁。可変参照と不変参照の同時使用、ライフタイム省略規則を理解するまで時間がかかる。
  • コンパイル時間の長さ:依存を多く取り込むと数分かかることも。cargo check で型チェックだけ走らせると速い。
  • 非同期は Pin / Future が難解:async / await は書けても、内部実装に踏み込むと急に難しくなる。
  • unsafe ブロック:FFI や低レベル最適化で必要だが、ここから先は C と同じ責任。最小化が鉄則。
  • String と &str の使い分け:所有する String と借用 &str の区別は初学者が躓きやすい。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Python(.py / .pyc)
  2. JavaScript(.js / .mjs / .cjs)
  3. TypeScript(.ts / .tsx)
  4. Go(.go)
  5. Rust(.rs)
  6. Java(.java / .class / .jar)
  7. C / C++(.c / .h / .cpp / .hpp)
  8. Ruby(.rb)
  9. Swift(.swift)
  10. Kotlin(.kt / .kts)

最近更新/作成されたページ