5分で学ぶ気になるプログラミング言語（Rust編）

※他の記事はこちらになります。あわせてご覧ください
[5分で学ぶ気になるプログラミング言語（Go編）](https://qiita.com/kansaizine/items/102033ffe5ceac3302cd)
[5分で学ぶ気になるプログラミング言語（Nim編）](https://qiita.com/kansaizine/items/58e694ea9c35686cfd39)

## 新しいプログラミング言語を学びたい！
プログラミング言語といえば、（個人的には）C言語に始まり、C++、VisualBasic、Java、Perl、PHP、JavaScript、Pythonなどなど、趣味や仕事で目的に合わせて色々と使ってきたわけですが、それぞれの言語においての進化には都度キャッチアップしていくものの、そういえば新しいプログラミング言語って久しく触れてないなぁと思い、学びたいという思いが強くなってきました。

ただ、そうはいってもしっかり学ぼうとするとそれなりの覚悟も時間も要ります。若い頃と違って、仕事が終わった後に残っている気力も限られています。それに、今まで使ってきた言語も特にしっかり評価して選択してきたわけではなく、フィーリングに合うものを使ってきたよなぁと考えると、「5分くらいでサッと体験してフィーリングが合うものを選べばいいんじゃないか？」という堕落した結論に至りましたｗ

5分というのは無茶な気もしますが、Webサイトに8秒ルールがある様に、人の興味を引き付けるために与えられる時間はそう多くはありませんから、結構現実的な時間ではないかと思います。

## 気になるプログラミング言語たち
自分の趣味領域や仕事領域に関連する技術情報は、他のエンジニアの皆さんと同じく日々アンテナを張っていますが、その中に「こんなプログラミング言語が開発されたよ！」「このプログラミング言語は面白いよ！」という記事なんかがあると特に興味をそそられます。今の時代のITの世界には専門分野がたくさんありますが、昔はやはりプログラマが花形でしたので、プログラミングやプログラミング言語には強い興味や憧れがあります。

日々流れてくる新しいプログラミング言語の情報から、私が気になったのは次の3つでした。

* Rust
* Go
* Nim

この3つのプログラミング言語について、それぞれ5分程度で学べる情報からフィーリングに合うものを選びたいと思います。

## 評価方法をどうするか
今回は5分という学習時間の制約がありますので、フィーリングで選ぶとはいえ評価軸についてはある程度決めておかないとブレが大きくなってしまいます。今回は次のようなポイントで学んでみたいと思います。

### 公式サイトから学ぶ
昔と違い、技術情報というのは様々なところで提供されています。このQiitaもそうですが、何かを調べる、学ぶ時にはそのキーワードを検索エンジンに渡して、提示された選択肢を辿って出来るだけ最短ルートを通る、というスタイルが一般的になったと思います。

ただし、それら散在した情報の真偽について判断できる能力も必要ですし、今回は5分しかありませんので筋の良くない情報にあたってしまったらタイムオーバーです。

そこで、今回は公式サイトにある情報、特にチュートリアルの様な学習コンテンツから学ぶということにします。現代のプログラミング言語であれば、高性能、高機能といった特徴の他に、学びやすいということも重要なポイントです。公式サイトで提供されている学習コンテンツの出来が良いということは、結果として多くのユーザーに支持されることに繋がるではないかと考えます。

現代は効率良く情報を仕入れて用いることが要求されている部分はありますが、それでも原典をあたるというのは非常に重要なことなのです。

### 分かりやすいこと
技術の世界には、難しいからこそ面白い、という考えがあります。私自身も賛同する部分はあるのですが、ことプログラミング言語においては「分かりやすい」ということは非常に重要だと考えます。

プログラミング言語の用途は、ある目的のためにソフトウェアを開発することにあります。そしてソフトウェア開発というのは殆どの場合複数人で行われ、ライフサイクルの中でその主体も受け継がれていきます。ソフトウェアの構造やソースコードの書き方もそうですが、言語そのものが「分かりやすい」という特性を持っていることで、長く安定して動作、メンテナンスされるソフトウェアが生まれる可能性も高くなるのではないかと考えています。

「分かりやすい」ってどういうことなの？という話はあるのですが、そこはうまく言語化してお伝えするのが難しいので、今回はフィーリングですｗ

### パッケージマネージャは使おう
現代はOSSと言えどもソースをビルドしてインストールすることはほぼありません。OSに付属するyumやaptや、Homebrew等のパッケージマネージャを用いることが殆どです。

新しい言語を試したい、となった場合も、個々のインストール方法を調べるのではなく、パッケージマネージャからインストールするという選択肢がファーストチョイスになると思いますので、環境の準備はパッケージマネージャを使うこととします。

## 5分で学ぶRust
それではまずは「Rust」を学んでいくこととします。

Rustの公式サイトのURLは [https://www.rust-lang.org/ja/](https://www.rust-lang.org/ja/) です。
うん、いいですね、実に分かりやすいドメイン名ですｗ こういうところも重要です。

![rust-top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157692/d8c00c51-f9c0-3ce8-e39d-d0b3ae6c5e9b.png)

ファーストビューでRustの特徴が語られています。
それによると、Rustは「効率的で信頼できるソフトウェアを誰もがつくれる言語」であり、「パフォーマンス」「信頼性」「生産性」に優れている言語の様です。これが具体的にどういうことなのかは、学習の過程で理解できてくるのだと思います。

Rustの公式サイトのトップページには「学ぶ」という名前のコンテンツがありますね。まずはこちらにアクセスしてみましょう。

![rust-hajimeyou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157692/8eb24282-41a6-e1c2-0e10-647165e7b8cf.png)

「Rustを始めよう」と題して、3つのコンテンツが用意されています。時間がないので概要文を5秒くらいで読んでみたところ、どうやら一番左の「THE BOOK」が目的には合っていそうです。ここは複数選択肢を準備するのは良いとしても「初めての方はこちら！」的に誘導した方がより親切ではないかな～と感じました。

![rust-thebook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157692/ac1fd923-1aee-adf9-0b71-d5f997015a6c.png)

ここまで日本語のコンテンツでしたが、THE BOOKは英語のコンテンツでした。非公式の日本語版コンテンツへのリンクもありましたが、今回は公式サイトの情報で学ぶと決めましたので、英語コンテンツで学びましょう。

ページ左に目次が表示されていますが、ここも3秒くらいで読み込んでみます。順番通り「1. Getting Started」から進めてみるのが良さそうです。それに、それ以降は多分5分には収まらないでしょう…。

最初に「1.1 Installation」を見てみましたが、こちらは言葉通りRustのインストール方法の紹介となっています。今回はパッケージマネージャを使うこととしていますから、既にパッケージマネージャを用いてRustをインストール済であるという前提でスキップします。

次に「1.2 Hello, World!」は、我々がこれまで幾度となく通過してきたコンテンツですね。RustのHello Worldはどんな書き方になるのでしょうか。

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

mainルーチンらしきものが定義されていますが、「fn」というのはおそらく「function」のことでしょう。簡潔に書けるのはよいですね。ブロックは波括弧で表すオーソドックスなタイプの様です。

次の「println!」ですが、「println」は他の言語でも見られるprint＋改行ということかなと思いますが、末尾にエクスクラメーションマークが付いています。これはPHPで関数呼び出し時に＠マークを付けるのと同じ様に、何らかの出力等を抑制する様なものでしょうか。

Hello, Worldのソースコードが書けましたので、こちらを実行してみましょう。

```bash
$ rustc main.rs
$ ./main
Hello, world!
```

rustcというコマンドにソースコード名を引数として渡しています。その後カレントディレクトリの「main」というファイルを直接実行すると「Hello, world!」と表示されています。

この内容で分かるのは、Rustはコンパイラ型言語であり、ターゲットOS上で実行できるバイナリを生成することが出来るということです。「rustc」とはおそらく「Rust Compiler」なのでしょう。Hello, World程度のプログラムをバイナリ化するメリットはほぼありませんが、PHPの様なインタプリタ型言語と異なり、バイナリを生成できることでアプリケーションの配布が容易になりますから、そういった用途・ニーズには適していると思います。

続いて「Anatomy of a Rust Program」ということで、先ほどのHello World!のソースコードとコンパイルに関する詳細な解説がありますが、今のところあまり疑問となる要素はないので読み飛ばします。

次は「1.3 Hello, Cargo!」ですが、Cargoとはなんでしょう？ その回答は直後に書かれていて、「Cargo is Rust’s build system and package manager.」とあります。Cargoを使うと、ビルドやパッケージ管理が簡単にできますよということなのでしょうね。

読み進めると、これらの使用例が紹介されています。

```bash
$ cargo new hello_cargo
$ cd hello_cargo
```
```bash
$ cargo build
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
```
```bash
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/hello_cargo`
Hello, world!
```

順に、プロジェクト作成、ビルド、実行、という処理をしていることが分かりますが、Laravelなんかでも同じような仕組みを持っていますよね。少ない手順を覚えるだけで開発作業を進めていけるので、効率よく進められそうです。

## 学べたこと
駆け足で学んできましたが、5分が過ぎてしまいました。でも5分という短い時間でもRustが持っている特徴のようなものは理解できたように思います。

今回はRustについて下記のことが分かりました。

### Rustはコンパイラ型言語である
Rustは、ソースコードを記述してそれをコンパイルして実行バイナリを生成する、コンパイラ型言語であることが分かりました。ソースコードを変更した場合は再ビルドが必要となりますが、実行バイナリをコピーすれば動作させられる可搬性があるのと、バイナリ化されることにより一定のソースコード秘匿性が得られるため、その様なユースケースにおいてはインタプリタ型言語と比較して優位性が高いと言えると思います。

### Rustはビルドシステムとパッケージマネージャを内包している
これはあまり珍しいものではありませんが、利用者の多い他の言語やフレームワークと同様に、Rustは専用のビルドシステムとパッケージマネージャを言語として持っています。言語には含まれず、別途アプリケーションとして配布されるケースも多くありますが、更新頻度やプロジェクトの継続性等の観点でやや不安は残りますので、言語としての配布に内包されているというのは安心できる要素だと思います。

### Rustは公式の学習コンテンツが充実している
今回は限られた時間の中で実際に参照したコンテンツは僅かでしたが、Rustの公式サイトには「学ぶ」と題したカテゴリが存在し、チュートリアルからリファレンスまで多くの学習コンテンツが提供されていました。基本的には英語のコンテンツとなりますので若干の英文リーディング力は必要となりますが、ブラウザの翻訳機能を活用することも出来ますので、大きな支障はないと思います。

## 次回
次回は、Googleが開発したGoを学んでみたいと思います。