Rust入門ガイド  (sapporo.rs)

## 内容

- Rustの特徴
- 何に使えるのか？
- Rustの勘どころ

----

## 自己紹介

- 河野達也（かわの たつや）
- tatsuya6502
  - https://github.com/tatsuya6502
- 2016年ごろからRustコミュニティに生息
- 公式ドキュメントの和訳に参加
- 書籍『実践Rust入門』の共著者の1人
  - 実践を重視した入門書
  - Rust 2018 Editionに対応
  - 執筆に2年半以上かかった力作です！

----

## 昭和生まれ、昭和育ち

- 社会人歴約30年
  - 独立系IT企業、銀行系IT企業、ベンチャーなどに所属
  - クレジットカードの国際システムの運用部門
  - シスアドミン - TANDEM NonStopシステムなど（分散OS）
  - 開発チームリーダーの1人 - Apple WebObjects
  - 銀行システム運用部門の担当部長（直属の部下 約20名）
    - 法務コンプライアンス（リスクコントロール）
    - ストレージシステムの更改
- 管理の仕事よりも、システム設計や開発が好き
  - 2011年以降はいまの会社で研究開発エンジニア職についている
- 過去20年間の大半は、外国人の上司のもと、英語環境で仕事

----

## 札幌？

- 東京出身
  - 親戚が札幌にいるので、子供の夏休みに遊びに来ています
- いずれは海外在住期間の方が長くなりそう
  - 1996年〜2003年　ニューヨーク在住
    - 20代の終わりに渡米。デザインスクール（短大）でグラフィックデザインを学ぶ
    - 卒業後は現地企業でWebデザインの職に
  - 2013年〜現在　上海在住、東京にある会社にリモートで勤務

----

## 現職：分散ストレージ系

- Cloudian, Inc.
  - Amazon S3 API互換の分散ストレージが主力製品
  - 製品本体はJavaで実装
  - 私は周辺ツールを開発してます
- 主な開発言語
  - Erlang/OTP
  - Scala + Akka
- Rustはまだ本番では使えていない
  - Cassandraの苦手な部分を置き換える分散NoSQLを開発中

<!--
----

## Rustとの出会い

- 2015年ごろ Erlangで実装された自社製分散キーバリリューストアの

-->

----

# Rustの特徴

----

## Rustとは？

- C++の置き換えが可能なシステムプログラミング言語
  - ハイパフォーマンス
  - メモリ由来のセキュリティ脆弱性の回避
- Firefoxの開発元であるMozillaが中心となりオープンソースで開発
  - 並列性と安全性に優れる次世代Webブラウザエンジンの開発言語
- Firefox Quantumに成果が取り込まれている
  - Stylo - 並列CSSエンジン
  - WebRender - GPUベースのレンダリングエンジン

----

## システムプログラミング言語とは？
  
- システムの低レイアのソフトウェアやミドルウェアの開発に適している
- リソース（CPU、メモリ、デバイスなど）の詳細な制御が可能なプログラミング言語
- メモリが確保される領域、メモリ割り当て解放のタイミングなど完全に制御できる
- 処理にかかる時間やプログラムが消費するメモリ量を予測できる

----
<!--
## Rustの歩み

- 200X年ごろ 当時Mozillaに所属していたG H氏の個人プロジェクトとしてスタート
- 2010年 Mozillaの公式プロジェクトとなり開発チームが発足？
- 2015年5月 最初の安定板（1.0）がリリース
- 2018年12月 最初の破壊的な変更 2018 Edition

----
-->

## 最も愛されている言語

- StackOverflowの開発者向けアンケート
  - 開発者に愛されている言語のランキングで4年連続1位
- GitHub Octoverse

----

## 本番環境や製品での採用実績

- Mozilla Firefox
- Dropbox - MagicPocket
- Amazon Web Services (AWS) - Firecracker

<!-- 

----

## 注目が集まっている

- Google
- Facebook
- Microsoft
- wasmランタイム
--> 

----

## Rustはどんな言語？

誤解を恐れずにいうと

C と Haskell の特徴を併せ持った言語

----

## Cの効率性

- 型情報に基づく徹底的なコンパイル時最適化
- きめ細やかなリソース管理
- ガベージコレクション（GC）のないシンプルなランタイム
- SIMDなどCPUの持つ機能をフル活用できる
- OSなしで動作するプログラムも書ける

----

## Haskell由来の抽象化機構

- 型クラス
  - アドホック多相性
  - 継承ベースのオブジェクト指向とは異なるアプローチ
- 代数的データ型とパターンマッチ
- 型推論

----

## Rustで書かれたプログラムの特徴

- C++で書かれたプログラムに匹敵する性能を持つ
- メモリ由来のセキュリティ脆弱性を持たない
  - メモリ安全性に関するエラーをコンパイル時に検出
- 並列性に優れる
  - データ競合が起こる可能性をコンパイル時に検出

----

## Rustは関数型言語？

- 関数型言語のアイデアを多く取り入れているが、関数型言語ではない
- 命令型プログラミング（imperative programming）
  - 副作用をバリバリ使う
  - メソッドチェインで宣言型プログラミングっぽくも書ける
- 異なるアプローチ
  - 関数型言語では副作用をコントロールすることでプログラムの質や並列性を高める
  - Rustでは所有権システムによって同じことを実現

----

## コンパイル時の静的解析

- コンパイラはCで書いたプログラムと同等のマシンコードを生成する
  - 生成されたバイナリ（実行ファイル）には型情報などが残らない
- ゼロコスト抽象化

----

# 何に使えるのか？

----

## Web系（その1）

バックエンド側で重い処理の高速化

- マイクロサービス（REST、grpc）単位でRustに置き換え
  - npm.org - 認証サービスをRustで書き換え
- Node.jsなど他の言語のランタイムからC FFI経由でRustの関数を呼ぶ
  - Discord - "Using Rust to Scale Elixir for 11 Million Concurrent Users"
  - Rustで実装したデータ構造をElixirから呼び出し

----

## Web系（その2）

フロントエンド側で重い処理の高速化

- WebAssembly

----

## Web系（その3）

- サーバーレス。AWS Lambdaで使用できる
- 信頼されていないユーザプログラム（例：プラグイン）の実行
  - ユーザプログラムの隔離が必要
  - Fastly - 埋め込み型のwasm実行環境
  - AWS - Lambdaの基盤となるmicroVM（Firecracker）

----

## 組み込み系

- ARM Cortex-M ベアメタルプログラミング
  - 自作キーボードにも応用可
- WebAssemblyマイクロランタイム（Intel製）
- RTOSとの組み合わせはまだ厳しい

----

## その他

- ちょっとしたコマンドラインツールの開発
- OSやエミュレータの開発
- 競技プログラミング
  - Pythonだと性能不足
  - C++だと実行時エラー多発
  - C++の代替として、C#、Rust、Dなどが人気

----

# Rustの勘どころ

----

## Rustは学習が難しい

- ふるゆわに書けない
  - コンパイラのチェックが厳しいので、適当に書いてもコンパイルできない
- 急勾配の学習曲線
  - 所有権、型クラスに基づく多相性、詳細なメモリ管理
  - ライブラリが未成熟

<!-- npm.comの例 -->

----

## Rustは学習が難しい

全ての入門書が600ページ前後ある！

- プログラミングRust（オライリージャパン）
  - 608ページ 
- 実践Rust入門（技術評論社）
  - 576ページ
- プログラミング言語Rust 公式ガイド（KADOKAWA）
  - 608ページ

----

## 他の言語との違いに注目して学習

- 所有権とライフタイム
- トレイト（≒型クラス）
  - 継承ではないオブジェクト指向
- 詳細なメモリ管理
  - 覚えることが多い
  - 文字列型だけでも6種類
- 例外（exception）がない
  - エラー処理のベストプラクティスを学ぶ必要がある

----

## その他、注意する点

- 型強制のしくみがわかるとAPIドキュメントが見やすくなる
- 2018 Editionで変わったところも多い
- RLSを活用しよう

----

## もくもく会でオススメの題材

- Rustに入門してみる
  - 実践Rust入門を貸し出します（3冊）
- WebAssemblyでなにかする
- OS自作に入門してみる
- ベアメタルプログラミングに入門してみる
  - ST Microのボードなど
  - 実機がなくてもQEMUで試せる

<!--
---- 

## Rust日本語コミュニティ

- Slack rust-jp

-->