なぜRustを選ぶのか
はじめに
この記事を書いた目的としては、現在インターン先で使っている言語でRustを扱っていて、そもそもなぜRustなのか?私の中で理解が落とし込めてなかったのでこの記事でまとめようと思い書くことにしました。
Rustの概要
Rustは、安全性、速度、並行性を重視して設計された、比較的新しいシステムプログラミング言語であり、近年ウェブ開発の分野で注目を集めています。 その性能と信頼性から、特に高いパフォーマンスが要求されるアプリケーションにおいて、その採用が拡大しています。
以下では簡単な例を出してみようと思います。
安全性
Rustでは所有権システムによって、Use After Freeや二重解放などのバグを防ぎます。
例:所有権と借用の仕組み
fn main() {
let s1 = String::from("hello");
let s2 = s1; // 所有権がs2に移る(s1はもう使えない)
// println!("{}", s1); // コンパイルエラー!s1の所有権はすでにs2に移動
println!("{}", s2);
}
この例では、s1の所有権がs2に移ったため、s1を使おうとするとコンパイルエラーになります。これがUse After Freeを防ぐ仕組みです。
fn main() {
let s = String::from("hello");
print_string(&s); // 借用しているだけなのでsは使える
println!("{}", s); // OK!
}
fn print_string(s: &String) {
println!("{}", s);
}
ここでは参照(&)を使って借用しているため、所有権は移動せず、呼び出し元でも変数sを安全に使えます
速度
Rustはガベージコレクタなしでメモリ管理を行います。C/C++のように低レベルの最適化が可能です。
例:明示的なメモリ管理を活かした高速処理
fn sum_array(arr: &[i32]) -> i32 {
arr.iter().sum()
}
fn main() {
let data = vec![1, 2, 3, 4, 5];
let total = sum_array(&data);
println!("合計: {}", total);
}
このコードでは、スライス(&[i32])を使って無駄なコピーを避けることができ、高速かつメモリ効率が良い処理を行っています。Rustのゼロコスト抽象化の例でもあります。
並行性
Rustではスレッド間のデータ共有も所有権や借用のルールによって安全に扱えます。
例:スレッドとArc + Mutexで安全に共有
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("最終カウント: {}", *counter.lock().unwrap());
}
このコードでは、複数スレッドから安全に共有カウンターにアクセスできるように、Arc(共有スマートポインタ)とMutex(排他制御)を使用しています。
Rustはこのような並行処理でもデータ競合をコンパイル時にチェックし、スレッドセーフなコードのみを許可します。
Rustのユースケース
パフォーマンス重視のバックエンド開発
Rustは、非同期処理やメモリ安全性に優れており、高速で信頼性の高いバックエンドシステムの構築に適しています。たとえば、GitHubのコード検索機能のバックエンドにはRustが採用されています。
オペレーティングシステム(OS)や組み込みシステムの開発
Rustは、低レベルのシステムプログラミングにも適しており、独自のOSや組み込みシステムの開発に利用されています。たとえば、Redox OSやGoogleのFuchsia OSなどがRustで開発されています。
Webアプリケーション開発
Rustは、Webアプリケーションの開発にも活用されています。特に、AxumなどのWebフレームワークを使用することで、安全で高速なWebアプリケーションを構築できます。
ブロックチェーンと暗号通貨
Rustは、ブロックチェーン技術の開発にも適しており、Polkadotなどのプロジェクトで採用されています。Rustの安全性とパフォーマンスが、分散型ネットワークの構築に貢献しています。
コマンドラインツール(CLI)の開発
Rustは、軽量で高速なコマンドラインツールの開発にも適しています。たとえば、clapやdialoguerなどのクレートを使用することで、効率的なCLIツールを構築できます。
最後に
今回は簡単にRustについて触れてみました。今後もRustに関する記事を投稿していこうと思います。
次回の記事は、Rustの非同期プログラミングが難しかったのでそれについて深堀していきたいです。
Discussion