- Published on
Rust 2025:45.5%組織採用、TIOBE 13位、Linuxカーネル参入 — あなたのチームもRustを学ぶべきか?
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 1. Rust 2025:数字で見る現在地
- 2. Rustが使われている場所:実践的(じっせんてき)な使用事例(じれい)の完全ガイド
- 3. なぜRustなのか:Go、C++、Javaとの比較
- 4. Rust学習ロードマップ:正直(しょうじき)なガイド
- 5. Rustの課題(かだい)と41.6%の懸念(けねん)
- 6. GoからRustへ、C++からRustへ:マイグレーション戦略(せんりゃく)
- 7. 2025年Rustエコシステムのハイライト
- 実践クイズ
- 参考資料(さんこうしりょう)
1. Rust 2025:数字で見る現在地
2025年はRustにとって歴史的(れきしてき)な年でした。単なる「注目(ちゅうもく)される新興(しんこう)言語」から「企業(きぎょう)の核心(かくしん)インフラ言語」への転換(てんかん)が数字で確認(かくにん)されたからです。
主要指標(しひょう)のまとめ
組織採用率: 45.5%(+17.6% YoY)
メイン言語使用: 38.2%
商用利用: 68.75%(2021年比成長)
TIOBEランキング: 13位(史上最高)
Stack Overflow: 9年連続「最も愛される言語」
crates.ioパッケージ: 150,000+(2024年末時点)
組織採用率45.5%の意味
45.5%という数字がなぜ重要(じゅうよう)なのでしょうか? 2023年には27.9%だったこの数値(すうち)が、わずか2年で17.6ポイント上昇(じょうしょう)しました。これは個人プロジェクトレベルではなく、企業の意思決定者(いしけっていしゃ)がプロダクション環境(かんきょう)にRustを導入(どうにゅう)し始めた証拠(しょうこ)です。
年別組織採用率の変化:
2020: 約15%
2021: 約20%
2022: 約25%
2023: 27.9%
2024: 34.8%
2025: 45.5%
商用利用の爆発的(ばくはつてき)成長
2021年にRustを「業務(ぎょうむ)の大部分」に使用する割合(わりあい)はわずか約8%でした。2025年にはこの数値が13.5%に達し、68.75%という驚異的(きょういてき)な成長率(せいちょうりつ)を記録しました。特に注目すべきは「Rustを業務に全く使用していない」と回答した割合が急激(きゅうげき)に減少(げんしょう)したことです。
TIOBE 13位の象徴性(しょうちょうせい)
TIOBEインデックスでRustが13位に到達(とうたつ)したことは、単純な順位以上の意味があります。C、C++、Java、Python、JavaScriptのようなレガシー強者の中で、比較的(ひかくてき)新しいシステムプログラミング言語がこの位置に到達したのは異例(いれい)です。2020年には30位圏外(けんがい)でした。
Stack Overflow 9年連続(れんぞく)1位
Stack Overflowの開発者調査(ちょうさ)で、Rustは2016年から2024年まで9年連続で「最も愛される言語(Most Admired Language)」に選ばれました。2024年の調査では、開発者の約83%がRustを継続(けいぞく)して使用したいと回答しました。これは使用経験(けいけん)のある開発者の満足度(まんぞくど)が圧倒的(あっとうてき)に高いことを意味します。
2. Rustが使われている場所:実践的(じっせんてき)な使用事例(じれい)の完全ガイド
「Rustを誰が使っているのか?」という質問への答えは明確(めいかく)です。世界最大級の企業が核心インフラにRustを積極的(せっきょくてき)に導入しています。
Linuxカーネル(Rust for Linux)
2022年のLinux 6.1でRustが公式サポート言語として追加されて以来(いらい)、Rust for Linuxプロジェクトは着実(ちゃくじつ)に拡大(かくだい)しています。
// 従来のLinuxカーネルドライバ(C言語)
// NULLポインタ、バッファオーバーフロー等のメモリバグリスク
static int my_driver_probe(struct platform_device *pdev) {
struct my_data *data;
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
if (!data)
return -ENOMEM;
// ... 手動メモリ管理
}
// Rustで書かれたカーネルドライバ
// コンパイル時にメモリ安全性を保証
use kernel::prelude::*;
module! {
type: MyDriver,
name: "my_driver",
license: "GPL",
}
struct MyDriver {
// 所有権システムがメモリ安全性を保証
}
impl kernel::Module for MyDriver {
fn init(_module: &'static ThisModule) -> Result<Self> {
pr_info!("Rust driver loaded\n");
Ok(MyDriver {})
}
}
重要ポイント: Linuxカーネルで発見されるセキュリティ脆弱性(ぜいじゃくせい)の約70%がメモリ安全性の問題です。Rustはこの問題を根本的(こんぽんてき)に解決(かいけつ)します。
Android
GoogleはAndroidでRustを積極的に導入しています。
- Bluetoothスタック: Android 13からGabeldorsche Bluetoothスタックを Rustで書き直し
- WiFiスタック: コアネットワーキングコンポーネントにRust導入
- Keystore2: Androidの鍵管理(かぎかんり)システムをRustで再実装(さいじっそう)
- UWB(Ultra-Wideband): 近距離通信(きんきょりつうしん)スタック
Googleの報告(ほうこく)によると、Androidで新しいコードにRustを導入した後、メモリ安全性の脆弱性が目に見えて減少しました。
AWS(Amazon Web Services)
AWSはRustの最も積極的な企業スポンサーの一つです。
Firecracker: サーバーレスワークロード用マイクロVM(Lambda、Fargateの基盤)
Bottlerocket: コンテナ専用Linux基盤OS
S2N-TLS: TLSプロトコル実装
Mountpoint: S3用ファイルシステムクライアント
Cedar: 認証・認可ポリシー言語およびエンジン
Firecrackerは特に注目(ちゅうもく)に値(あたい)します。AWS LambdaとFargateを駆動(くどう)する核心技術として、マイクロ秒単位の起動時間と最小限のメモリオーバーヘッドを提供(ていきょう)します。
Cloudflare
Cloudflareはインターネットトラフィックのかなりの部分を処理(しょり)するインフラをRustで構築(こうちく)しています。
- Pingora: Nginxを代替(だいたい)するHTTPプロキシフレームワーク。1日に数兆件(すうちょうけん)のリクエストを処理
- エッジコンピューティング: Workersランタイムのコアコンポーネント
- DNSインフラ: 高性能DNS処理
Pingoraは2024年にオープンソースとして公開(こうかい)され、既存のCベースソリューションと比較してメモリ使用量とCPU使用量の両方で改善(かいぜん)を示しました。
Discord
DiscordのGoからRustへのマイグレーション事例は、Rustコミュニティで最も多く引用(いんよう)される成功事例の一つです。
サービス: Read States(既読状態追跡)
問題: GoのGC(ガベージコレクタ)によるレイテンシスパイク
結果: Go -> Rustマイグレーション後:
- P99レイテンシ10倍改善
- メモリ使用量の大幅削減
- GC関連レイテンシスパイクの完全解消
Meta(Facebook)
MetaはRustを大規模(だいきぼ)に導入した初期(しょき)企業の一つです。
- Mononoke: Git互換(ごかん)ソースコントロールサーバー(数万人のエンジニアが使用)
- Buck2: 次世代(じせだい)ビルドシステム(全体をRustで書き直し)
- Sapling: 新しいソースコントロールクライアント
- Relay: GraphQLコンパイラ
Microsoft
MicrosoftはWindowsカーネルにRustを導入し始めました。
- Windowsカーネル: DWriteCore等の一部コンポーネントをRustに転換
- Azure: IoT Edgeランタイムの一部
- VS Code: 検索(けんさく)機能(きのう)(ripgrepベース)
Microsoftのセキュリティチームは、自社製品のセキュリティ脆弱性の約70%がメモリ安全性の問題であることを明らかにしており、これがRust導入の主要な動機(どうき)です。
Dropbox
DropboxはRustの初期導入企業の一つで、ファイル同期(どうき)エンジンのコア部分をRustで作成しました。
- 同期エンジン: Magic Pocketストレージインフラ
- クロスプラットフォーム: Windows、macOS、Linuxで同じRustコードを共有(きょうゆう)
その他の主要企業
1Password: パスワード管理のコアロジック
Figma: マルチプレイヤーサーバー
Vercel: Turbopack(次世代バンドラー)
Shopify: YJIT(Ruby JITコンパイラ、Rustで作成)
npm: レジストリインフラの一部
3. なぜRustなのか:Go、C++、Javaとの比較
Rustを選ぶべき理由を理解するには、競合(きょうごう)言語との比較が不可欠(ふかけつ)です。
コア比較表
| 基準(きじゅん) | Rust | Go | C++ | Java |
|---|---|---|---|---|
| メモリ安全性 | コンパイル時保証 | GCベース | 手動管理 | GCベース |
| パフォーマンス | C/C++級 | やや遅い | 最高水準 | JVMオーバーヘッド |
| 並行性モデル | コンパイル時検証 | goroutine | 手動管理 | Threadベース |
| 学習曲線 | 急峻(きゅうしゅん) | 緩やか(ゆるやか) | 非常に急峻 | 普通 |
| ビルド速度 | 遅い | 非常に速い | 遅い | 普通 |
| バイナリサイズ | 小さい | 普通 | 小さい | 大きい(JVM) |
| エコシステム成熟度 | 成長中 | 成熟 | 非常に成熟 | 非常に成熟 |
| 主要ドメイン | システム、インフラ | クラウド、マイクロサービス | システム、ゲーム | エンタープライズ |
Rust vs Go:いつどちらを選ぶか
GoとRustはよく比較されますが、実際の使用領域(りょういき)はかなり異なります。
Goを選ぶべき場合:
- 素早い開発速度が最優先
- マイクロサービス / APIサーバー
- DevOpsツール(Kubernetesエコシステム)
- チームのオンボーディング速度が重要
- プロトタイピング後の素早いリリース
Rustを選ぶべき場合:
- 極限のパフォーマンスが必要(P99レイテンシが重要)
- メモリ安全性がセキュリティに直結
- システムプログラミング(カーネル、ドライバ)
- GCなしの予測可能なパフォーマンス
- 組み込み / リソース制約のある環境
Rust vs C++:後継者(こうけいしゃ)か、競争者(きょうそうしゃ)か
// Rust: コンパイラがメモリ安全性を保証
fn process_data(data: &[u8]) -> Vec<u8> {
let mut result = Vec::new();
for &byte in data {
if byte > 0 {
result.push(byte * 2);
}
}
result
// resultのメモリはスコープを抜けると自動解放
}
// C++: 開発者が手動でメモリ管理
std::vector<uint8_t> process_data(const uint8_t* data, size_t len) {
std::vector<uint8_t> result;
for (size_t i = 0; i < len; ++i) {
if (data[i] > 0) {
result.push_back(data[i] * 2);
}
}
return result;
// dataがダングリングポインタの可能性? コンパイラは検証しない
}
C++よりRustが優れている点:
- コンパイル時メモリ安全性
- データ競合(きょうごう)の防止(ぼうし)
- モダンなパッケージマネージャ(Cargo)
- より良いエラーメッセージ
C++がまだ強い領域:
- 既存コードベースの規模(数十年の蓄積(ちくせき))
- ゲームエンジンエコシステム(Unreal Engine等)
- 特定のハードウェア/プラットフォームサポート
- 成熟したライブラリエコシステム
Rust vs Java:異なる次元(じげん)の比較
JavaとRustは対象ドメインが大きく異なりますが、一部の領域では競合(きょうごう)します。
Javaの強み:
- エンタープライズエコシステム(Spring、Jakarta EE)
- 膨大なライブラリ
- JVM最適化(HotSpot)
- 豊富な人材プール
Rustの強み(Java比):
- GCなしの予測可能なレイテンシ
- はるかに小さいバイナリ / メモリフットプリント
- ネイティブコンパイル
- システムレベルのアクセス
4. Rust学習ロードマップ:正直(しょうじき)なガイド
Rustの学習は他のプログラミング言語とは根本的(こんぽんてき)に異なります。正直に言えば、最初の2週間が最も苦しい時期です。
Week 1-2:所有権、借用、ライフタイム(最大の関門(かんもん))
この3つの概念(がいねん)はRustの核心であり、ほとんどの開発者が挫折(ざせつ)するポイントです。
所有権(Ownership)の基本
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1の所有権がs2に移動(move)
// println!("{}", s1); // コンパイルエラー! s1はもう有効ではない
println!("{}", s2); // OK
}
核心ルール:
- すべての値には正確に1つの所有者がある
- 所有者がスコープを抜けると値が解放される
- 値を別の変数に代入すると所有権が移動する
借用(Borrowing)と参照
fn main() {
let s1 = String::from("hello");
// 不変借用:複数同時に可能
let len = calculate_length(&s1);
println!("'{}' の長さ: {}", s1, len); // s1はまだ使用可能
// 可変借用:同時に1つだけ
let mut s2 = String::from("hello");
change(&mut s2);
println!("{}", s2); // "hello, world"
}
fn calculate_length(s: &String) -> usize {
s.len()
}
fn change(s: &mut String) {
s.push_str(", world");
}
借用ルール:
- 不変参照は複数同時に可能
- 可変参照は同時に1つだけ
- 不変参照と可変参照を同時に持つことはできない
ライフタイム(Lifetime)の基礎
// ライフタイム注釈が必要な場合
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let string1 = String::from("long string");
let result;
{
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str());
println!("最も長い文字列: {}", result);
}
// ここでresultを使用するとエラー(string2は既に解放済み)
}
学習のコツ: ライフタイムを最初から完璧(かんぺき)に理解しようとしないでください。コンパイラのエラーメッセージに従(したが)いながら段階的(だんかいてき)に身につけるのが効果的(こうかてき)です。
Week 3-4:構造体(こうぞうたい)、列挙型(れっきょがた)、パターンマッチング
// 列挙型とパターンマッチング
enum Shape {
Circle(f64),
Rectangle(f64, f64),
Triangle(f64, f64, f64),
}
fn area(shape: &Shape) -> f64 {
match shape {
Shape::Circle(r) => std::f64::consts::PI * r * r,
Shape::Rectangle(w, h) => w * h,
Shape::Triangle(a, b, c) => {
let s = (a + b + c) / 2.0;
(s * (s - a) * (s - b) * (s - c)).sqrt()
}
}
}
// エラー処理:ResultとOption
fn divide(a: f64, b: f64) -> Result<f64, String> {
if b == 0.0 {
Err("0で割ることはできません".to_string())
} else {
Ok(a / b)
}
}
fn main() {
match divide(10.0, 3.0) {
Ok(result) => println!("結果: {}", result),
Err(e) => println!("エラー: {}", e),
}
// ?演算子で簡潔に
let result = divide(10.0, 0.0).unwrap_or(0.0);
println!("デフォルト値使用: {}", result);
}
Month 2:トレイト、ジェネリクス、クロージャ、イテレータ
// トレイトの定義と実装
trait Summarizable {
fn summary(&self) -> String;
// デフォルト実装の提供が可能
fn preview(&self) -> String {
format!("{}...", &self.summary()[..20])
}
}
struct Article {
title: String,
content: String,
}
impl Summarizable for Article {
fn summary(&self) -> String {
format!("{}: {}", self.title, &self.content[..50])
}
}
// ジェネリクスとトレイト境界
fn print_summary<T: Summarizable>(item: &T) {
println!("{}", item.summary());
}
// イテレータとクロージャ
fn process_numbers(numbers: Vec<i32>) -> Vec<i32> {
numbers
.iter()
.filter(|&&n| n > 0)
.map(|&n| n * 2)
.collect()
}
Month 3:非同期(ひどうき)プログラミング(tokio)、Webフレームワーク
// Axum Webサーバーの例
use axum::{routing::get, Router, Json};
use serde::Serialize;
#[derive(Serialize)]
struct User {
id: u64,
name: String,
}
async fn get_user() -> Json<User> {
Json(User {
id: 1,
name: "Alice".to_string(),
})
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/user", get(get_user));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}
# Cargo.toml 依存関係
[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
Month 4+:unsafe、FFI、マクロ、最適化(さいてきか)
// unsafeブロック:必要な場合のみ使用
unsafe fn dangerous() {
// 生ポインタの逆参照など
}
// FFI:Cライブラリの呼び出し
extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
let result = unsafe { abs(-5) };
println!("絶対値: {}", result);
}
// 宣言的マクロ
macro_rules! vec_of_strings {
($($x:expr),*) => {
vec![$($x.to_string()),*]
};
}
fn demo() {
let names = vec_of_strings!["Alice", "Bob", "Charlie"];
println!("{:?}", names);
}
おすすめ学習リソース
無料リソース:
1. The Rust Programming Language(公式ブック)
- https://doc.rust-lang.org/book/
- 最も体系的な入門書
2. Rustlings(インタラクティブ演習)
- https://github.com/rust-lang/rustlings
- 小さな問題を解きながら学ぶ
3. Rust by Example
- https://doc.rust-lang.org/rust-by-example/
- 例題中心の学習
4. 100 Exercises To Learn Rust
- https://rust-exercises.com/
- 2024年公開の無料コース
5. Comprehensive Rust(Google)
- https://google.github.io/comprehensive-rust/
- Google内部教育資料の公開版
有料・上級リソース:
6. Programming Rust, 2nd Edition(O'Reilly)
7. Rust in Action(Manning)
8. Zero To Production In Rust(Webバックエンド特化)
現実的(げんじつてき)な学習時間の見積(みつ)もり
バックグラウンド別の予想学習期間:
- C/C++開発者: 2-3ヶ月(メモリモデルの理解が速い)
- Go開発者: 3-4ヶ月(所有権の概念への適応が必要)
- Java/C#開発者: 4-5ヶ月(GCのない環境への適応)
- Python/JS開発者: 5-6ヶ月(システムプログラミング+所有権)
- 最初のプログラミング言語: 推奨しません(先に他の言語を学びましょう)
5. Rustの課題(かだい)と41.6%の懸念(けねん)
Rustには利点だけがあるわけではありません。2025年のRust調査で明らかになった主要な懸念事項を見ていきましょう。
複雑性(ふくざつせい)増加への懸念(41.6%)
Rustユーザーの41.6%が「言語の複雑性増加」を懸念しています。Rustは各エディションで新機能が追加され、すべてを追いかけるのがますます難しくなっています。
主要懸念事項(2025年調査):
1. 複雑性の増加: 41.6%
2. 産業採用の不足: 42.1%
3. 学習曲線: (上位の不満事項)
4. コンパイル時間: (継続的な問題)
5. 不完全なツールサポート: (IDE、デバッガ)
学習曲線の現実
正直に言えば、Rustの学習曲線は急峻(きゅうしゅん)です。
所有権システム(2-4週間): 他の言語では全く経験したことのない概念です。「なぜこのコードがコンパイルされないのか?」という挫折を何度も経験することになります。
ライフタイム注釈(しゃくよう)(数ヶ月): 複雑なライフタイム関係を理解するには実際のプロジェクト経験が必要です。理論だけでは限界(げんかい)があります。
非同期プログラミング: Rustのasync/awaitは他の言語とは異なる動作をします。PinやFutureなどの概念が追加学習を要求します。
// Rustのasyncが複雑な理由を示す例
// 他の言語と異なり、async関数の戻り値の型が複雑になることがある
use std::future::Future;
fn make_request(url: &str) -> impl Future<Output = Result<String, reqwest::Error>> + '_ {
async move {
let response = reqwest::get(url).await?;
response.text().await
}
}
コンパイル時間の問題
大規模なRustプロジェクトではコンパイル時間が依然(いぜん)として痛みのポイントです。
プロジェクト規模別の概算コンパイル時間(クリーンビルド):
- 小規模(1万行): 10-30秒
- 中規模(10万行): 2-5分
- 大規模(50万行以上): 10-30分
改善方法:
- cargo checkの活用(型チェックのみ、コード生成省略)
- sccacheによるキャッシュ
- ワークスペースの分割
- インクリメンタルコンパイルの活用
- craneliftバックエンド(デバッグビルド)
エコシステムの成熟度(せいじゅくど)
Rustのエコシステムは急速に成長していますが、JavaやPythonと比較するとまだ不十分な領域があります。
成熟した領域:
- Webフレームワーク(Axum、Actix)
- シリアライゼーション(serde)
- HTTPクライアント(reqwest)
- CLIツール(clap)
- 非同期ランタイム(tokio)
成長中の領域:
- GUI(iced、egui - まだ初期段階)
- ORM(diesel、sea-orm - 発展中)
- エンタープライズパターン(Springのような統合フレームワーク不在)
- 機械学習(burn、candle - 初期段階)
人材不足(じんざいぶそく)
Rust開発者の採用は依然として困難(こんなん)です。需要に対して供給が不足しており、これは雇用市場(こようしじょう)では両刃(もろは)の剣(つるぎ)です。
Rust開発者市場:
- 需要: 急増(特にインフラ、セキュリティ分野)
- 供給: 不足(全開発者の少数派)
- 平均年収: 上位層(米国基準で約120-180K USD)
- 示唆: 学べば競争力が高まるが、チームビルディングは困難
6. GoからRustへ、C++からRustへ:マイグレーション戦略(せんりゃく)
システム全体を一度にRustで書き直すのは、ほぼ常に間違ったアプローチです。成功したチームは段階的(だんかいてき)なマイグレーション戦略を使用しています。
段階的マイグレーションの原則(げんそく)
1. FFI境界から始める
- 既存コードとRustをFFIで接続
- 最もリスクの高い部分(メモリ安全性の問題)からRustに転換
- パフォーマンスが重要なホットパスから開始
2. 新サービスはRustで作成
- 既存コードはそのまま維持
- 新しいマイクロサービスをRustで開始
- 段階的にRust領域を拡大
3. Strangler Figパターン
- 既存システムを包む新しいRust層を構築
- トラフィックを段階的に新しい層に移行
- 旧システムを段階的に廃止
GoからRustへのマイグレーション
Discordの事例をベースにした実践ガイド:
マイグレーションすべきタイミング:
- GC関連のレイテンシスパイクがビジネスに影響
- P99レイテンシ要件が非常に厳格
- メモリ使用量の最適化が必須
- 並行性バグによる障害の繰り返し
マイグレーションすべきでないタイミング:
- Goのパフォーマンスで十分な場合
- チームにRust経験が全くない場合
- 素早い開発速度が最優先の場合
- CRUD中心のビジネスロジック
// GoからRustへ:HTTPハンドラの比較
// Go版(参考用の擬似コード)
// func getUser(w http.ResponseWriter, r *http.Request) {
// id := r.URL.Query().Get("id")
// user, err := db.FindUser(id)
// if err != nil {
// http.Error(w, err.Error(), 500)
// return
// }
// json.NewEncoder(w).Encode(user)
// }
// Rust(Axum)版
use axum::{extract::Query, Json};
use serde::Deserialize;
#[derive(Deserialize)]
struct UserQuery {
id: String,
}
async fn get_user(Query(params): Query<UserQuery>) -> Result<Json<User>, AppError> {
let user = db::find_user(¶ms.id).await?;
Ok(Json(user))
}
C++からRustへのマイグレーション
段階的アプローチ:
ステップ1: Rustで新モジュールを作成、C++ FFIで接続
ステップ2: テストカバレッジの確保(既存C++コード)
ステップ3: 最もリスクの高いモジュールからRustにポーティング
ステップ4: 統合テストで動作検証
ステップ5: 段階的に拡大
FFIツール:
- cxx: C++とRust間の安全なFFI
- bindgen: C/C++ヘッダからRustバインディングを自動生成
- cbindgen: RustからC/C++ヘッダを生成
// cxxを使用したC++連携の例
#[cxx::bridge]
mod ffi {
// C++側が提供する関数
unsafe extern "C++" {
include!("legacy/include/processor.h");
fn process_legacy_data(input: &[u8]) -> Vec<u8>;
}
// Rust側が提供する関数
extern "Rust" {
fn validate_data(data: &[u8]) -> bool;
}
}
fn validate_data(data: &[u8]) -> bool {
// Rustの安全な検証ロジック
!data.is_empty() && data.len() < 1_000_000
}
マイグレーションチェックリスト
事前準備:
[ ] チーム内にRustチャンピオン1-2名を確保
[ ] パイロットプロジェクトで経験蓄積(2-3ヶ月)
[ ] 現在のシステムのパフォーマンスベースラインを測定
[ ] マイグレーション対象モジュールの優先順位選定
[ ] CI/CDパイプラインにRustビルドを追加
実行:
[ ] FFIインターフェースの設計
[ ] ユニットテストの作成(Rust側)
[ ] 統合テストの維持(既存テストスイート)
[ ] 段階的なトラフィック転換
[ ] パフォーマンスの監視と比較
事後:
[ ] パフォーマンス改善の測定と文書化
[ ] チーム教育資料の作成
[ ] 次のマイグレーション対象の選定
7. 2025年Rustエコシステムのハイライト
2025年のRustエコシステムで注目すべきプロジェクトとトレンドを整理します。
Webフレームワーク
Axum(tokioチーム開発):
- tokioエコシステムとの完璧な統合
- Towerミドルウェア互換
- 型安全なルーティング
- 2024-2025年最も急速に成長しているRust Webフレームワーク
Actix Web:
- 最高水準のベンチマークパフォーマンス
- 成熟したエコシステム
- 多数のエンタープライズ使用事例
Loco.rs:
- Ruby on Railsスタイルのオールインワンフレームワーク
- 2024年に登場、急速に成長中
- 開発生産性に焦点
ゲームとグラフィックス
Bevy:
- データ指向ゲームエンジン
- ECS(Entity Component System)アーキテクチャ
- 急速に成長するコミュニティ
- まだ1.0前だが注目度は高い
wgpu:
- WebGPU実装
- クロスプラットフォームGPUプログラミング
- Firefoxで使用
デスクトップアプリケーション
Tauri:
- Electronの代替
- Web技術(HTML/CSS/JS)+ Rustバックエンド
- はるかに小さいバイナリサイズ(Electron比10-100倍小さい)
- メモリ使用量の大幅削減
- v2.0リリースでモバイルサポート追加
Dioxus:
- ReactスタイルのRust UIフレームワーク
- Web、デスクトップ、モバイル対応
WebAssembly(WASM)
RustはWebAssemblyの最高のパートナーです。
// Rust -> WASMの例(wasm-bindgen使用)
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u64 {
match n {
0 => 0,
1 => 1,
_ => {
let mut a: u64 = 0;
let mut b: u64 = 1;
for _ in 2..=n {
let temp = b;
b = a + b;
a = temp;
}
b
}
}
}
// JavaScriptからの呼び出し:
// import { fibonacci } from './pkg/my_wasm';
// console.log(fibonacci(50));
Rust + WASMの使用事例:
- Figma: リアルタイムコラボレーションエディタのコアロジック
- Cloudflare Workers: エッジコンピューティング
- 1Password: ブラウザ拡張機能
- Amazon Prime Video: ビデオ処理
- AutoCAD: Web版のレンダリングエンジン
AI/MLエコシステム
burn:
- PyTorchスタイルのディープラーニングフレームワーク
- 多様なバックエンドサポート(GPU、CPU、WASM)
- 純粋なRust実装
candle(Hugging Face):
- 軽量ML推論フレームワーク
- LLM推論に特化
- Python依存なしでMLモデルを実行
ort:
- ONNX RuntimeのRustバインディング
- 学習済みモデルのプロダクションデプロイに適合
- 多様なハードウェアアクセラレーションサポート
linfa:
- scikit-learnスタイルの伝統的MLライブラリ
- クラスタリング、分類、回帰など
CLIツールエコシステム
Rustで作成されたCLIツールが従来のUnixツールを置き換えています。
従来のツール -> Rust代替:
grep -> ripgrep (rg)
find -> fd
cat -> bat
ls -> exa/eza
du -> dust
top -> bottom (btm)
sed -> sd
curl -> xh
diff -> delta
CLIライブラリ:
- clap: コマンドライン引数パース(デファクトスタンダード)
- ratatui: TUI(ターミナルUI)フレームワーク
- indicatif: プログレスバー
- dialoguer: 対話型プロンプト
Embedded / IoT
embassy:
- 非同期組み込みフレームワーク
- no_std環境でasync/awaitサポート
- STM32、nRF、RP2040等の多様なMCUサポート
esp-rs:
- ESP32ファミリーMCU用Rustサポート
- WiFi、Bluetooth対応
probe-rs:
- デバッグ/フラッシュツール
- ARM、RISC-Vサポート
実践クイズ
学んだ内容を確認しましょう。
Q1. Rustの所有権ルールで、1つの値に同時に存在できる所有者は最大何人ですか?
正解:1人
Rustの所有権システムでは、すべての値は正確に1つの所有者しか持てません。値を別の変数に代入すると所有権が移動(move)します。このルールがGCなしでメモリを安全に管理する核心メカニズムです。
Q2. DiscordがGoからRustにマイグレーションした主な理由は何ですか?
正解:GC(ガベージコレクタ)によるレイテンシスパイク
DiscordのRead Statesサービスで、GoのGCが周期的にレイテンシスパイクを引き起こしていました。Rustへのマイグレーション後、P99レイテンシが10倍改善され、GC関連のスパイクは完全に解消されました。
Q3. 次のRustコードでコンパイルエラーが発生する理由は何ですか?
let mut s = String::from("hello");
let r1 = &s;
let r2 = &mut s;
println!("{} {}", r1, r2);
正解:不変参照(r1)と可変参照(r2)を同時に持つことができない
Rustの借用ルールにより、不変参照が存在する間は可変参照を作成できません。このルールがデータ競合をコンパイル時に防止します。
Q4. AWSでLambdaとFargateを駆動するRustベースの技術の名前は?
正解:Firecracker
FirecrackerはAWSがRustで開発したマイクロVMモニタです。マイクロ秒単位の起動時間と最小限のメモリオーバーヘッドを提供し、AWS LambdaとFargateの基盤技術として使用されています。
Q5. Rustで所有権を移転せずに値を関数に渡すメカニズムを何と呼びますか?
正解:借用(Borrowing)
借用は参照(&)を通じて所有権を移転せずに値にアクセスするメカニズムです。不変借用(&T)は複数同時に可能で、可変借用(&mut T)は同時に1つだけ可能です。
参考資料(さんこうしりょう)
-
Rust Survey 2024 Results - The Rust Foundation
-
TIOBE Index - TIOBE Software
-
Stack Overflow Developer Survey 2024
-
Rust for Linux Project
-
Memory Safety in Android
-
AWS and Rust
-
Cloudflare Pingora
-
Discord Blog - Why Discord is switching from Go to Rust
-
The Rust Programming Language(公式ブック)
-
Rustlings
-
Comprehensive Rust by Google
-
Axum Web Framework
-
Tauri Framework
-
Bevy Game Engine
-
burn - Deep Learning Framework
-
candle - Hugging Face ML Framework
-
crates.io - Rust Package Registry
-
Are We Web Yet?
-
Rust Edition Guide