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
980
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
710
Functions in JavaScript
chikoski
1
1.2k
20171018-WASM
chikoski
2
1.3k
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
Understanding_Thread_Tuning_for_Inference_Servers_of_Deep_Models.pdf
lycorptech_jp
PRO
0
120
20250625 Snowflake Summit 2025活用事例 レポート / Nowcast Snowflake Summit 2025 Case Study Report
kkuv
1
310
生成AIでwebアプリケーションを作ってみた
tajimon
2
150
生成AI時代 文字コードを学ぶ意義を見出せるか?
hrsued
1
460
Uniadex__公開版_20250617-AIxIoTビジネス共創ラボ_ツナガルチカラ_.pdf
iotcomjpadmin
0
160
地図も、未来も、オープンに。 〜OSGeo.JPとFOSS4Gのご紹介〜
wata909
0
110
Welcome to the LLM Club
koic
0
170
5min GuardDuty Extended Threat Detection EKS
takakuni
0
140
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
エンジニア向け技術スタック情報
kauche
1
260
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
180
Кто отправит outbox? Валентин Удальцов, автор канала Пых
lamodatech
0
340
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
Code Review Best Practice
trishagee
68
18k
Balancing Empowerment & Direction
lara
1
370
KATA
mclloyd
29
14k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
490
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
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