【初心者向け🔰】Rust とは何か？概要とマシンへの導入方法

## 概要
執筆時現在、Rust は 2016〜2022 年の間 **Stack Overflow Developer Survey** アンケートで『最も愛されているプログラミング言語』で１位を獲得し続けている人気の言語です。一方で、Rust は **学習難度が高い** 言語とも考えられているようです。
そんな人気が出ているプログラミング言語 Rust について、初心者向けに概要と導入手順をざっくりとまとめてみました。

### 前提
- プログラミングの基礎的な用語（「コンパイル」など）は知っている前提
- 筆者のマシン環境は macOS
  - 導入手順については macOS を前提に記載

## Rust とは
**「Rust（ラスト）」** は、「錆（さび）」を意味する英語からきており、オープンソースライセンスで公開されている比較的新しいプログラミング言語です。
Mozilla の従業員のグレイドン・ホアレ（Graydon Hoare）氏の個人プロジェクトでしたが、2009年に Mozilla が開発に関わり始め、その後 Mozilla Research の公式プロジェクトになりました。

https://www.rust-lang.org/ja

### 特徴
最大の特徴は、以下の３つです。

- **高速**
  - ネイティブコンパイラ言語で、とにかく速い。実行時速度性能は C言語と同等程度
- **メモリ安全性**
  - 強力な型システムとリソース管理の仕組みにより、メモリ安全性が保証されている
- **安全な並行性**
  - 同時に複数のプログラムを並行処理するマルチスレッドに対応。複数スレッドの関数呼び出しによるデータ競合や「デッドロック」に陥ることがないように配慮されている

つまり、**「めっちゃ速くて、安全性も考えられた、OS とかも作れちゃう言語」** です。

### C 言語に代わる言語になるかも
「C言語、C++ に代わる **システムプログラミング言語**」を目指しているようです。

**システムプログラミング言語** とは、システムソフトウェアを書くために設計された言語で、アプリケーションソフトウェアを書くための **アプリケーションプログラミング言語** とは設計アプローチが異なります。

ここで言う **「システムソフトウェア」** とは、「OS」や「ユーティリティソフトウェア」、「デバイスドライバ」、「コンパイラ」、「リンカ」などです。つまり、ハードウェア寄りの処理を書くことを想定した言語ということですね。

通常のアプリケーションを書くことを想定したプログラミング言語は、それら OS などのプラットフォーム上で動作するアプリを書くのが主目的で開発されています（JavaScript など）。

システムプログラミング言語で代表的なのは、C++ や Swift が該当すると思います。

### ロボット開発への活用も期待
日本の会社が、Rust を用いた世界初のロボット開発用フレームワークを作っているようです。

https://presswalker.jp/press/11044

## Rust 書くとなったら必ず使うツール
Rust を使うとなったら、開発環境のためにいくつか必要なツールがあります。主に、**rustup, rustc, cargo** の３つです。

### rustup
Rust 言語自体のインストールはこれを使います。
また、他にも Rust 言語のバージョン管理、Rust のコンポーネント管理など、Rust 環境全体の管理に用います。

### rustc
コンパイラです。
Rust のソースコードで書かれたプログラムは、コンパイルすることでネイティブコードとなります。
開発作業の上では特に明示的に意識することはありませんが、念のために記載してみました。

### cargo
ビルドツール兼パッケージマネージャです。Rust のパッケージを管理する場合は基本的に `cargo` コマンドを使用します。
Python でいう `pip` コマンド、Ruby でいう `gem` コマンド（より厳密には `bundle` コマンド）と同様の立ち位置です。

尚、cargo でダウンロードするソースコードを管理しているレジストリサービスは **Crates.io** です。cargo コマンドを利用するとここからソースを取得します。

https://crates.io/

### パッケージ管理仕様の違い
**rustup** も **cargo** も Rust のパッケージ（ライブラリ）をダウンロードすることが可能です。
rustup の場合は `rustup component add`、cargo の場合は `cargo install` を使用します。

一見同じ処理をするコマンドに見えますが、以下の違いがあります。

- **rustup component add**
  - `https://static.rust-lang.org/dist/channel-rust-[toolchain].toml` からバイナリの状態でダウンロードします
  - クラウド上の Travis-CI でビルド後にダウンロードを試みます
  - しかし、ビルドに失敗するとダウンロードに失敗します 
- **cargo install**
  - Crates.io からソースコードの状態でダウンロードし、その後ローカルでビルドされます

どっちを使えば良いか？という疑問については、`rustup component add` がたまにビルドできずダウンロードに失敗することがあるため、基本は `cargo install` を使うのが良いと思います。

## Rust のインストール

### 導入済みか確認
そもそもインストールされているかの確認には以下のコマンドを利用します

```bash
rustc --version
```
または
```bash
rustc -V
```

この結果、`command not found: rustc` と怒られたらまたインストールされていません。既に入っている場合は何らかのバージョン情報（`rustc x.y.z (abcabcabc yyyy-mm-dd)` 形式）が表示されます。

### インストール
rustup をインストールします
```bash
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
```

インストールすると、ホームディレクトリ直下に `~/.cargo/bin` が生成され、ここに rustup、rustc、cargo 等がダウンロード・配置されます。

### バージョンアップ
既に Rust がインストールされている場合、最新版にアップデートするには以下のコマンドが使用できます。
```bash
rustup update
```

### 導入できたか確認
インストールに成功したかを確認する場合は、再び以下のコマンドで確認します。

```bash
rustc --version
```
または
```bash
rustc -V
```

成功すれば以下のサンプルのような表示が出てきます。
```bash
# 表示されるバージョン情報例
rustc 1.74.0 (79e9716c9 2023-11-13)
```

### アンインストール
使わないかもしれませんが、Rust をアンインストールしたい場合は、以下のコマンドを使用します。

```bash
rustup self uninstall
```

## 書き方・動かし方
実際に Rust で処理を書いて、走らせてみましょう。

### ファイルの作り方
ファイルは、拡張子 `.rs` で作成します。ファイル名に **複数単語** を用いる場合は「アンダースコア（`_`）」で区切ってください。

ファイルを作る前に、Rust のファイルが管理しやすいように **専用のプロジェクトディレクトリ** を作成してから、その中にファイルを作りましょう。

**ターミナル** で以下のようにプロジェクトとファイルを用意します（下記をコピペする場合、`$` マークは不要です）。
```bash
# プロジェクトディレクトリを用意
$ mkdir hello_world

# 作成したディレクトリに移動
$ cd hello_world

# ファイルを作成
$ touch hello_world.rs
```

### 関数の書き方
ファイルに関数を書いてみましょう。
Rust の **"Hello, world"** 標準出力のサンプルコードは以下の通りです。

```rust
fn main() {
    println!("Hello, world!");
}
```

関数定義は `fn`（function）で、関数名と、必要に応じて引数を指定でき、`println` で標準出力が可能です。
ファイルを指定したときに最初に呼ばれるのは `main` 関数なので、上記の様にエントリーポイントとして `main` を定義しましょう。

### コンパイルする
ソースコードが完成したら、コンパイルしてネイティブコードに変換します。
`hello_world.rs` ファイルが存在する階層で以下のコマンドを実行しましょう。

```bash
rustc hello_world.rs
```

実際にコンパイルに成功すると、以下のようにファイルが隣に生成されます。
下図は macOS でコンパイルした結果で、**「Unix実行ファイル」** という拡張子のないファイルが生成されたバイナリです。

![コンパイル後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/80e08bcf-4d91-e133-d66e-65ca9a172170.png)


### 処理を起動する
コンパイルが完了したら、プログラムを動かしましょう。拡張子を含まない「ファイル名」のみを指定すれば実行できます（`$` マークは実行には不要です）。

**macOS, Linux の場合**
```bash
# 実行コマンド
$ ./hello_world

# 実行結果
Hello, world!
```

**Windows の場合**
```bash
$ .\main.exe

# 実行結果
Hello, world!
```

"Rust を動かす" という基本についてはこれで完了です！

## リファレンス
Rust は、学習難度が高いと言われていたせいか、公式で勉強用や技術参照できるドキュメント類が結構揃っています。

### The Book（ザ・ブック）
Rust 言語の基本原理から全てを解説している詳細ドキュメント、通称 **「The Book（ザ・ブック）」** というものがあります。Rust の全てを理解したいマニアックな方はこちらをご覧ください。

- [英語の原文（公式）](https://doc.rust-lang.org/book/)
- [日本語翻訳版（非公式）](https://doc.rust-jp.rs/book-ja/)

「Rust のコレって言語としてどういう仕様なんだろう？」とかはここで確認できます。

正式な仕様ではないですが、[より詳細なリファレンス（英語）](https://doc.rust-lang.org/reference/index.html) もあります。
他にも、[cargo に関するブック（英語）](https://doc.rust-lang.org/cargo/index.html) や [rustc に関するブック（英語）](https://doc.rust-lang.org/rustc/index.html) 等もあります。

### Rust By Example
[Rust By Example](https://doc.rust-lang.org/rust-by-example/) は、「The Book のような大量のテキストを読むのは苦手だ！」という人のためのコード例を示した練習問題付きのハンズオン形式のリファレンスです。

### Rustlings コース
[Rustlings](https://github.com/rust-lang/rustlings/) は、コマンドライン上で、Rust のツールチェーンのダウンロードとセットアップ方法を確認しながら、Rust の構文の基本的な読み書きを学ぶ情報です。

### Playground
[Playground（プレイグラウンド）](https://play.rust-lang.org/) は Web ブラウザ上で Rust の動作確認が簡単にできる公式のツールです。

ソースコードを書いて「Run」を押すと処理結果などがすぐに確認ができるので、簡単な言語処理のチェックなどに利用できます。

![スクリーンショット 2024-03-12 1.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/34298a62-dd79-945f-0b7b-c3c2b25a5e18.png)

## まとめ
- Rust は以下の特徴を持つ、人気の言語である
  - 高速
  - メモリ安全性
  - 安全な並行性
- C 言語、C++ に代わるシステムプログラミング言語を目指している
  - ロボットのプログラムや OS とかも作れちゃう、ハードウェア寄りの言語
- 公式ドキュメントが結構揃っている
- 学習難度は高いが、非常に対応可能な範囲が広い言語

今回は単純な Rust 動作に関する概要説明にとどまりました。以降は、Cargo を使ったプロジェクト開発手順、フレームワーク「Tauri」を使ったデスクトップアプリ開発の手順なども記事を追加していきます 🙌✨