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
20161121-rust-tokyo
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
chikoski
November 21, 2016
Technology
2.9k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
20161121-rust-tokyo
A overview of Rust programming
chikoski
November 21, 2016
More Decks by chikoski
See All by chikoski
20210825_ossx
chikoski
0
360
festudy02-wasm
chikoski
1
1.1k
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
800
Functions in JavaScript
chikoski
1
1.2k
20171018-WASM
chikoski
2
1.5k
20171002-wejs
chikoski
1
630
20170924-html5conference-wasm
chikoski
5
10k
Equivalence_in_JS
chikoski
0
1.6k
いまさら振り返るPromise
chikoski
1
630
Other Decks in Technology
See All in Technology
コスト最適化の「めんどくさい」を AWS FinOps Agent でチョット楽にする
classmethod_kaz
0
300
アリアドネの糸と、20年ごとの建て替え ── 長尾真『電子図書館』を、伊勢で読み直す / Rereading Makoto Nagao’s "Electronic Library" in Ise
ykiyota
0
140
omasushiというライブラリを作った
polidog
PRO
0
190
Where Is JetBrains AI Heading- — Central CLI, Air Alpha, and the Agentic Development Stack
x5gtrn
PRO
0
150
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
580
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
4
340
Sigmaで作る業務アプリ
kazushiro_honma
0
110
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
180
Podは生きているのにGoだけが落ちる:GOGCとGOMEMLIMITで追うInvisible OOM Killの謎
tkc66buzz
1
500
株式会社シーエーシー エンジニア向け会社紹介資料
cac
0
57k
20260912_スクフェス三河
kgnkhkr
0
250
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Technical Leadership for Architectural Decision Making
baasie
3
560
Documentation Writing (for coders)
carmenintech
77
5.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
480
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Evolving SEO for Evolving Search Engines
ryanjones
0
280
Agile that works and the tools we love
rasmusluckow
331
22k
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