20161121-rust-tokyo

00580f6c11851d2fff0b3e2f7392226b?s=47 N. Shimizu
November 21, 2016

 20161121-rust-tokyo

A overview of Rust programming

00580f6c11851d2fff0b3e2f7392226b?s=128

N. Shimizu

November 21, 2016
Tweet

Transcript

  1. 自然数を定義してみよう Mozilla Japan N.Shimizu (nshimizu@mozilla-japan.org) Rust初心者LT会@レバレジーズ (2016/11/21)

  2. None
  3. https://hacks.mozilla.org/2016/11/rust-and-the-future-of-systems-programming/

  4. https://www.youtube.com/watch?list=PLo3w8EB99pqJ74XIGe72c9hBZWz9Y16cY&v=8EPsnf_ZYU0

  5. 荈搫侧㥨ֹדׅ״י

  6. 3VTUד荈搫侧׾㹀纏׃ג׫״ֲ

  7. /4IJNJ[V!DIJLPTLJ ˖ ⛆加㖩ח֮׷8FC׾⡲׷⠓爡ד⫴ְגְתׅ ˖ 'JSFGPY'JSFGPYGPSJ04 ˖ 3VTUBTNKT8FC"TTFNCMZ8FC73(BNJOH ˖ .%/TVQQPSUNP[JMMBPSH ˖

    فؚٗٓىؚٝ鎉铂ה؟حؕ٦鋅׷ךָ㥨ֹדׅ ˖ 㘗ך䓼ְ鎉铂ָ㥨ֹדׅ ˖ IUUQTTQFBLFSEFDLDPNDIJLPTLJ
  8. 自然数など定義して何になるのか

  9. 自然数の定義:良いプログラミングの練習 • 直和型をどのように扱うか? • Cでは共用体として表現 • Javaでは継承、もしくはインタフェースの実装で実現 • JavaScriptやRubyはあるメソッドを持っているかどうか •

    再帰的なデータ構造をどのように扱うか? • Cでは共用体へのポインターを利用して実現 • JavaではCompositeパターンを使って実装 • JavaScriptやRubyでは、とりあえず代入すればいい • 再帰的な関数をどのように定義できるか?
  10. ペアノの公理:自然数の定義 • ジュゼッペ・ペアノ(1858-1932)によって定義された自然数の定義 (1891) • 自然数は次の条件を満たす • 自然数0が存在する • 任意の自然数

    a には、その後者 suc(a) が存在する • 0はいかなる自然数の後者ではない • 異なる自然数は、異なる後者を持つ • 0がある性質を満たし、a がある性質を満たせば suc(a) もまたその性質を満 たす時、全ての自然数はその性質を満たす IUUQTKBXJLJQFEJBPSHXJLJآُئحل٥ل،ظ
  11. 自然数の構造:はじまりの町と、つぎの町 • スタート地点と、次の地点への移動で定義されるもののことを「自然数」と呼びました • 0:スタート地点 • 後者関数suc: 次の地点への移動 • 線形リストと同じ構造を持ちます

     TVD TVD TVD TVD
  12. 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 で定義した自然数クラス
  13. コマンドライン DBSHPOFXCJOQFBOP USFFQFBOP QFBOP щЭЭ$BSHPMPDL щЭЭ$BSHPUPNM сЭЭTSD сЭЭNBJOST Cargo コマンドで雛形を作成

  14. FOVN1FBOP\ ;FSP  4VD ^ GO[FSP 1FBOP\ 1FBOP;FSP ^ 

    TVD TVD 基底となる0と、それ以外とを分けて扱えるように型を定義します  Rust
  15. Rust <UFTU> GOUFTU@[FSP \ BTTFSU NBUDI[FSP \ 1FBOP;FSPUSVF  @GBMTF

    ^  ^ zero() のテストコード(enum は == で同値であることを比較できません)
  16. コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPOTBNQMFTQFBOP  XBSOJOHWBSJBOUJTOFWFSVTFEA4VDA <XBSO EFBE@DPEF >POCZEFGBVMU TSDNBJOST

    ] ]4VD ]??? 'JOJTIFEEFCVH<VOPQUJNJ[FE EFCVHJOGP>UBSHFU T JOTFDT 3VOOJOHUBSHFUEFCVHQFBOPBEBE SVOOJOHUFTU UFTUUFTU@[FSPPL UFTUSFTVMUPLQBTTFEGBJMFEJHOPSFENFBTVSFE cargo test でテストを実行できます
  17. Rust <UFTU> GOUFTU@UP@J \ BTTFSU [FSP UP@J   ^

    JNQM1FBOP\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP  @ ^ ^ ^ to_iメソッド:数値との対応付けを行うメソッド
  18. 再帰的に定義されている感を出したい • 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
  19. Rust FOVN1FBOP\ ;FSP  4VD 1FBOP  ^ GOTVD O1FBOP

    1FBOP\ 1FBOP4VD O  ^ <UFTU> GOUFTU@TVD \ BTTFSU NBUDITVD [FSP \ 1FBOP4VD @ USVF  @GBMTF  ^  ^ 一つ前を覚えておくことで、再帰的に定義されている感を出していこうとしました
  20. コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPO TBNQMFTQFBOP  FSSPS<&>SFDVSTJWFUZQFA1FBOPAIBTJOOJUFTJ[F TSDNBJOST ] ]FOVN1FBOP\

    ]?SFDVSTJWFUZQFIBTJOOJUFTJ[F ] IFMQJOTFSUJOEJSFDUJPO FH BA#PYA A3DA PSAA BUTPNF QPJOUUPNBLFA1FBOPASFQSFTFOUBCMF 再帰的な構造を使うには、直接値を保持するのではなく、間接的に扱わなければなりません
  21. Rust FOVN1FBOP\ ;FSP  4VD 1FBOP  ^ GOTVD O1FBOP

    1FBOP\ 1FBOP4VD O  ^ <UFTU> GOUFTU@TVD \ BTTFSU NBUDITVD [FSP \ 1FBOP4VD @ USVF  @GBMTF  ^  ^ 参照を利用して、間接的に値を保持するように書き換えます
  22. コマンドライン DBSHPUFTU $PNQJMJOHQFBOPW MF6TFSTDIJLPHJUSVTUIBOETPO TBNQMFTQFBOP  FSSPS<&>NJTTJOHMJGFUJNFTQFDJFS TSDNBJOST ] ]4VD

    1FBOP  ]?FYQFDUFEMJGFUJNFQBSBNFUFS ライフタイムを指定しなければならない!!ライフタイムってなんや!
  23. ライフタイム (lifetime) • Rustは、コンパイラーでできる限りのことをしようとします。 • そのうちの一つが、オブジェクトの生存時間管理です • RustにはGC(Garbage Collection)が標準では付いていません •

    しかし、メモリ上の領域を解放するタイミングはコンパイラーが適切に判断してくれます • しかしながら、全てを自動では推測できないので、ヒント情報が必要です • ヒント情報を関数、構造体、traitなどの宣言時に明示できます 如ך鸬甧倯玎䒭׾הֹծZך⦼׾実׭גֻ׌ְׁ YB C CB ZY B
  24. JNQMJDJU GOGPP YJ \ ^ FYQMJDJU GOCBSB YBJ \ ^

    lifetimeもコンパイラーが適切に推測してくれるので、基本的に書かなくても良い
  25. TUSVDU'PPB\ YBJ  ^ GONBJO \ MFUZUIJTJTUIFTBNFBTAMFU@ZMFUZ@ZA MFUG'PP\YZ^ QSJOUMO \^

    GY  ^ 構造体 Foo は 'a というライフタイムを持っていて、そのメンバー x のライフタイムは'a
  26. TUSVDU'PPB\ YBJ  ^ JNQMB'PPB\ GOY TFMG BJ\TFMGY^ ^ Fooでは'aというライフタイムがあり、そのメソッドxの返り値は、呼び出しされたオブジェクトと同じライフタイムを持ちます

  27. 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  ^ 左はコンパイルできますが、右はライフタイムに関するエラーがあるのでコンパイルできません
  28. Rust FOVN1FBOPB\ ;FSP  4VD B1FBOPB  ^ GO[FSPB 1FBOPB\

    1FBOP;FSP ^ GOTVDB OB1FBOP 1FBOPB\ 1FBOP4VD O  ^ ライフタイムを明示してみました
  29. Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP  @

     ^ ^ ^ ライフタイムの明示(つづき)
  30. 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 をメソッド化
  31. Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP  1FBOP4VD

    QSFW  QSFWUP@J  ^ ^ ^ 数値との対応付け(再帰的に行う)
  32. まとめ • ここまで、Rustを使って自然数を定義できました • これからやりたいこと • 各種演算の実装(加算、乗算、除算) • エラーメッセージをよく読もう!Rustのエラーメッセージは親切!まじ親切!

  33. https://doc.rust-lang.org/error-index.html

  34. https://dev.mozilla.jp/

  35. goo.gl/bHALbG