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

最近個人的に気になるプログラミング言語おさらい Ruby, Python, Go, Rust, Julia

最近個人的に気になるプログラミング言語おさらい Ruby, Python, Go, Rust, Julia

レトリバセミナー 2017/03/15
Movie: https://www.youtube.com/watch?v=okwJ_Mppl74

Kei Shiratsuchi

August 30, 2017
Tweet

More Decks by Kei Shiratsuchi

Other Decks in Technology

Transcript

  1. ࠷ۙݸਓతʹؾʹͳΔ
    ϓϩάϥϛϯάݴޠ͓͞Β͍
    3VCZ 1ZUIPO (P 3VTU +VMJB
    株式会社レトリバ
    © 2017 Retrieva, Inc.

    View Slide

  2. ࣗݾ঺հ
    • ⽩⼟慧(シラツチ ケイ)
    • 株式会社レトリバ
    • 2016年4⽉⼊社
    • Ruby on Rails / JavaScript
    • フロントエンド側の⼈間
    • ⼤学時代は複雑ネットワーク科学の研究
    © 2017 Retrieva, Inc. 2

    View Slide


  3. • WEB+DB PRESS Vol.100 に、弊社
    のメンバーが特集記事を書きまし
    た。
    • 特集1 作って学ぶ⼈⼯知能
    • 第1章 ⼈⼯知能とはどんな技術なの
    か?
    • 第2章 ⾃然⾔語処理
    • 第3章 機械学習
    • 第4章 深層学習とニューラルネット
    ワーク
    • 発売中!
    © 2017 Retrieva, Inc. 3

    View Slide

  4. ຊ೔ͷϝχϡʔ
    • 最新事情調査
    • Ruby
    • Python
    • 弊社でまだ使っていない⾔語紹介
    • Go
    • Rust
    • Julia
    © 2017 Retrieva, Inc. 4

    View Slide

  5. 3VCZ
    • 弊社では製品のWebフレームワークとして、Ruby on Railsを利

    • 作者が⽇本⼈
    • まつもとゆきひろ (matz)
    • 開発者にも⽇本⼈が多い(ので、⽇本語の情報が多い)
    © 2017 Retrieva, Inc. 5

    View Slide

  6. 3VCZɿ࠷৽όʔδϣϯ
    • 最新バージョンは 2.4.1
    • 2.4 でのアップデート
    • ハッシュテーブルの実装が双⽅向連結リスト+チェイン法から、オー
    プンアドレス法に変更され⾼速化
    • binding.pry のような、binding.irb を標準搭載
    • Fixnum/Bignum を Integer に統合
    • String.upcase などがASCIIだけでなくUnicodeに対応
    • 'Türkiye'.upcase => "TÜRKIYE"
    © 2017 Retrieva, Inc. 6

    View Slide

  7. 3VCZɿࠓޙͷಈ޲
    • バージョン3は、2.0から3倍⾼速化することを⽬指す
    • Ruby 3x3 プロジェクト
    • 東京オリンピックの前の年までに実現を⽬指す(って⾔ってた
    はず)
    © 2017 Retrieva, Inc. 7

    View Slide

  8. 3VCZɿࢀߟ63-
    • "Ruby 2.4.0 リリース”
    • https://www.ruby-lang.org/ja/news/2016/12/25/ruby-2-4-0-
    released/
    • "Ruby 3x3: Matz, Koichi, and Tenderlove on the future of
    Ruby Performance | Heroku”
    • https://blog.heroku.com/ruby-3-by-3
    © 2017 Retrieva, Inc. 8

    View Slide

  9. 1ZUIPO
    • 弊社では深層学習、数値計算系のライブラリ群を利⽤
    • Chainer、gensim
    • ⾔語特性としては Ruby と似ている(動的、インタプリタ、オ
    ブジェクト指向)
    • 数値計算ライブラリ NumPy を中⼼に、機械学習や計算系のラ
    イブラリが充実している
    © 2017 Retrieva, Inc. 9

    View Slide

  10. 1ZUIPOɿ࠷৽όʔδϣϯ
    • 最新バージョンは 3.6.2
    • 3.6 でのアップデート
    • フォーマット済み⽂字列リテラルの導⼊
    • f"He said his name is {name}."
    • ⾮同期ジェネレータ
    • 3.5で導⼊された async/await を yield と⼀緒に使えるように
    • ⾮同期内包表記
    • result = [i async for i in aiter() if i % 2]
    • キーワード引数の順番の保持
    © 2017 Retrieva, Inc. 10

    View Slide

  11. 1ZUIPOɿࢀߟ63-
    • "Whatʼs New In Python 3.6 ̶ Python 3.6.1 ドキュメント”
    • https://docs.python.jp/3/whatsnew/3.6.html
    © 2017 Retrieva, Inc. 11

    View Slide

  12. (P
    • Google が開発を主導している⾔語
    • ロブ・パイク、ケン・トンプソンといった重鎮が開発
    • Ruby, Python と違い、静的型付けコンパイル⾔語
    • Linux, Mac OS, FreeBSD, Windows 向けにコンパイルができる
    • Linux と Windows で同様に動く実⾏ファイルが作成できる
    • Ruby/Python は(ライブラリによっては)Windowsでの動作が⾯倒
    • 並⾏処理が軽量に扱える
    © 2017 Retrieva, Inc. 12

    View Slide

  13. (Pɿฒߦॲཧ
    • go f(x) で、f を軽量スレッ
    ド(goroutine)で動作させる
    • チャンネルに対して 信、受信ができ、同期をと
    れる
    © 2017 Retrieva, Inc. 13
    func main() {
    go say("world")
    say("hello")
    }
    func sum(s []int, c chan int) {
    ...
    c }
    func main() {
    s := []int{7, 2, 8, -9, 4, 0}
    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := fmt.Println(x, y, x+y)
    }

    View Slide

  14. (Pɿن໿ͬΆ͍΋ͷ
    • 癖が強い(?)仕様が多い
    • エラー処理。try/catch ではなく、err != nil チェックを噛ませる
    • 構造体はクラスではないので、継承を使わない
    • インデント数や改⾏位置のフォーマット(gofmt コマンド)
    • プロジェクト、ライブラリのディレクトリ構造
    • 誰が書いても同じようになる
    • 慣れると気にならない。他の⼈のコードも読みやすい
    • 「Goに⼊ってはGoに従え」
    © 2017 Retrieva, Inc. 14

    View Slide

  15. (Pɿࢀߟ63-
    • "ドキュメント - The Go Programming Language”
    • http://golang-jp.org/doc/
    • "A Tour of Go”
    • https://go-tour-jp.appspot.com/
    • "Goに⼊ってはGoに従え”
    • https://ukai-go-talks.appspot.com/2014/gocon.slide
    • "Goby Sample Web App”
    • https://sample.goby-lang.org/
    © 2017 Retrieva, Inc. 15

    View Slide

  16. 3VTU
    • Mozilla が開発を主導
    • ベターCを⽬指すっぽい(分野としてC++と競合しそう)
    • 安全性、速度、並⾏性の3つのゴールにフォーカス
    • ガーベジコレクタなしにこれらのゴールを実現
    • 他の⾔語への埋め込み、要求された空間や時間内での動作、 デバイス
    ドライバやオペレーティングシステムのような低レベルなコードを得
    意とする
    • 全てのデータ競合を排除しつつも実⾏時オーバーヘッドのないコンパ
    イル時の安全性検査を多数持つ
    © 2017 Retrieva, Inc. 16

    View Slide

  17. 3VTU
    • 例
    • https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/guessing-game.html
    • https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/dining-philosophers.html
    • io::Result.expect() でエラーハンドリング
    • .expect() をつけないと、Result を使っていないという警告が出る
    • パターンマッチ(Ok, Err のあたり)
    • struct, impl でオブジェクト定義
    © 2017 Retrieva, Inc. 17

    View Slide

  18. 3VTUͷಛ௃ɿॴ༗ݖͱआ༻
    • 変数の「所有権」をやり取りすることで、メモリ安全性を確保する
    • 違反する場合、コンパイル時にエラーにする
    • これにより、マルチスレッドでのデータ競合などを未然に防ぐ
    • 「しかし、このシステムはあるコストを持ちます。それは学習曲線です。
    多くの新しいRustのユーザは「借⽤チェッカとの戦い」と好んで呼ばれる
    ものを経験します。
    … … …
    しかし、よいニュースがあります。… … …⼀度彼らが所有権システムの
    ルールとともにしばらく仕事をすれば、彼らが借⽤チェッカと戦うことは
    少なくなっていくということです。」
    © 2017 Retrieva, Inc. 18

    View Slide

  19. 3VTUɿॴ༗ݖ
    • リソース v に対する所有権は「1つ」しかない
    • 下記は println! のところで「コンパイル時に」エラーになる
    • error[E0382]: use of moved value: `v`
    © 2017 Retrieva, Inc. 19
    fn main() {
    let v = vec![1, 2, 3];
    let v2 = v;
    println!("v[0] is: {}", v[0]);
    }
    fn take(v: Vec) {
    println!(”v{}", v[0]);
    }
    fn main() {
    let v = vec![1, 2, 3];
    take(v);
    println!("v[0] is: {}", v[0]);
    }

    View Slide

  20. 3VTUɿࢀরͱआ༻
    • v を渡す代わりに、&v を渡す。引数にも &Vec を使う。
    • &T, &mut T は参照。所有権を「借⽤」する。
    © 2017 Retrieva, Inc. 20
    fn take(v: &Vec) {
    println!("{}", v[0]);
    }
    fn main() {
    let v = vec![1, 2, 3];
    take(&v);
    println!("v[0] is: {}", v[0]);
    }
    fn plus(y: &mut i32) {
    *y += 1;
    }
    fn main() {
    let mut x = 5;
    plus(&mut x);
    println!("{}", x);
    }

    View Slide

  21. 3VTUɿॴ༗ݖͱआ༻
    • 所有者の権限
    1. リソースがいつ解放されるかを制御出来る。
    2. リソースを immutable な形で多くの borrower に貸し与えることが出来る。
    3. リソースを mutable な形で1つの borrower に貸し与えることが出来る。
    • 所有者の制約
    1. 既に誰かに貸し与えたリソースを変更したり、mutable な形で別の誰かに
    貸し与えたりする事は出来ない。
    2. 既に誰かに mutable な形で貸し与えたリソースは、アクセスすることが出
    来ない。
    © 2017 Retrieva, Inc. 21

    View Slide

  22. 3VTUɿࢀߟ63-
    • "プログラミング⾔語Rust"
    • https://rust-lang-ja.github.io/the-rust-programming-language-
    ja/1.6/book/
    • "Rustは何が新しいのか(基本的な⾔語機能の紹介) - いもす
    研 (imos laboratory)"
    • https://imoz.jp/note/rust-functions.html
    • "RustにおけるOwnershipの仕組み - Nao Minami's Blog”
    • http://south37.hatenablog.com/entry/2014/12/14/Rustにおける
    Borrowingの仕組み
    © 2017 Retrieva, Inc. 22

    View Slide

  23. +VMJB
    • 科学技術計算を得意とするプログラミング⾔語
    • 数値計算、⾏列演算を⾼速にやりたい(RやNumpyに競合)
    • コンパイル⾔語に⽐肩する実⾏速度
    • シンプルな⾔語機能と豊富な標準ライブラリ
    • 引数の型により実⾏される関数が決まる動的ディスパッチ
    • Lispのような強⼒なマクロ機能
    © 2017 Retrieva, Inc. 23

    View Slide

  24. +VMJB
    • 例
    • Jupyter Notebook 連携(グラフプロット)
    • ベクトル、⾏列計算
    © 2017 Retrieva, Inc. 24

    View Slide

  25. +VMJBɿߴ଎ͳ GPSϧʔϓ
    • 素数出⼒プログラム
    • ⼆重ループでゴリ押し
    • Python 2:43.6秒
    • Python 3:20.7秒
    • Julia:1.2秒
    • 適当に書いても速度が出る
    © 2017 Retrieva, Inc. 25
    # Julia
    for i = 1000000:1001000
    for j = 2:i
    i % j == 0 && break
    j == i - 1 && println( i )
    end
    end
    # Python
    for i in range(1000000, 1001001):
    for j in range(2, i):
    if i % j == 0:
    break
    if j == i - 1:
    print( i )

    View Slide

  26. +VMJBɿߴ଎ͳ GPSϧʔϓ
    • ⾏列に対する、組み込みの x+y
    と、全要素の⾜し合わせ
    add(x,y) の速度⽐較
    • 遜⾊ない速度が出る
    © 2017 Retrieva, Inc. 26
    function add(x, y)
    output = similar(x)
    @inbounds for i in 1:endof(x)
    output[i] = x[i] + y[i]
    end
    return output
    end
    x = randn(100_000)
    y = randn(100_000)
    println("x + y")
    x + y
    for _ in 1:5 @time x + y end
    println("add(x, y)")
    add(x, y)
    for _ in 1:5 @time add(x, y) end
    x + y
    0.000578 seconds
    0.000688 seconds
    ...
    add(x, y)
    0.000501 seconds
    0.000456 seconds
    ...

    View Slide

  27. +VMJBɿ଎౓ͷཧ༝
    • Juliaコードを、型推論によって型付きJuliaコードに変換
    • 実⾏時の曖昧性を排除
    • LLVMによってネイティブコードに変換
    • Python などのような VM を使う⾔語より⾼速
    • 例
    © 2017 Retrieva, Inc. 27

    View Slide

  28. +VMJBɿ1ZUIPOͱͷ࿈ܞ
    • PyCall というライブラリにより、Python で計算させた結果を
    Julia で利⽤できる
    • 例:Julia で前処理して、scikit-learn などに渡して計算させる
    • 注意:そのまま Pkg.add(ʻPyCallʼ) でインストールすると、Conda を
    新たにインストールしようとする
    © 2017 Retrieva, Inc. 28

    View Slide

  29. +VMJBɿࢀߟ63-
    • "Getting Started · The Julia Language”
    • https://docs.julialang.org/en/stable/manual/getting-started/
    • "Julia-Tutorial / Julia⾼速チュートリアル.ipynb"
    • https://nbviewer.jupyter.org/github/bicycle1885/Julia-
    Tutorial/blob/master/Julia%E9%AB%98%E9%80%9F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%8
    3%AB.ipynb
    • "JuliaTokyo7/最新Juliaチュートリアル.ipynb at master ·
    bicycle1885/JuliaTokyo7”
    • https://github.com/bicycle1885/JuliaTokyo7/blob/master/%E6%9C%80%E6%96%B0Julia%E3%83%81%E3%83%A5%E3%83%BC%E3%83
    %88%E3%83%AA%E3%82%A2%E3%83%AB.ipynb
    • "JupyterでJuliaを動かして回帰分析をやってみる。 - Qiita”
    • http://qiita.com/kenmatsu4/items/b77ecec75418cbaa2212
    • "Python使いをJuliaに引き込むサンプル集 | mwSoft”
    • http://www.mwsoft.jp/programming/julia/python_to_julia.html
    © 2017 Retrieva, Inc. 29

    View Slide

  30. © 2017 Retrieva, Inc.

    View Slide