2026/1/13
私の知り合いでRust言語を使っているやつをよく見かけるようになった。また、あるときにはC言語は悪いだのだめだのRustは安全だからいいのだの言ってくる。だが、本当に彼らはプログラミング言語の危険性というものを知っているのだろうか?正直、彼らにはうんざりしていて、私から見ればプライドが高くミーハーでマウントをとるのが大好きなしょうがないやつに見える。
Rustで書き直すべきとスパムのように言ってくる文化があるらしい。それをRIIR(Rewrite It In Rust)という。既存の安定して動いているC/C++プロジェクトに対し、コードも書かずに「Rustで書き直すべきだ」と言う風潮には、技術的な議論よりも思想の押し付けに近いものを感じる。こうした態度の背景には、「Rustは安全で、他は危険だ」という単純化された理解があるように見える。
さて、タイトルにもあるようにRust言語は補助輪付き自転車と同じである。なぜそれが言えるのか、理由は3つほどある。一つ目が所有権だ。所有権というものは、1つの値には同時に1人の所有者しか存在できない、という制約がある。また、所有者がスコープから外れたタイミングでその変数が破棄される。これがどういうものかソースコードを見て解説しよう。
fn main() {
let s1 = String::from("Hello");
let s2 = s1;
println!("{}, world!", s1);
}
このコードをコンパイルしようとするとエラーを吐く。これは所有権の概念を具現化したものだ。最初にs1に所有権があったが、s2にs1を代入した時点で所有権の移行が行われる。またこれがやっかいなことに関数にも適用される。
fn main() {
let s = String::from("hello");
foo(s);
println!("{}", s);
}
fn foo(s: String) {
}
このコードも同様にコンパイルエラーになる。なぜなら、foo関数でsを引数で渡した時点で所有権が移行するからだ。実体はヒープにあるにもかかわらず、あたかも変数そのものが所有権を持つかのような制約を強制する点が問題だ。かえってプログラミングのストレスにもなるしアセンブリ単位で考えることも困難になるからだ。
ここまで来てわかるように、所有権というものは無駄な概念であることが容易に理解できるであろう。
さて、次は2つ目の理由について説明しよう。2つ目はボローチェッカーだ。ボローチェッカーはコード全体を解析し、不正な参照やライフタイム違反をコンパイル時に排除する仕組みだ。言わば静的に強制されるメモリ安全性であり、実行時GCとは性質が異なる。Rustのコンパイル時間が長い理由は複数あるが、ボローチェッカーによる全体解析がその一因であることは否定できない。安全性を優先する設計思想としては理解できるものの、その代償として開発効率が犠牲になっている場面も少なくない。
そして3つ目の理由はunsafeだ。最近Rust言語を使用したのにもかかわらず脆弱性が報告された。どうやらunsafeの中で起きたものらしい。私の知り合いは、unsafeだからしょうがないとか言っていたがしょうがなくはない。彼らはunsafeの最も恐るべき問題を全く理解していないからだ。どういうことかというと、Rustでもアセンブリを書くことはできるが、それは言語が保証する安全性の外に出る行為であり、必然的にunsafeを伴う。もし、アセンブリで書かれたコードに脆弱性があったとして、それを見つけるのがとても困難だからだ。
結局のところ、Rustが悪いと言いたいわけではない。Rustは確かに安全に走るためのよくできた自転車だし、補助輪が必要な場面もある。しかし、補助輪が付いているからといって、それが自転車の本質を理解したことにはならない。
本当に危険性を理解しているのであれば、CもRustも、unsafeもアセンブリも、それぞれの責任と限界を踏まえて使い分けるはずだ。にもかかわらず、言語の機能を自分の能力と取り違え、他人を見下すための道具にしてしまうのは、あまりにも浅い。
Rustは補助輪付き自転車として優秀だ。だが、補助輪に守られているうちは、なぜ転ばないのか、転ぶとはどういうことか、を理解したことにはならない。それを理解してこそ、初めてプログラマだと私は思う。