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.7k
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
200
festudy02-wasm
chikoski
1
900
An overview of WebAssembly; how it is used, created, and applied?
chikoski
1
620
Functions in JavaScript
chikoski
1
1k
20171018-WASM
chikoski
2
1.2k
20171002-wejs
chikoski
1
510
20170924-html5conference-wasm
chikoski
5
10k
Equivalence_in_JS
chikoski
0
1.2k
いまさら振り返るPromise
chikoski
1
470
Other Decks in Technology
See All in Technology
[PlatformCon 24] Platform Orchestrators: The Missing Middle of Internal Developer Platforms?
danielbryantuk
1
800
WebアプリケーションにおけるPDOの使い方入門 / phpcon odawara 2024
meihei3
2
440
LLM とプロンプトエンジニアリング/チューターをビルドする / LLM and Prompt Engineering and Building Tutors
ks91
PRO
0
250
2024/4/26 コンピュータ歴史博物館解説告知
toshi_atsumi
0
210
日本におけるデータエンジニアリングのこれまでとこれから
foursue
16
4k
Postman v10リリース後を振り返る / Looking back at Postman v10 after release
yokawasa
1
150
自動生成を活用した、運用保守コストを抑える Error/Alert/Runbook の一元集約管理 / Centralized management of Error/Alert/Runbook to minimize operational costs using automated code generation
biwashi
12
2.3k
Azure Container Apps + Bicep 〜 こんな感じで運用しています
kaz29
2
400
元インフラエンジニアに成る / Human Resources to Human Relations
bobtani
4
890
SIEMを用いて、セキュリティログ分析の可視化と分析を実現し、PDCAサイクルを回してみた
coconala_engineer
0
270
VS CodeでAWSを操作しよう
smt7174
7
1.6k
SREとその組織類型
tatsuo48
9
1.6k
Featured
See All Featured
How GitHub Uses GitHub to Build GitHub
holman
468
290k
GitHub's CSS Performance
jonrohan
1024
450k
Making Projects Easy
brettharned
108
5.5k
Raft: Consensus for Rubyists
vanstee
132
6.3k
What's new in Ruby 2.0
geeforr
337
31k
Building Better People: How to give real-time feedback that sticks.
wjessup
354
18k
Done Done
chrislema
178
15k
The Invisible Side of Design
smashingmag
294
49k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
Designing with Data
zakiwarfel
95
4.8k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Infographics Made Easy
chrislema
238
18k
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