Rustに入門した。

# まだRustで消耗してないの
Rustに関しての個人的なメモです。

# Rust?
- 速度、並行性、安全性を言語仕様として保証するC言語、C++に代わるシステムプログラミングを目指して開発されている。2006年に開発がスタート、2015年に1.0版がリリース。現在、1.37.0版。

- 手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなどの実装手法をサポートしているマルチパラダイムプログラミング言語。

- 2016年、2017年、2018年のStackOverflowDeveloperSurveyで「最も愛されているプログラミング言語」で一位。


## 特徴
### パフォーマンス
C/C++と張り合える速度

### 信頼性
強い静的型付けと所有権システムによるメモリとスレッド安全性の確保。

### 生産性
豊富なドキュメントと、便利なエラーメッセージーを備えたフレンドリー??なコンパイラー

標準で搭載されてるパッケージ管理ツール、ビルドツール、フォーマッティングツールなど。

参照：[Rust公式](https://www.rust-lang.org)


## Use Case(こんなとこで使われてるよ)

### CLIツール

コンパイラーで各OSに適したフォーマットに出力できる。

### マシンリソースの少ないデバイスへの組み込み

低レイヤーのコントロールで少ないリソースでも効率よく動くプログラムを書ける

### WebAssembly

WebAssemblyがコンパイルターゲットに組み込まれたLLVM基盤のコンパイラーを使用しているので、WebAssemblyにコンパイルが可能。ガベージコレクションを搭載している言語よりサイズの小さい.wasmファイルを出力できる。

### ネットワークサービス

安全と並行性に優れているので、ネットワーク通信を制御するサービスを作るのに優れている。


## Examples
- DropBox
- FireFox
- [npm](https://www.rust-lang.org/static/pdfs/Rust-npm-Whitepaper.pdf)
- CloudFlare
- Polkadot
- TenX
- Libra
- VoyageGroup
- [cookpad](https://webcache.googleusercontent.com/search?q=cache:XbSpMeHLL5cJ:https://logmi.jp/tech/articles/282807+&cd=1&hl=ja&ct=clnk&gl=jp&client=safari)

[Rust production](https://www.rust-lang.org/production)
[rustの本番での採用事例リンク集](https://qiita.com/hadashiA/items/3dec1713bd999b38e848)

## 最近どうなの？

ついこの間、１年に一回のカンファレンスがあった。

[https://rustconf.com](https://rustconf.com)

### Rustのロードマップ

2018年は”生産性”がテーマ。今年は"成熟"らしい。

[Overview](https://rocket.rs/v0.4/overview/)

[Rust's 2019 roadmap | Rust Blog](https://blog.rust-lang.org/2019/04/23/roadmap.html)


## 多言語と比べた時にRustを選ぶ理由

- C/C++並の実行速度を実現しつつ、同じように低レイヤーのプログラミングが出来るが、安全も確保出来る。
    - 大いなる力には大いなる責任が伴うわけですが、コンパイラが一緒に戦ってくれる

- GolangはGoogleの言語
    - Golangなんかは同じ時期に開発されたことでよく比較に出されるわけですが、言語そのものの開発スタイルから違うぞ
    - [Go is Google's language, not ours | Hacker News](https://news.ycombinator.com/item?id=19978200)

    - [Chris's Wiki :: blog/programming/GoIsGooglesLanguage](https://utcc.utoronto.ca/~cks/space/blog/programming/GoIsGooglesLanguage)

- C/C++を置き換えるぞっていうところだとNimっていう奴もいるらしいけど開発コミュニティが貧弱。
    - 最近1.0.0がリリースされた。

    - [Nim Programming Language](https://nim-lang.org)

- Rustは次のJavaScript??

  - [Moving from NodeJS to Rust in 2019](https://blog.usejournal.com/moving-from-nodejs-to-rust-in-2019-62c0b85d2fa7)


## Web Applicationとか作れるフレームワークあるの？

バックエンドをRustで書くだけでなく、Wasm使えばフロントエンドもRustで書けちゃう💕

#### Web API
 - [Rocket](https://rocket.rs) 
    - たぶん一番popular
 - [Gotham](https://gotham.rs) 
    - マルチスレッド、並行処理にフォーカス
 - [iron](https://github.com/iron/iron)
    -  昔からあるやつ

#### ORM
- [diesel-rs/diesel](https://github.com/diesel-rs/diesel)
 - railsのコミッターが作ってるらしい

#### Frontend
- [yew](https://github.com/yewstack/yew)
    - Elm（GUI構築のための純粋関数型言語）とReactにインスパイアされたマルチスレッドのフロントエンドアプリケーションを構築するためのフレームワーク。WebAssemblyで書く。JSX likeな記法を使用可能。
- [seed](https://seed-rs.org)
    - yewよりもうちょっと軽量？


## まとめ

- rustupとかcargoとか基礎の基礎のエコシステムの使い方はわかりました。（借用システムとか型がどれだけ強いのかとかはまだ全然理解出来てないですｗ）
- WebAssembly周りはもっと良くわからない。
    - 現状Domとかは触れないので、そういう事するためにはJavascriptをラップしたライブラリを使う必要がある。
    - JSとやり取りする回数が多ければ多いほどオーバーヘッドが発生する？
- Web用のフレームワークは色々出てきてるけど、まだまだ未成熟。
    - Rust開発チームの方針的にも、組み込みライブラリとしてフルのHTTPライブラリがなかったり。([intro-to-web-programming-in-rust-for-nodejs-developers](https://levelup.gitconnected.com/intro-to-web-programming-in-rust-for-nodejs-developers-1a9c048c4de1)) 
    - コアチーム的にはフルスタックのライブラリを用意するよりまずは、それらの基盤となる低レイヤーで汎用性のあるライブラリを整えていくという方針っぽい。
    - 普通のWebアプリケーションだと、本当にrustでやる必要ある？というのはある
- C/C++の代替でRust以外でまともなのがない（と言っている人達がいる）
- RustがJS並に何でも使えるよねってなったら、使う人増えて、Web周りのエコシステムも発展するのかな
- Rust自体は思ってたよりProductionで使われてる