Rustをやりませんか？

この記事は[富士通システムズウェブテクノロジー Advent Calendar](https://qiita.com/advent-calendar/2019/fsweb)の21日目の記事です。
本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。
ここまでお約束

#はじめに
この記事では、[Rust](https://www.rust-lang.org/)について勉強したこと思ったことを記載しています。

ちなみに私は、Rustについて、超初心者です。そんな私が、なぜRustについて記事を書こうかと思ったのかというと **面白そうだったから！！！** それだけです。
※モチベーションはこれぐらいがちょうどいいと個人的には思ってます。

#Rustとは何か

Mozillaが支援しているオープンソースのプログラミング言語です。Rustの1.0版は、2015年にリリースされており、比較的新しい言語です。CやC++の置き換え先として注目されています。

動作環境は、WindowsやLinuxなど主要なOSに対応してます。対応環境については、[こちら](https://forge.rust-lang.org/release/platform-support.html) にまとまって記載されています。サポートレベルによって、Tierが分かれています。Tier1を使っておけば、大丈夫。

#Rustの特徴

個人的に気になった特徴をピックアップして記載します。
※以下に挙げた特徴以外にも、沢山の特徴があります。

• 愛されている
• 処理速度
• 安全性

## 愛されている

Stack Overflow Developer Surveyで「最も愛されているプログラミング言語」の1位を2016〜2019年の間獲得しています。コミュニティに愛されてることは大事。
ちなみに、2019年の「最も愛されているプログラミング言語」の2位は、Pythonになります。(https://insights.stackoverflow.com/survey/2019)


## 処理速度

処理速度は、C、C++に匹敵するほど高速です。Rustは、CやC++と同様に事前にマシンコードにコンパイルした実行ファイルを実行します。そのため、JavaやC#などと異なりバイトコードをマシンコードに変換する処理が無いため高速に動作します。
また、メモリ管理方法として、寿命や借用といった概念を取り入れることで安全かつガベージコレクションが不要なランタイムを実現しました。
※ガベージコレクションを搭載する言語は、メモリ管理をランタイムが管理するため、ランタイム自体が複雑になる点やガベージコレクションの発生時に処理が一時的に停止するというようなオーバーヘッドが発生します。

## 安全性

Rustは、型安全(Type Safety)とメモリ安全性の性質を持った言語です。
型安全というのは、型が正しいと判断されたプログラムは、プログラミング言語が定義していない動作をすることが無いと保証するものです。
メモリ安全性とは、プログラムが不正なメモリ操作をしないことをプログラミング言語の処理系が保証するものです。
これらの言語処理系で設計された機能によって、実装者はコンパイルエラーが無いソースコードを書くだけでCやC++よりもセキュアなソースコードを作成することができます。

# インストールとHello world

実際に[ドキュメント](https://doc.rust-jp.rs/book/second-edition/foreword.html)に従ってインストールして、Hello worldを実行してみます。

## 環境情報

以下の環境でセットアップを実施しました。
- Ubuntu 16.0.4(64bit)

## インストール手順

1. インストールコマンドを実行します。
`curl https://sh.rustup.rs -sSf | sh`を実行します。
![Screenshot_2019-12-21-19-25-42-77_f774aa5585a195f34ccb87d5bbf80d61-01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533559/669921d9-d731-b7e3-2b44-9044ff495efb.jpeg)

1. メッセージを読んで、指示に従ってマシンを再起動します。

1. Rustがインストールされていることを確認します。`rustc --version`を実行します。
![Screenshot_2019-12-21-19-51-37-14_f774aa5585a195f34ccb87d5bbf80d61-01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533559/4fd95e75-fc22-6d97-e9d5-39e65bf210f2.jpeg)


## Hello worldの作成(cargo使用)

1. cargoがインストールされているか確認します。cargoとは、Rust用のプロジェクト管理ツールです。`cargo --version`を実行して、インストールを確認します。
![Screenshot_2019-12-21-20-06-32-14_f774aa5585a195f34ccb87d5bbf80d61-01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533559/15b54cb6-00f8-be90-1161-0650ff04e739.jpeg)
1. cargoを使用してプロジェクトを作成します。 `cargo new hello_cargo --bin`を実行します。
![Screenshot_2019-12-21-20-12-41-26_f774aa5585a195f34ccb87d5bbf80d61-01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533559/834b016d-6d52-b0e3-7a5f-d6c6633a101c.jpeg)

1. 作成されたmain.rsを確認します。

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

3. `cargo build`を実行して、ビルドします。
![Screenshot_2019-12-21-20-37-17-89_f774aa5585a195f34ccb87d5bbf80d61-01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533559/3422fa75-2a1a-32ba-d90a-a9cf1f036c18.jpeg)

4. distフォルダが作成されているので、その中の`hello_cargo`を実行します。
![Screenshot_2019-12-21-20-40-22-08_f774aa5585a195f34ccb87d5bbf80d61-01.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533559/e6faa6eb-d8de-9047-2b83-e1e463f845f8.jpeg)


#おまけ Rustを使ったツールの紹介

## ripgrep(grepツール)

インストールすれば、無条件で幸せになれる高速なgrepツール。公式は[こちら](https://github.com/BurntSushi/ripgrep)

#終わりに

初めて記事投稿しました。やってみると意外と楽しくて食わず嫌いは駄目だなーと実感しました。他にも色々書きたかったが、ここでタイムアップ。この記事を読んで、少しでもRustに興味を持っていただければ幸いです。
今後は、RustとGraphQL、WebAssemblyの勉強をしていきたいと思います。

今回の記事は全てスマートフォンから作成しました。また、開発環境やソースコードもスマートフォンから作成しています。PCで見ると画像が縦長で見辛いかも…