Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
20161121-rust-tokyo
Search
chikoski
November 21, 2016
Technology
2
2.9k
20161121-rust-tokyo
A overview of Rust programming
chikoski
November 21, 2016
Tweet
Share
More Decks by chikoski
See All by chikoski
20210825_ossx
chikoski
0
310
festudy02-wasm
chikoski
1
990
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
730
Functions in JavaScript
chikoski
1
1.2k
20171018-WASM
chikoski
2
1.4k
20171002-wejs
chikoski
1
580
20170924-html5conference-wasm
chikoski
5
10k
Equivalence_in_JS
chikoski
0
1.4k
いまさら振り返るPromise
chikoski
1
560
Other Decks in Technology
See All in Technology
✨敗北解法コレクション✨〜Expertだった頃に足りなかった知識と技術〜
nanachi
1
750
Cloud WANの基礎から応用~少しだけDeep Dive~
masakiokuda
3
110
Findy Freelance 利用シーン別AI活用例
ness
0
630
Claude Codeは仕様駆動の夢を見ない
gotalab555
23
6.9k
Lambda management with ecspresso and Terraform
ijin
2
170
AIと描く、未来のBacklog 〜プロジェクト管理の次の10年を想像し、創造するセッション〜
hrm_o25
0
110
「Roblox」の開発環境とその効率化 ~DAU9700万人超の巨大プラットフォームの開発 事始め~
keitatanji
0
130
専門分化が進む分業下でもユーザーが本当に欲しかったものを追求するプロダクトマネジメント/Focus on real user needs despite deep specialization and division of labor
moriyuya
2
1.4k
全員が手を動かす組織へ - 生成AIが変えるTVerの開発現場 / everyone-codes-genai-transforms-tver-development
tohae
0
220
Amazon Bedrock AgentCoreのフロントエンドを探す旅 (Next.js編)
kmiya84377
1
160
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
6.3k
AWS DDoS攻撃防御の最前線
ryutakondo
1
170
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.4k
Faster Mobile Websites
deanohume
309
31k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Adopting Sorbet at Scale
ufuk
77
9.5k
Optimizing for Happiness
mojombo
379
70k
It's Worth the Effort
3n
186
28k
The World Runs on Bad Software
bkeepers
PRO
70
11k
YesSQL, Process and Tooling at Scale
rocio
173
14k
How STYLIGHT went responsive
nonsquared
100
5.7k
Embracing the Ebb and Flow
colly
86
4.8k
Become a Pro
speakerdeck
PRO
29
5.5k
Transcript
自然数を定義してみよう Mozilla Japan N.Shimizu (
[email protected]
) Rust初心者LT会@レバレジーズ (2016/11/21)
None
https://hacks.mozilla.org/2016/11/rust-and-the-future-of-systems-programming/
https://www.youtube.com/watch?list=PLo3w8EB99pqJ74XIGe72c9hBZWz9Y16cY&v=8EPsnf_ZYU0
荈搫侧㥨ֹדׅ״י
3VTUד荈搫侧㹀纏׃ג״ֲ
/4IJNJ[V!DIJLPTLJ ˖ ⛆加㖩ח֮8FC⡲⠓爡ד⫴ְגְתׅ ˖ 'JSFGPY'JSFGPYGPSJ04 ˖ 3VTUBTNKT8FC"TTFNCMZ8FC73(BNJOH ˖ .%/TVQQPSUNP[JMMBPSH ˖
فؚٗٓىؚٝ鎉铂ה؟حؕ٦鋅ךָ㥨ֹדׅ ˖ 㘗ך䓼ְ鎉铂ָ㥨ֹדׅ ˖ IUUQTTQFBLFSEFDLDPNDIJLPTLJ
自然数など定義して何になるのか
自然数の定義:良いプログラミングの練習 • 直和型をどのように扱うか? • Cでは共用体として表現 • Javaでは継承、もしくはインタフェースの実装で実現 • JavaScriptやRubyはあるメソッドを持っているかどうか •
再帰的なデータ構造をどのように扱うか? • Cでは共用体へのポインターを利用して実現 • JavaではCompositeパターンを使って実装 • JavaScriptやRubyでは、とりあえず代入すればいい • 再帰的な関数をどのように定義できるか?
ペアノの公理:自然数の定義 • ジュゼッペ・ペアノ(1858-1932)によって定義された自然数の定義 (1891) • 自然数は次の条件を満たす • 自然数0が存在する • 任意の自然数
a には、その後者 suc(a) が存在する • 0はいかなる自然数の後者ではない • 異なる自然数は、異なる後者を持つ • 0がある性質を満たし、a がある性質を満たせば suc(a) もまたその性質を満 たす時、全ての自然数はその性質を満たす IUUQTKBXJLJQFEJBPSHXJLJآُئحل٥ل،ظ
自然数の構造:はじまりの町と、つぎの町 • スタート地点と、次の地点への移動で定義されるもののことを「自然数」と呼びました • 0:スタート地点 • 後者関数suc: 次の地点への移動 • 線形リストと同じ構造を持ちます
TVD TVD TVD TVD
JS DMBTT1FBOP\ DPOTUSVDUPS QSFW \ UIJTQSFWQSFW ^ TVD \ SFUVSOOFX1FBOP
UIJT ^ UP@J \ SFUVSOUIJTQSFW UIJTQSFWUP@J ^ ^ 1FBOP@[FSPOFX1FBOP OVMM 1FBOP[FSPGVODUJPO \ SFUVSO1FBOP@[FSP ^ DPOTU[FSP1FBOP[FSP DPOTUPOF[FSPTVD DPOTUUXPPOFTVD DPOTUGPVSUXPTVD TVD DPOTPMFMPH GPVSUP@J JavaScript で定義した自然数クラス
コマンドライン DBSHPOFXCJOQFBOP USFFQFBOP QFBOP щЭЭ$BSHPMPDL щЭЭ$BSHPUPNM сЭЭTSD сЭЭNBJOST Cargo コマンドで雛形を作成
FOVN1FBOP\ ;FSP 4VD ^ GO[FSP 1FBOP\ 1FBOP;FSP ^
TVD TVD 基底となる0と、それ以外とを分けて扱えるように型を定義します Rust
Rust <UFTU> GOUFTU@[FSP \ BTTFSU NBUDI[FSP \ 1FBOP;FSPUSVF @GBMTF
^ ^ zero() のテストコード(enum は == で同値であることを比較できません)
コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPOTBNQMFTQFBOP XBSOJOHWBSJBOUJTOFWFSVTFEA4VDA <XBSO EFBE@DPEF >POCZEFGBVMU TSDNBJOST
] ]4VD ]??? 'JOJTIFEEFCVH<VOPQUJNJ[FE EFCVHJOGP>UBSHFU T JOTFDT 3VOOJOHUBSHFUEFCVHQFBOPBEBE SVOOJOHUFTU UFTUUFTU@[FSPPL UFTUSFTVMUPLQBTTFEGBJMFEJHOPSFENFBTVSFE cargo test でテストを実行できます
Rust <UFTU> GOUFTU@UP@J \ BTTFSU [FSP UP@J ^
JNQM1FBOP\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP @ ^ ^ ^ to_iメソッド:数値との対応付けを行うメソッド
再帰的に定義されている感を出したい • 1:= suc(0) • 2:= suc(1) = suc(suc(0)) •
3:= suc(2) = suc(suc(1)) = suc(suc(suc(0))) • 4:= suc(3) = suc(suc(2)) = suc(suc(suc(1))) = suc(suc(suc(suc(0)))) TVD TVD TVD TVD
Rust FOVN1FBOP\ ;FSP 4VD 1FBOP ^ GOTVD O1FBOP
1FBOP\ 1FBOP4VD O ^ <UFTU> GOUFTU@TVD \ BTTFSU NBUDITVD [FSP \ 1FBOP4VD @ USVF @GBMTF ^ ^ 一つ前を覚えておくことで、再帰的に定義されている感を出していこうとしました
コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPO TBNQMFTQFBOP FSSPS<&>SFDVSTJWFUZQFA1FBOPAIBTJOOJUFTJ[F TSDNBJOST ] ]FOVN1FBOP\
]?SFDVSTJWFUZQFIBTJOOJUFTJ[F ] IFMQJOTFSUJOEJSFDUJPO FH BA#PYA A3DA PSAA BUTPNF QPJOUUPNBLFA1FBOPASFQSFTFOUBCMF 再帰的な構造を使うには、直接値を保持するのではなく、間接的に扱わなければなりません
Rust FOVN1FBOP\ ;FSP 4VD 1FBOP ^ GOTVD O1FBOP
1FBOP\ 1FBOP4VD O ^ <UFTU> GOUFTU@TVD \ BTTFSU NBUDITVD [FSP \ 1FBOP4VD @ USVF @GBMTF ^ ^ 参照を利用して、間接的に値を保持するように書き換えます
コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPO TBNQMFTQFBOP FSSPS<&>NJTTJOHMJGFUJNFTQFDJFS TSDNBJOST ] ]4VD
1FBOP ]?FYQFDUFEMJGFUJNFQBSBNFUFS ライフタイムを指定しなければならない!!ライフタイムってなんや!
ライフタイム (lifetime) • Rustは、コンパイラーでできる限りのことをしようとします。 • そのうちの一つが、オブジェクトの生存時間管理です • RustにはGC(Garbage Collection)が標準では付いていません •
しかし、メモリ上の領域を解放するタイミングはコンパイラーが適切に判断してくれます • しかしながら、全てを自動では推測できないので、ヒント情報が必要です • ヒント情報を関数、構造体、traitなどの宣言時に明示できます 如ך鸬甧倯玎䒭הֹծZך⦼実גְֻׁ YB C CB ZY B
JNQMJDJU GOGPP YJ \ ^ FYQMJDJU GOCBSB YBJ \ ^
lifetimeもコンパイラーが適切に推測してくれるので、基本的に書かなくても良い
TUSVDU'PPB\ YBJ ^ GONBJO \ MFUZUIJTJTUIFTBNFBTAMFU@ZMFUZ@ZA MFUG'PP\YZ^ QSJOUMO \^
GY ^ 構造体 Foo は 'a というライフタイムを持っていて、そのメンバー x のライフタイムは'a
TUSVDU'PPB\ YBJ ^ JNQMB'PPB\ GOY TFMG BJ\TFMGY^ ^ Fooでは'aというライフタイムがあり、そのメソッドxの返り値は、呼び出しされたオブジェクトと同じライフタイムを持ちます
MFU[[FSP MFUPOF[TVD MFUUXPPOFTVD MFUUISFFUXPTVD QSJOUMO \^\^\^\^
[UP@J POFUP@J UXPUP@J UISFFUP@J MFU[[FSP MFUPOF[TVD MFUUISFF \ MFUUXPPOFTVD UISFFUXPTVD QSJOUMO \^\^\^\^ [UP@J POFUP@J UXPUP@J UISFFUP@J ^ 左はコンパイルできますが、右はライフタイムに関するエラーがあるのでコンパイルできません
Rust FOVN1FBOPB\ ;FSP 4VD B1FBOPB ^ GO[FSPB 1FBOPB\
1FBOP;FSP ^ GOTVDB OB1FBOP 1FBOPB\ 1FBOP4VD O ^ ライフタイムを明示してみました
Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP @
^ ^ ^ ライフタイムの明示(つづき)
Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP @
^ ^ GOTVD BTFMG 1FBOPB\ 1FBOP4VD TFMG ^ ^ <UFTU> GOUFTU@TVD \ BTTFSU NBUDI[FSP TVD \ 1FBOP4VD @ USVF @GBMTF ^ ^ suc をメソッド化
Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP 1FBOP4VD
QSFW QSFWUP@J ^ ^ ^ 数値との対応付け(再帰的に行う)
まとめ • ここまで、Rustを使って自然数を定義できました • これからやりたいこと • 各種演算の実装(加算、乗算、除算) • エラーメッセージをよく読もう!Rustのエラーメッセージは親切!まじ親切!
https://doc.rust-lang.org/error-index.html
https://dev.mozilla.jp/
goo.gl/bHALbG