Rustを始めよう！入門編

# はじめに
今人気爆上げ中の言語、Rust。
今回は、Rust入門編ということで、Rustの特徴およびインストール方法についてまとめていこうと思います。

# 対象者
* Rustの特徴について知りたい人
* brewを使ってinstallしたい人

# Rust入門
## Rustとは何か？
* Rustは**システムプログラミング言語**であり、**C言語**と**Haskell**の特徴を持つ言語といえます。

* ちなみに、Mozillaが中心となりオープンソースで開発しました。

## システムプログラミング言語とは？
* コンピューターの**ハードウェアの操作や制御**のために設計されたソフトウェアで、アプリケーションソフトウェアを実行するためのプラットフォームを書くために設計されているような言語です。
* CPUやメモリなどの詳細な制御(例えば、メモリの領域を確保したり、メモリの割り当てを解放すること)が可能であることから、上記のようなことがいえます。


## Rustの特徴
* Rustは、コンパイル言語です。なので、Windowsですとexeファイルの作成ができます。
* ちなみに、プログラミング言語では、**コンパイル言語（静的プログラミング言語）**と**スクリプト言語（動的プログラミング言語）**があります。
* また、関数型言語のアイデアを多く取り入れていますが、関数型言語ではありません。


### 安全性
* Rustでは、Rust上に存在する**値**は**変数**に入れられ、その変数のことをその値の**所有者**と呼びます。
* 値の所有者になれる変数は、**ある期間(スコープ)**に一つのみです。
* 所有者である変数がスコープから外れた場合は、その値は利用できなくなります。
* また、Rustは**null安全な言語**です。


**→ その為、スコープを与えることにより、メモリリークやリソースリークのバグの多くをコンパイル時点で発見することができます。**

**→ さらに、所有者を決めることにより、複数箇所から同時にメモリを書き替えることができなくなります。こちらもコンパイラによってチェックされます。**

#### null安全とは？
null安全とは、null（nil, Noneなど）が原因で実行時エラーにならない仕組みです。

#### 他のコンパイル言語でのメモリ管理はどうなっていた？
* Javaなどでは、ガベージコレクションにより、自動で不要なメモリをかき集める仕組みがあります。
* C言語などでは、mallocやnewで動的に確保可能なメモリの領域(ヒープ)から領域を確保して、free,deleteで開放するようにしていました。


### 速度
* C言語やC++に匹敵する速度を持っているようです。(Rustでは、メモリ効率が高くランタイムやガベージコレクタがありません。)

### 並行性
* 所有者を決めるため、マルチスレッドでも安全に実行できます。


# インストール方法
* 最新のバージョンは、1.48.0(2020/12/28時点)です。[参照: Latest version](https://github.com/rust-lang/rust/releases/tag/1.48.0)
* install方法は[いろいろある](https://www.rust-lang.org/ja/tools/install)が、今回はbrewを用いてinstallしていきます。
* brewの場合だと、下記のコマンドを実行することでinstallできます。

```
brew install rust
```

* Rustのinstallが終わると、**rustcコマンド**が使えるようになります。
* **下記は実行結果です。**

```
❯ rustc
Usage: rustc [OPTIONS] INPUT

Options:
    -h, --help          Display this message
        --cfg SPEC      Configure the compilation environment
    -L [KIND=]PATH      Add a directory to the library search path. The
                        optional KIND can be one of dependency, crate, native,
                        framework, or all (the default).
    -l [KIND=]NAME      Link the generated crate(s) to the specified native
                        library NAME. The optional KIND can be one of
                        static, framework, or dylib (the default).
        --crate-type [bin|lib|rlib|dylib|cdylib|staticlib|proc-macro]
                        Comma separated list of types of crates
                        for the compiler to emit
        --crate-name NAME
                        Specify the name of the crate being built
        --edition 2015|2018
                        Specify which edition of the compiler to use when
                        compiling code.
        --emit [asm|llvm-bc|llvm-ir|obj|metadata|link|dep-info|mir]
                        Comma separated list of types of output for the
                        compiler to emit
        --print [crate-name|file-names|sysroot|target-libdir|cfg|target-list|target-cpus|target-features|relocation-models|code-models|tls-models|target-spec-json|native-static-libs]
                        Compiler information to print on stdout
    -g                  Equivalent to -C debuginfo=2
    -O                  Equivalent to -C opt-level=2
    -o FILENAME         Write output to <filename>
        --out-dir DIR   Write output to compiler-chosen filename in <dir>
        --explain OPT   Provide a detailed explanation of an error message
        --test          Build a test harness
        --target TARGET Target triple for which the code is compiled
    -W, --warn OPT      Set lint warnings
    -A, --allow OPT     Set lint allowed
    -D, --deny OPT      Set lint denied
    -F, --forbid OPT    Set lint forbidden
        --cap-lints LEVEL
                        Set the most restrictive lint level. More restrictive
                        lints are capped at this level
    -C, --codegen OPT[=VALUE]
                        Set a codegen option
    -V, --version       Print version info and exit
    -v, --verbose       Use verbose output

Additional help:
    -C help             Print codegen options
    -W help             Print 'lint' options and default settings
    --help -v           Print the full set of options rustc accepts
```

* versionを確認してみます。

```
❯ rustc --version
rustc 1.48.0
```

# まとめ
* 特徴を見てわかるように、C言語やC++を使っていた人が興味を持つのは間違いなさそうです。
* 次回は、公式のドキュメントの1章,3章当たりをやってみようと思います。

# 参考文献
* https://doc.rust-lang.org/book/ch00-00-introduction.html
* https://products.sint.co.jp/topsic/blog/rust-language-overview