Slide 1

Slide 1 text

実務から見たRustの優位 性
 Powered by DMM Blockchain Labs 1

Slide 2

Slide 2 text

自己紹介 - About me
 @ DMM.com Shinohara Wataru ・DMM.com Blockchain Engineer ・I really love Roller Coasters. @shinanonozenji_ 2

Slide 3

Slide 3 text

書籍紹介 - Publishing
 @ DMM.com 3

Slide 4

Slide 4 text

Rustとは - What is Rust
 @ DMM.com ● システムプログラミング言語 ○ OS ○ ドライバ ○ Linker ○ not アプリケーション向け言語 ● コンパイラが超優秀 4

Slide 5

Slide 5 text

どういう用途に適しているか - What is suitable for
 @ DMM.com ● 高パフォーマンス ● 限られたリソース ● 安全に稼働する要求 5

Slide 6

Slide 6 text

どこで使われてるのか - Where Rust is used
 @ DMM.com ● npmjs.com ● dropbox ● Firefoxのレンダリングエンジン ● データベース ● etc. 6

Slide 7

Slide 7 text

なぜできたのか - Why Rust was born
 @ DMM.com ● C/C++の複雑さへの解決策 ● あまりに多くの大砲を与えたためにユーザーは自分の足を撃ち抜いてしま う C/C++に死を https://jp.techcrunch.com/2017/07/17/20170716death-to-c/ 7

Slide 8

Slide 8 text

特徴 - Feautures
 @ DMM.com ● 高速性 ○ Garbage Collectionを使わない ○ ゼロコスト抽象化 ● 安全性 ○ 型安全 ○ メモリ安全 ● 並行性 ○ スレッド安全 8

Slide 9

Slide 9 text

私たちはなぜ使っているか - Why reason we use it
 @ DMM.com ● Substrate, Parity のため ● その他GrinもRust ● Crypto界隈ではRust利用プロジェクトが増加 ● Web3の理念としてWebAssemblyの重要度の高まり Substrate: The platform for blockchain innovators https://github.com/paritytech/substrate paritytech/parity-ethereum https://github.com/paritytech/parity-ethereum mimblewimble/grin https://github.com/mimblewimble/grin Understanding Web 3 — A User Controlled Internet https://blog.coinbase.com/understanding-web-3-a-user-controlled-internet-a39c21cf83f3 9

Slide 10

Slide 10 text

Cryptoプロジェクトとの相性 - Compatibility
 @ DMM.com ● 不具合は資産の損失に繋がるため安全なコードを書きたい ● ノードは安定稼働を求められる ● Cの偉大なライブラリを使える(暗号ライブラリはC実装が多い 10

Slide 11

Slide 11 text

高速性
 11

Slide 12

Slide 12 text

高速性 - High performance
 @ DMM.com ● 高速性 ○ Garbage Collectionを使わない ○ ゼロコスト抽象化 ● 安全性 ○ 型安全 ○ メモリ安全 ● 並行性 ○ スレッド安全 12

Slide 13

Slide 13 text

Garbage Collectionのメリット - Pros of GC
 @ DMM.com ● メモリ管理を実行エンジンに任せる ● メモリを確保し続けて、タイミングがきたら解放する ● 人がメモリを管理するコストを下げる 13

Slide 14

Slide 14 text

Garbage Collectionの種類 - Types of GC
 @ DMM.com ● 参照カウント ● Copy ● Mark and Sweep ● その他いろいろ 14

Slide 15

Slide 15 text

JVM(Java Virtual Machine)のGC - GC in JVM
 @ DMM.com ● Serial GC ● Parallel GC ● Concurrent Mark and Sweep GC ● G1GC ● Full GC 15

Slide 16

Slide 16 text

GCのデメリット - Cons of GC
 @ DMM.com ● タイミングを予測することは困難 ● 意図する挙動にならないことがある ● Full GCは完全にシステムが停止する時間がある ● Stop The World 16

Slide 17

Slide 17 text

ゼロコスト抽象化 - Zero cost abstraction
 @ DMM.com ● プログラムの抽象度が高いと、オーバーヘッドコストが高くなる ● オーバーヘッドを限りなく小さくする技術 ● コンパイル時に最適化を行う ● あとで少し出てきます 17

Slide 18

Slide 18 text

安全性
 18

Slide 19

Slide 19 text

安全性 - Safety
 @ DMM.com ● 高速性 ○ Garbage Collectionを使わない ○ ゼロコスト抽象化 ● 安全性 ○ 型安全 ○ メモリ安全 ● 並行性 ○ スレッド安全 19

Slide 20

Slide 20 text

型安全 - Type-safe
 @ DMM.com ● コンパイラが型を厳密にチェックする ● nullを使わない ● 型の推論機能があるため、明示しなくても良い ● パターンマッチ(あとで出ます 20

Slide 21

Slide 21 text

人類のnullとの戦い - Battle of null
 @ DMM.com ● 未初期化で意図しない動作 ● 大抵のnullのある言語のコンパイラはnullに対して無力 ● 動かして初めてわかる不具合 ○ わかるならまだ良い ○ もしも10年後に起きる不具合だったら? 21

Slide 22

Slide 22 text

10億ドル規模の損失をもたらす過ち - $1B mistake
 @ DMM.com ● Tony Hoareの言葉 22

Slide 23

Slide 23 text

nullを使わないメソッド - Option
 @ DMM.com ● あるかないかを表現する型 Optionを使う 23

Slide 24

Slide 24 text

(補足)文と式 - Statements and expressions
 @ DMM.com ● Rustは式言語 ○ 式は値を返す ○ 文は値を返さない(文末にセミコロン 式 文 24

Slide 25

Slide 25 text

メモリ安全 - Memory-safe
 @ DMM.com ● 所有権 ● 参照 ● ライフタイム 25

Slide 26

Slide 26 text

所有権 - Ownership
 @ DMM.com ● 値の所有権は移動していく 26

Slide 27

Slide 27 text

参照と借用- References and Borrowings
 @ DMM.com ● 所有されている値を参照する ○ 不変 ○ 可変 27

Slide 28

Slide 28 text

不変 - Immutable
 @ DMM.com ● &で不変の借用、値を書き換えることはできない 28

Slide 29

Slide 29 text

可変 - Mutable
 @ DMM.com ● &mutで可変の借用、値を書き換えることができる 29

Slide 30

Slide 30 text

借用のルール - The Rules 
 @ DMM.com 1. 不変は複数個存在できる 2. 可変はひとつだけ存在できる 3. 1.2.のルールは同時に満たせない Either or 30

Slide 31

Slide 31 text

なぜ可変はひとつだけ?
 @ DMM.com ● 意図しない値になる可能性 ● 並行処理で大きな問題になる ● 複数人でお絵描きするツールではなにが起きるか 31

Slide 32

Slide 32 text

なぜ可変と不変が共存できない?
 @ DMM.com ● なぜ可変と不変が共存できない? ● 渡されたデータが処理している間に書き換わる ● 契約書を読んでる最中に内容が変化したら ● 小説を読んでる最中に編集者が校正をしていたら? 32

Slide 33

Slide 33 text

ライフタイム - Lifetime
 @ DMM.com ● 変数はスコープの中でしか生きられない t のライフタイム 33

Slide 34

Slide 34 text

ライフタイムにおける参照関係
 @ DMM.com ● yへの参照はxと同じでないといけない y のライフタイム 34

Slide 35

Slide 35 text

使いにくいのでは
 35

Slide 36

Slide 36 text

安心してください。Copyはあります
 @ DMM.com ● プリミティブ型はCopyトレイトを持つ ● トレイトの説明は後ほど 36

Slide 37

Slide 37 text

生産性と柔軟性
 37

Slide 38

Slide 38 text

ジェネリクス - Generics
 @ DMM.com ● 型を抽象化してメソッドを作成できる 38

Slide 39

Slide 39 text

構造体 - Struct
 @ DMM.com ● 値を持たない、フィールド名を持たない、通常の3種類 39

Slide 40

Slide 40 text

構造体のジェネリクス - Generic structs
 @ DMM.com ● あらゆる型で構造体を定義できる 40

Slide 41

Slide 41 text

構造体のメソッド - Generic functions
 @ DMM.com ● impl 構造体名の中にメソッドを書く 41

Slide 42

Slide 42 text

構造体のメソッド - Structs functions
 @ DMM.com ● selfを渡したメソッドは 構造体. で呼ぶ ● selfを渡さないメソッドは 構造体:: で呼ぶ 42

Slide 43

Slide 43 text

列挙型 - Enums
 @ DMM.com ● Enumerationとか直和とかいわれる ● 列挙された値のどれかひとつを表す ● 例:私の健康状態は {正常、眠い、体調悪い} のどれか or or 43

Slide 44

Slide 44 text

よく使う列挙型 - Major enums
 @ DMM.com ● Option ○ 値がある -> Some ○ 値がない -> None ● Result ○ 処理が成功 -> Ok ○ 処理が失敗 -> Err 44

Slide 45

Slide 45 text

列挙型をパターンマッチ - Pattern match
 @ DMM.com 45

Slide 46

Slide 46 text

トレイト - Traits
 @ DMM.com ● 構造体の振る舞いを決める仕組み ○ 他の言語では型クラスなどと言われる ○ コンパイル時にインライン展開される ● ゼロコスト抽象化の一種 46

Slide 47

Slide 47 text

BitcoinとEthereumはCryptoの振る舞いをする
 @ DMM.com 47

Slide 48

Slide 48 text

トレイト境界 - Bounds
 @ DMM.com ● 関数に渡す型をトレイトで定める ● そのトレイトを実装している型を引数で取れる 48

Slide 49

Slide 49 text

並行性
 49

Slide 50

Slide 50 text

並行性 - Concurrency
 @ DMM.com ● 高速性 ○ Garbage Collectionを使わない ○ ゼロコスト抽象化 ● 安全性 ○ 型安全 ○ メモリ安全 ● 並行性 ○ スレッド安全 50

Slide 51

Slide 51 text

マルチスレッド - Multi thread
 @ DMM.com ● プログラムを並列で走らせて高速化する手法 ● バグを作り込んでしまうとデバッグが難しい ● 100人で会計処理をするとどうなるか 51

Slide 52

Slide 52 text

スレッド安全 - Thread-safe
 @ DMM.com ● 所有と借用のルールにより実現 ● 複数スレッドで同時書き込みはできない ● 複数スレッドが参照する値は変化しない Either or 52

Slide 53

Slide 53 text

補足
 53

Slide 54

Slide 54 text

ビルドツール Cargo
 @ DMM.com ● 雛形の作成 ● モジュール依存関係の解決 ● ビルドターゲットの変更 54

Slide 55

Slide 55 text

WebAssembly
 @ DMM.com ● ビルドターゲットを変更するだけ ● $ rustup target add wasm32-unknown-unknown ● $ cargo build --target wasm32-unknown-unknown 55

Slide 56

Slide 56 text

話さなかったこと - I did not speak
 @ DMM.com ● クレート ● プリミティブ型、コレクション ● クロージャ ● パターンマッチの更なる使い方 ● 便利な省略記法 ● メモリ配置 ● マクロ ● FFI 56

Slide 57

Slide 57 text

どう学習するか - How to learn Rust
 @ DMM.com ● カニの本を読む ● プログラミング言語Rustを読む プログラミングRust https://www.oreilly.co.jp/books/9784873118550/ プログラミング言語Rust https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/ 57

Slide 58

Slide 58 text

Rustを使っての感想 - My opinion
 @ DMM.com ● 抽象的に書ける ● 安心して実行できる ● いろんな言語の良いところを持ってきている ● マクロがすごく便利(なお、開発は辛い 58

Slide 59

Slide 59 text

総括 - Conclusion
 @ DMM.com ● 大丈夫です、コンパイラを信じよう ● コンパイル通るまでの作業は正しいコードに近づいてる証拠 ● 組み込みでもWeb APIサーバーまで広く使える ● ビルドツールは優秀 59

Slide 60

Slide 60 text

Thank you for the attention.
 Powered by DMM Blockchain Labs 60