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

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

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

Bf7ce9b68bbb0058721906b4db15b9b5?s=128

Kei Shiratsuchi

August 30, 2017
Tweet

Transcript

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

    Retrieva, Inc.
  2. ࣗݾ঺հ • ⽩⼟慧(シラツチ ケイ) • 株式会社レトリバ • 2016年4⽉⼊社 • Ruby

    on Rails / JavaScript • フロントエンド側の⼈間 • ⼤学時代は複雑ネットワーク科学の研究 © 2017 Retrieva, Inc. 2
  3. <એ఻> • WEB+DB PRESS Vol.100 に、弊社 のメンバーが特集記事を書きまし た。 • 特集1

    作って学ぶ⼈⼯知能 • 第1章 ⼈⼯知能とはどんな技術なの か? • 第2章 ⾃然⾔語処理 • 第3章 機械学習 • 第4章 深層学習とニューラルネット ワーク • 発売中! © 2017 Retrieva, Inc. 3
  4. ຊ೔ͷϝχϡʔ • 最新事情調査 • Ruby • Python • 弊社でまだ使っていない⾔語紹介 •

    Go • Rust • Julia © 2017 Retrieva, Inc. 4
  5. 3VCZ • 弊社では製品のWebフレームワークとして、Ruby on Railsを利 ⽤ • 作者が⽇本⼈ • まつもとゆきひろ

    (matz) • 開発者にも⽇本⼈が多い(ので、⽇本語の情報が多い) © 2017 Retrieva, Inc. 5
  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
  7. 3VCZɿࠓޙͷಈ޲ • バージョン3は、2.0から3倍⾼速化することを⽬指す • Ruby 3x3 プロジェクト • 東京オリンピックの前の年までに実現を⽬指す(って⾔ってた はず)

    © 2017 Retrieva, Inc. 7
  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
  9. 1ZUIPO • 弊社では深層学習、数値計算系のライブラリ群を利⽤ • Chainer、gensim • ⾔語特性としては Ruby と似ている(動的、インタプリタ、オ ブジェクト指向)

    • 数値計算ライブラリ NumPy を中⼼に、機械学習や計算系のラ イブラリが充実している © 2017 Retrieva, Inc. 9
  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
  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
  12. (P • Google が開発を主導している⾔語 • ロブ・パイク、ケン・トンプソンといった重鎮が開発 • Ruby, Python と違い、静的型付けコンパイル⾔語

    • Linux, Mac OS, FreeBSD, Windows 向けにコンパイルができる • Linux と Windows で同様に動く実⾏ファイルが作成できる • Ruby/Python は(ライブラリによっては)Windowsでの動作が⾯倒 • 並⾏処理が軽量に扱える © 2017 Retrieva, Inc. 12
  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 <- sum // send sum to 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 := <-c, <-c // receive from c fmt.Println(x, y, x+y) }
  14. (Pɿن໿ͬΆ͍΋ͷ • 癖が強い(?)仕様が多い • エラー処理。try/catch ではなく、err != nil チェックを噛ませる •

    構造体はクラスではないので、継承を使わない • インデント数や改⾏位置のフォーマット(gofmt コマンド) • プロジェクト、ライブラリのディレクトリ構造 • 誰が書いても同じようになる • 慣れると気にならない。他の⼈のコードも読みやすい • 「Goに⼊ってはGoに従え」 © 2017 Retrieva, Inc. 14
  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
  16. 3VTU • Mozilla が開発を主導 • ベターCを⽬指すっぽい(分野としてC++と競合しそう) • 安全性、速度、並⾏性の3つのゴールにフォーカス • ガーベジコレクタなしにこれらのゴールを実現

    • 他の⾔語への埋め込み、要求された空間や時間内での動作、 デバイス ドライバやオペレーティングシステムのような低レベルなコードを得 意とする • 全てのデータ競合を排除しつつも実⾏時オーバーヘッドのないコンパ イル時の安全性検査を多数持つ © 2017 Retrieva, Inc. 16
  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
  18. 3VTUͷಛ௃ɿॴ༗ݖͱआ༻ • 変数の「所有権」をやり取りすることで、メモリ安全性を確保する • 違反する場合、コンパイル時にエラーにする • これにより、マルチスレッドでのデータ競合などを未然に防ぐ • 「しかし、このシステムはあるコストを持ちます。それは学習曲線です。 多くの新しいRustのユーザは「借⽤チェッカとの戦い」と好んで呼ばれる

    ものを経験します。 … … … しかし、よいニュースがあります。… … …⼀度彼らが所有権システムの ルールとともにしばらく仕事をすれば、彼らが借⽤チェッカと戦うことは 少なくなっていくということです。」 © 2017 Retrieva, Inc. 18
  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<i32>) { println!(”v{}", v[0]); } fn main() { let v = vec![1, 2, 3]; take(v); println!("v[0] is: {}", v[0]); }
  20. 3VTUɿࢀরͱआ༻ • v を渡す代わりに、&v を渡す。引数にも &Vec<i32> を使う。 • &T, &mut

    T は参照。所有権を「借⽤」する。 © 2017 Retrieva, Inc. 20 fn take(v: &Vec<i32>) { 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); }
  21. 3VTUɿॴ༗ݖͱआ༻ • 所有者の権限 1. リソースがいつ解放されるかを制御出来る。 2. リソースを immutable な形で多くの borrower

    に貸し与えることが出来る。 3. リソースを mutable な形で1つの borrower に貸し与えることが出来る。 • 所有者の制約 1. 既に誰かに貸し与えたリソースを変更したり、mutable な形で別の誰かに 貸し与えたりする事は出来ない。 2. 既に誰かに mutable な形で貸し与えたリソースは、アクセスすることが出 来ない。 © 2017 Retrieva, Inc. 21
  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
  23. +VMJB • 科学技術計算を得意とするプログラミング⾔語 • 数値計算、⾏列演算を⾼速にやりたい(RやNumpyに競合) • コンパイル⾔語に⽐肩する実⾏速度 • シンプルな⾔語機能と豊富な標準ライブラリ •

    引数の型により実⾏される関数が決まる動的ディスパッチ • Lispのような強⼒なマクロ機能 © 2017 Retrieva, Inc. 23
  24. +VMJB • 例 • Jupyter Notebook 連携(グラフプロット) • ベクトル、⾏列計算 ©

    2017 Retrieva, Inc. 24
  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 )
  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 ...
  27. +VMJBɿ଎౓ͷཧ༝ • Juliaコードを、型推論によって型付きJuliaコードに変換 • 実⾏時の曖昧性を排除 • LLVMによってネイティブコードに変換 • Python などのような

    VM を使う⾔語より⾼速 • 例 © 2017 Retrieva, Inc. 27
  28. +VMJBɿ1ZUIPOͱͷ࿈ܞ • PyCall というライブラリにより、Python で計算させた結果を Julia で利⽤できる • 例:Julia で前処理して、scikit-learn

    などに渡して計算させる • 注意:そのまま Pkg.add(ʻPyCallʼ) でインストールすると、Conda を 新たにインストールしようとする © 2017 Retrieva, Inc. 28
  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
  30. © 2017 Retrieva, Inc.