Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20161121-rust-tokyo

chikoski
November 21, 2016

 20161121-rust-tokyo

A overview of Rust programming

chikoski

November 21, 2016
Tweet

More Decks by chikoski

Other Decks in Technology

Transcript

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

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

    a には、その後者 suc(a) が存在する • 0はいかなる自然数の後者ではない • 異なる自然数は、異なる後者を持つ • 0がある性質を満たし、a がある性質を満たせば suc(a) もまたその性質を満 たす時、全ての自然数はその性質を満たす IUUQTKBXJLJQFEJBPSHXJLJآُئحل٥ل،ظ
  3. 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 で定義した自然数クラス
  4. FOVN1FBOP\ ;FSP  4VD ^ GO[FSP 1FBOP\ 1FBOP;FSP ^ 

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

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

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

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

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

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

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

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

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

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

    GY  ^ 構造体 Foo は 'a というライフタイムを持っていて、そのメンバー x のライフタイムは'a
  16. 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  ^ 左はコンパイルできますが、右はライフタイムに関するエラーがあるのでコンパイルできません
  17. Rust FOVN1FBOPB\ ;FSP  4VD B1FBOPB  ^ GO[FSPB 1FBOPB\

    1FBOP;FSP ^ GOTVDB OB1FBOP 1FBOPB\ 1FBOP4VD O  ^ ライフタイムを明示してみました
  18. 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 をメソッド化
  19. Rust JNQMB1FBOPB\ GOUP@J TFMG V\ NBUDI TFMG\ 1FBOP;FSP  1FBOP4VD

    QSFW  QSFWUP@J  ^ ^ ^ 数値との対応付け(再帰的に行う)