|
| 1 | +# 第1章:Rustの世界へようこそ |
| 2 | + |
| 3 | +Rustは、Mozillaによって開始され、現在はRust Foundationによって管理されているオープンソースのシステムプログラミング言語です。Stack OverflowのDeveloper Surveyで長年「最も愛されている言語」に選ばれ続けているのには理由があります。 |
| 4 | + |
| 5 | +## Rustの特徴:なぜ学ぶのか? |
| 6 | + |
| 7 | +経験豊富なプログラマにとって、Rustは「トレードオフを解消する」言語として映るはずです。 |
| 8 | + |
| 9 | +### 1\. メモリ安全性(Memory Safety) |
| 10 | + |
| 11 | +C/C++ではプログラマの責任であったメモリ管理を、Rustは**所有権(Ownership)**というコンパイル時のシステムで保証します。 |
| 12 | + |
| 13 | + * ガベージコレクタ(GC)は**存在しません**。 |
| 14 | + * ランタイムコストなしに、ダングリングポインタや二重解放、バッファオーバーフローをコンパイル段階で防ぎます。 |
| 15 | + |
| 16 | +### 2\. ゼロコスト抽象化(Zero-cost Abstractions) |
| 17 | + |
| 18 | +「使わないものにはコストを払わない。使うものについては、手書きのコード以上のコストをかけない」というC++の哲学を継承しています。イテレータや高階関数を使っても、最適化された低レベルコードと同等のパフォーマンスが得られます。 |
| 19 | + |
| 20 | +### 3\. 安全な並行性(Fearless Concurrency) |
| 21 | + |
| 22 | +多くの言語で並行処理はバグの温床(データ競合など)ですが、Rustではコンパイラがデータ競合を検知し、コンパイルエラーとして報告します。「コンパイルが通れば、並行性のバグを含んでいる可能性は低い」という安心感を持ってコーディングできます。 |
| 23 | + |
| 24 | +## 開発環境の構築 |
| 25 | + |
| 26 | +Rustの開発環境は非常にモダンで、バージョン管理やパッケージ管理が統合されています。 |
| 27 | + |
| 28 | +### `rustup` のインストール |
| 29 | + |
| 30 | +Rustのバージョンマネージャである `rustup` を使用してインストールするのが標準的です。 |
| 31 | + |
| 32 | +macOS / Linux / WSL (Windows Subsystem for Linux) の場合: |
| 33 | + |
| 34 | +```bash |
| 35 | +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
| 36 | +``` |
| 37 | + |
| 38 | +Windowsの場合: |
| 39 | +公式サイト(rust-lang.org)から `rustup-init.exe` をダウンロードして実行します(C++ビルドツールが必要になる場合があります)。 |
| 40 | + |
| 41 | +インストール後、以下のコマンドでバージョンが表示されれば成功です。 |
| 42 | + |
| 43 | +```bash |
| 44 | +rustc --version |
| 45 | +cargo --version |
| 46 | +``` |
| 47 | + |
| 48 | +## Hello World (`rustc` を直接使う) |
| 49 | + |
| 50 | +まずは、ビルドシステムを使わずにコンパイラ `rustc` を直接叩いて、Rustプログラムの最小単位を見てみましょう。 |
| 51 | + |
| 52 | +以下のコードを記述します。 |
| 53 | + |
| 54 | +```rust:hello.rs |
| 55 | +fn main() { |
| 56 | + // !がついているのは関数ではなく「マクロ」の呼び出しです |
| 57 | + println!("Hello, world from rustc!"); |
| 58 | +} |
| 59 | +``` |
| 60 | + |
| 61 | +コンパイルと実行は以下の手順で行います。 |
| 62 | + |
| 63 | +1. コンパイル: `rustc hello.rs` |
| 64 | + * これにより、バイナリファイル(Windowsなら`.exe`)が生成されます。 |
| 65 | +2. 実行: `./hello` (Windowsなら `.\hello.exe`) |
| 66 | + |
| 67 | +<!-- end list --> |
| 68 | + |
| 69 | +```rust-exec:hello.rs |
| 70 | +Hello, world from rustc! |
| 71 | +``` |
| 72 | + |
| 73 | +### ポイント |
| 74 | + |
| 75 | + * **`fn main() { ... }`**: エントリポイントです。引数や戻り値がない場合、このように記述します。 |
| 76 | + * **`println!`**: 末尾に `!` がついているのは**マクロ**であることを示しています。Rustでは可変長引数を取る機能などをマクロとして実装しています。 |
| 77 | + * **セミコロン `;`**: 文の終わりには必須です。 |
| 78 | + |
| 79 | +## Cargo:Rustのビルドシステムとパッケージマネージャ |
| 80 | + |
| 81 | +実際の開発では `rustc` を直接使うことは稀です。公式のビルドシステム兼パッケージマネージャである **Cargo** を使用します。Node.jsにおける `npm`、Pythonにおける `pip` + `venv` のような存在ですが、それ以上にプロジェクトのライフサイクル全体を管理します。 |
| 82 | + |
| 83 | +### プロジェクトの作成 (`cargo new`) |
| 84 | + |
| 85 | +新しいプロジェクトを作成します。 |
| 86 | + |
| 87 | +```bash |
| 88 | +cargo new hello_cargo |
| 89 | +cd hello_cargo |
| 90 | +``` |
| 91 | + |
| 92 | +このコマンドにより、以下のディレクトリ構造が生成されます。 |
| 93 | + |
| 94 | + * **`Cargo.toml`**: パッケージのマニフェストファイル(依存関係やメタデータを記述)。 |
| 95 | + * **`src/main.rs`**: ソースコード。 |
| 96 | + * **`.gitignore`**: Gitの設定ファイルも自動生成されます。 |
| 97 | + |
| 98 | +### Cargoの主要コマンド |
| 99 | + |
| 100 | +生成されたプロジェクトで、以下のコマンドを試してみましょう。 |
| 101 | + |
| 102 | +1. **`cargo check`** |
| 103 | + |
| 104 | + * **重要**: コンパイルが可能かどうかのチェックだけを行い、実行ファイルは生成しません。高速に動作するため、コーディング中の構文チェックとして頻繁に使用します。 |
| 105 | + |
| 106 | +2. **`cargo build`** |
| 107 | + |
| 108 | + * デバッグビルドを行います。成果物は `target/debug/` に生成されます。コンパイル速度重視で、最適化は行われません。 |
| 109 | + |
| 110 | +3. **`cargo run`** |
| 111 | + |
| 112 | + * ビルドと実行を一度に行います。開発中はこれが最も使われます。 |
| 113 | + |
| 114 | +4. **`cargo build --release`** |
| 115 | + |
| 116 | + * リリースビルドを行います。`target/release/` に生成されます。コンパイル時間は長くなりますが、強力な最適化がかかり、実行速度が劇的に向上します。 |
| 117 | + |
| 118 | +`src/main.rs` の中身は以下のようになっています(生成時デフォルト)。 |
| 119 | + |
| 120 | +```rust |
| 121 | +fn main() { |
| 122 | + println!("Hello, world!"); |
| 123 | +} |
| 124 | +``` |
| 125 | + |
| 126 | +## フォーマッタとリンタ |
| 127 | + |
| 128 | +Rustは「公式のスタイル」を重視する言語です。議論の余地をなくすために強力なツールが標準で用意されています。 |
| 129 | + |
| 130 | +### `rustfmt` (コードフォーマッタ) |
| 131 | + |
| 132 | +Go言語の `gofmt` のように、コードを自動整形します。 |
| 133 | + |
| 134 | +```bash |
| 135 | +cargo fmt |
| 136 | +``` |
| 137 | + |
| 138 | +多くのエディタ(VS Codeなど)では保存時に自動実行されるよう設定するのが一般的です。 |
| 139 | + |
| 140 | +### `clippy` (リンタ) |
| 141 | + |
| 142 | +単なるスタイルチェックだけでなく、パフォーマンスの改善案や、Rustらしい書き方(Idiomatic Rust)を提案してくれます。 |
| 143 | + |
| 144 | +```bash |
| 145 | +cargo clippy |
| 146 | +``` |
| 147 | + |
| 148 | +例えば、無駄な計算や非推奨なAPIの使用などを指摘してくれるため、学習中はこのコマンドの警告に従うだけでRustの理解が深まります。 |
0 commit comments