Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rust の LT 会! 2016/11/21
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Agata Naomichi
November 21, 2016
Programming
2.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rust の LT 会! 2016/11/21
Agata Naomichi
November 21, 2016
More Decks by Agata Naomichi
See All by Agata Naomichi
Turning AI into Business Impact / "AI" の事業インパクトを最大化する
agatan
4
640
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
9.7k
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
9
24k
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
2
740
医療系スタートアップが経験した 認知負荷問題の症状分析と処方箋 チーム分割による認知負荷の軽減 / Cognitive Load Busters
agatan
2
660
専門性の高い領域をいかに開発し、 テストするか / How to test and develop complicated systems with Domain Experts!
agatan
3
950
Henry のサーバーサイドアーキテクチャ 狙いと課題 2022.08.25 / Server-Side Architecture at Henry, Inc.
agatan
3
6.2k
The Web Conference 2020 - Participation Report
agatan
1
770
○○2vec 再考
agatan
1
4.8k
Other Decks in Programming
See All in Programming
Railsバージョンを4倍にした話
optim
0
360
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
The Rails Doctrine Decade
koic
2
590
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
270
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
350
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
phperだってパンチカードでコーディングしたい
o0h
PRO
0
330
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
Featured
See All Featured
Google's AI Overviews - The New Search
badams
0
1.6k
Code Review Best Practice
trishagee
74
20k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
570
How to build a perfect <img>
jonoalderson
1
6.1k
WCS-LA-2024
lcolladotor
0
890
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
750
Test your architecture with Archunit
thirion
2
2.4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Transcript
ジェネリクスと 静的ディスパッチと エラーメッセージ 2016/11/21 RUST の LT 会!
ABOUT ME agatan Twitter: GitHub: 趣味は言語処理系/ コンパイラいじり 自作言語の妄想をするのがすきです システムプログラミング系の研究室にいます @agatan_
http://github.com/agatan/
RUST のジェネリクス 一つのコードで複数の型に対応する / trait 制約を付けられる 使うときは具体的な型をいれる / そして型推論 fn
hello<T: Display>(x: T) -> String { format!("Hello {}", x) }
どうコンパイルされるか Rust のジェネリクスは monomorphization によってコ ンパイルされる インスタンス化されるたびに専用の関数をつくる fn snd<T, U>(x:
(T, U)) -> U { x.1 } let a: (i64, i64) = (0, 1); snd(a); // => 1 let b: (Vec<i32>, Option<u64>) = (vec![], None); snd(b); // => None この例では と がインスタンス化されている let a: (i64, i64) = (0, 1); snd_i64_i64(a); // <= 専用 関数 呼 let b: (Vec<i32>, Option<u64>) = (vec![], None); snd_vec_i32_option_u64(b); // <= 専用 関数 呼 こんな感じにコンパイルされる
ジェネリクスとトレイト trait Greet { fn greet(&self) -> String; } impl
Greet for String { fn greet(&self) -> String { format!("Hello, I'm {}", self) } } impl Greet for i64 { fn greet(&self) -> String { format!("Hello, I'm No.{}", self) } } ジェネリクスにトレイトによる制約がつけられる fn conversation<T: Greet, U: Greet>(t: T, u: U) { println!("T => {}", t.greet()); println!("U => {}", u.greet()); } monomorphization によってコンパイルされる の部分はどうなる?
静的ディスパッチ 専用の関数はどうコン パイルされるか コンパイル時にどの関数を呼ぶかすべてわかっている => 静的ディスパッチ の っぽい fn conversation_i64_String(t:
i64, u: String) { println!("T => {}", t.greet()); // => greet i64::greet println!("U => {}", u.greet()); // => greet String::greet }
静的ディスパッチ 利点 インライン展開できる!! 関数を動的に探す必要がない!!( ただの関数呼び 出し) 欠点 バイナリが大きくなる... 分割コンパイルできない
動的ディスパッチ どの関数を呼ぶか実行時に決定する の仮想関数 class A { public virtual void greet()
{ std::cout << "Hello, I'm A\n"; } } class B: public A { public virtual void greet() override { std::cout << "Hello, I'm B\n" } void greet(A const& a) { a.greet(); // A::greet? B::greet? } 典型的には仮想関数のテーブルをオブジェクトに紐付 けておく 実行時に対象オブジェクトの に対応する関数 ポインタを探す
動的ディスパッチ Rust ではトレイトオブジェクトを使う / = 「 を満たす何か」のベ クタ とはかけない 利点
バイナリサイズの節約 分割コンパイルを諦める必要がない 欠点 実行時コストがかかる
型が爆発する monomorphization を進めていくと,型が爆発する 自前のちょっとしたパーサコンビネータの例 let mut parser = char('"') .and(take_while(|x:
&char| *x != '"')) .and(char('"')) .map(|((_, s), _)| s); の型は Map< And< And< Char<StrInput<'a>>, TakeWhile<[closure@src/main.rs:253:25: 253:45], StrInput<'a>, String> >, Char<StrInput<'a>> >, [closure@src/main.rs:255:14: 255:29] >
EXPRESSION TEMPLATE 式を型で表す! c.f. Boost.Spirit (C++ のパーサコンビネータ) Rust には型推論があるので,型の複雑さはほとんど気 にならない!
関数定義のときは返り値の型を明示しなくてはならな くて若干つらい... この辺は読みやすさとのトレードオフ Rust のコンパイルエラーはわかりやすいので expression template も(そこまで)辛くない!!
わざとエラーを起こしてみる としてコンパイルエラーを起こ してみると => 読みやすい!! 良い感じに詳細が省かれた型名を表示してくれる どういう基準でやっているのかはよくわからない...
もっとエラーを起こしてみる とやってみる までは合っている.3 つ目の が間違っている. => 本当に読みやすい!!!!
まとめ Rust のジェネリクスは静的に色々解決する 動的にもできる ( トレイトオブジェクト ) ジェネリクスしまくると型が爆発する!! Rust の型推論は強力なので,ほとんど気にならない
型が合わなくなってもエラーメッセージが本当にわか りやすい!!! expression template 的なことをしてもそんなに辛く ない 型以外にもエラーメッセージは本当に読みやすくて 最高