Rust という言語に対するイメージ
- 低レイヤーの言語難しそう。
- C言語みたいに環境構築大変そう。
- コード複雑そう。
本記事では、こうしたイメージをできるだけ取り除きつつ、
Rust を知らない人でも「なるほど」「ちょっと触ってみたい」と思えるように、
Rust の特徴と良さを解説します。
(書き慣れていない部分もあるかもしれませんが、ご容赦ください)
Rust はどんな言語か
Rust はよく次のように表現されます。
「C レベルの実行速度と、Java レベルの安全性を両立させようとした言語」
発想自体は誰でも思いつきそうですが、
それを実用レベルで成立させた点が Rust の最大の特徴です。
言語設計の思想
ここで一度、比較対象として挙げられがちな言語を簡単に整理します。
C言語
コンピューターを直接操作可能にした言語。
- メモリやポインタを直接操作できる
- 実行時のオーバーヘッドがほぼなく非常に高速
その代わり、
- メモリ安全
- 型安全
- 実行時チェック
これらの責任を開発者に丸投げ...
「メモリ安全?型安全?実行時チェック?プロなら失敗しないでしょ?」
これによって高速、だけど直接操作ミスると大変!
Java
ランタイムでガチガチに守ってくれる言語。
- 実行時にランタイムが厳密にチェック
- ヌル参照や型の不整合を防ぎやすい
- その分、ランタイムのコストが発生する
「人間は失敗するよね。だから全部見るよ。危なかったら止めるよ。」
全部監視して守ってくれる。だけど実行も遅い。
Rust
Rust はこの両者の間に立つ設計をしています。
- 安全性の検査をすべてコンパイル時に行う
- 危険なコードは「動く前に」拒否する
- 実行時の安全チェックがほぼ不要なため高速
コンパイラで全部検査してミスのないコードのみ許す言語。
「人間は失敗します。なのでコンパイラの私が失敗しないプロになります。」
この思想が Rust の根幹です。
文化
Rust を語る上で、文化の話は避けられません。
よく言われるフレーズがこれです。
「コンパイラは敵ではない。最高のレビューアだ」
最初は実感しづらいですが、Rust には Clippy という公式の静的解析リンターが存在します。
コンパイルは通っても、Clippy がこう指摘します。
if x == true { ... }
Clippy:それif x {}で十分です。
for i in 0..vec.len() {
println!("{}", vec[i]);
}
Clippy:テレータを使った方が安全で読みやすいです。
このように、「動くかどうか」ではなく「Rust らしいかどうか」 まで見てくれます。
Clippy の立ち位置
Rust 界隈では、だいたい次のような共通認識があります。
- 「Clippyが通る」 = 最低限の礼儀
- 「Clippyに怒られない」 = きれいなコード
Rust は低レイヤー言語であり、書き方の自由度が高い分、
放っておくとコードの品質にばらつきが出やすいです。
そこで Clippy を相棒としてコードを磨いていく、
というのが Rust の開発スタイルです。
文化をまとめると次のようになります。
- コンパイラは敵ではなく、レビューア
- Clippy に指摘されるのは悪いことではない
- 「動けばOK」ではなく「破綻しないこと」が正義
まぁ、なんというか、こんな感じでかなり思想の強い言語です。
開発体験について
思想の話だけではイメージしづらいので、
最小限の開発手順を紹介します。
環境構築
Rust には Cargo というパッケージ管理・ビルドツールが標準で付属しています。
Python の pip、Node.js の npm に近い存在です。
インストールはRustupを使うだけです。
- 公式サイトからインストーラを実行
- 追加設定ほぼ不要
低レイヤー言語としては、かなり簡単な部類です。
プロジェクト作成
Cargo を使えば、プロジェクト作成も一発です。
cargo init
すると、すでに Hello, World! が用意された状態になります。
// main.rs
fn main() {
println!("Hello, World!");
}
この時点で
- ビルド
- 実行
- 依存管理
すべてが揃っています。
まとめ
Rust は
- 低レイヤーだが、安全性を妥協しない
- コンパイラとツールが開発者を支える
- 書くほどに「考え方」が身につく
そんな言語です。
少しでも興味を持ったなら、
まずは cargo init して触ってみるのがおすすめです。
「難しそう」という印象は、
実際に触ると意外と変わるかもしれません。
皆さんも一緒に Clippy に怒られましょう!
この記事の所有権は私にあります。
無断で可変参照を取らないでください。