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
最近個人的に気になるプログラミング言語おさらい Ruby, Python, Go, Rust,...
Search
Kei Shiratsuchi
PRO
August 30, 2017
Technology
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
最近個人的に気になるプログラミング言語おさらい Ruby, Python, Go, Rust, Julia
レトリバセミナー 2017/03/15
Movie:
https://www.youtube.com/watch?v=okwJ_Mppl74
Kei Shiratsuchi
PRO
August 30, 2017
More Decks by Kei Shiratsuchi
See All by Kei Shiratsuchi
モノリスとマイクロサービスの橋渡し - ベターからモアベターへ
kei_s
PRO
0
130
なぜ リアーキテクティング専任チームを作ったのか
kei_s
PRO
2
1.7k
実践 Rails アソシエーションリファクタリング / Rails association refactoring in practice
kei_s
PRO
8
9.9k
「Go言語でつくるインタプリタ」を Rust で移植してみた / "Write An Interpreter In Go" In Rust
kei_s
PRO
1
2.1k
Rust言語で作るインタプリタ / Write An Interpreter In Rust
kei_s
PRO
2
810
育児休業のご報告と、育児グッズとしてのスマートスピーカー / Parental Leave and SmartSpeaker
kei_s
PRO
0
900
「深層学習による自然言語処理」読書会 第6章2.7
kei_s
PRO
0
490
「深層学習による自然言語処理」読書会 第5章5.1
kei_s
PRO
0
500
「深層学習による自然言語処理」読書会 第2章2.1~2.5
kei_s
PRO
0
500
Other Decks in Technology
See All in Technology
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
200
GitHub Copilot app最速の発信の裏側
tomokusaba
1
200
Android の公式 Skill / Android skills
yanzm
0
160
入門!AWS Blocks
ysuzuki
1
160
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
0
230
AIのReact習熟度を測る
uhyo
2
650
SteampipeとExcel Power QueryでAWS構成定義書の作成を自動化する
jhashimoto
0
160
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
420
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
110
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
230
Bucharest Tech Week 2026 - Reinventing testing practices in the AI era
edeandrea
PRO
1
170
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
180
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
390
Product Roadmaps are Hard
iamctodd
PRO
55
12k
The Language of Interfaces
destraynor
162
27k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
The Pragmatic Product Professional
lauravandoore
37
7.3k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.7k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Crafting Experiences
bethany
1
180
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Transcript
࠷ۙݸਓతʹؾʹͳΔ ϓϩάϥϛϯάݴޠ͓͞Β͍ 3VCZ 1ZUIPO (P 3VTU +VMJB 株式会社レトリバ © 2017
Retrieva, Inc.
ࣗݾհ • ⽩⼟慧(シラツチ ケイ) • 株式会社レトリバ • 2016年4⽉⼊社 • Ruby
on Rails / JavaScript • フロントエンド側の⼈間 • ⼤学時代は複雑ネットワーク科学の研究 © 2017 Retrieva, Inc. 2
<એ> • WEB+DB PRESS Vol.100 に、弊社 のメンバーが特集記事を書きまし た。 • 特集1
作って学ぶ⼈⼯知能 • 第1章 ⼈⼯知能とはどんな技術なの か? • 第2章 ⾃然⾔語処理 • 第3章 機械学習 • 第4章 深層学習とニューラルネット ワーク • 発売中! © 2017 Retrieva, Inc. 3
ຊͷϝχϡʔ • 最新事情調査 • Ruby • Python • 弊社でまだ使っていない⾔語紹介 •
Go • Rust • Julia © 2017 Retrieva, Inc. 4
3VCZ • 弊社では製品のWebフレームワークとして、Ruby on Railsを利 ⽤ • 作者が⽇本⼈ • まつもとゆきひろ
(matz) • 開発者にも⽇本⼈が多い(ので、⽇本語の情報が多い) © 2017 Retrieva, Inc. 5
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
3VCZɿࠓޙͷಈ • バージョン3は、2.0から3倍⾼速化することを⽬指す • Ruby 3x3 プロジェクト • 東京オリンピックの前の年までに実現を⽬指す(って⾔ってた はず)
© 2017 Retrieva, Inc. 7
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
1ZUIPO • 弊社では深層学習、数値計算系のライブラリ群を利⽤ • Chainer、gensim • ⾔語特性としては Ruby と似ている(動的、インタプリタ、オ ブジェクト指向)
• 数値計算ライブラリ NumPy を中⼼に、機械学習や計算系のラ イブラリが充実している © 2017 Retrieva, Inc. 9
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
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
(P • Google が開発を主導している⾔語 • ロブ・パイク、ケン・トンプソンといった重鎮が開発 • Ruby, Python と違い、静的型付けコンパイル⾔語
• Linux, Mac OS, FreeBSD, Windows 向けにコンパイルができる • Linux と Windows で同様に動く実⾏ファイルが作成できる • Ruby/Python は(ライブラリによっては)Windowsでの動作が⾯倒 • 並⾏処理が軽量に扱える © 2017 Retrieva, Inc. 12
(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) }
(PɿنͬΆ͍ͷ • 癖が強い(?)仕様が多い • エラー処理。try/catch ではなく、err != nil チェックを噛ませる •
構造体はクラスではないので、継承を使わない • インデント数や改⾏位置のフォーマット(gofmt コマンド) • プロジェクト、ライブラリのディレクトリ構造 • 誰が書いても同じようになる • 慣れると気にならない。他の⼈のコードも読みやすい • 「Goに⼊ってはGoに従え」 © 2017 Retrieva, Inc. 14
(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
3VTU • Mozilla が開発を主導 • ベターCを⽬指すっぽい(分野としてC++と競合しそう) • 安全性、速度、並⾏性の3つのゴールにフォーカス • ガーベジコレクタなしにこれらのゴールを実現
• 他の⾔語への埋め込み、要求された空間や時間内での動作、 デバイス ドライバやオペレーティングシステムのような低レベルなコードを得 意とする • 全てのデータ競合を排除しつつも実⾏時オーバーヘッドのないコンパ イル時の安全性検査を多数持つ © 2017 Retrieva, Inc. 16
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
3VTUͷಛɿॴ༗ݖͱआ༻ • 変数の「所有権」をやり取りすることで、メモリ安全性を確保する • 違反する場合、コンパイル時にエラーにする • これにより、マルチスレッドでのデータ競合などを未然に防ぐ • 「しかし、このシステムはあるコストを持ちます。それは学習曲線です。 多くの新しいRustのユーザは「借⽤チェッカとの戦い」と好んで呼ばれる
ものを経験します。 … … … しかし、よいニュースがあります。… … …⼀度彼らが所有権システムの ルールとともにしばらく仕事をすれば、彼らが借⽤チェッカと戦うことは 少なくなっていくということです。」 © 2017 Retrieva, Inc. 18
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]); }
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); }
3VTUɿॴ༗ݖͱआ༻ • 所有者の権限 1. リソースがいつ解放されるかを制御出来る。 2. リソースを immutable な形で多くの borrower
に貸し与えることが出来る。 3. リソースを mutable な形で1つの borrower に貸し与えることが出来る。 • 所有者の制約 1. 既に誰かに貸し与えたリソースを変更したり、mutable な形で別の誰かに 貸し与えたりする事は出来ない。 2. 既に誰かに mutable な形で貸し与えたリソースは、アクセスすることが出 来ない。 © 2017 Retrieva, Inc. 21
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
+VMJB • 科学技術計算を得意とするプログラミング⾔語 • 数値計算、⾏列演算を⾼速にやりたい(RやNumpyに競合) • コンパイル⾔語に⽐肩する実⾏速度 • シンプルな⾔語機能と豊富な標準ライブラリ •
引数の型により実⾏される関数が決まる動的ディスパッチ • Lispのような強⼒なマクロ機能 © 2017 Retrieva, Inc. 23
+VMJB • 例 • Jupyter Notebook 連携(グラフプロット) • ベクトル、⾏列計算 ©
2017 Retrieva, Inc. 24
+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 )
+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 ...
+VMJBɿͷཧ༝ • Juliaコードを、型推論によって型付きJuliaコードに変換 • 実⾏時の曖昧性を排除 • LLVMによってネイティブコードに変換 • Python などのような
VM を使う⾔語より⾼速 • 例 © 2017 Retrieva, Inc. 27
+VMJBɿ1ZUIPOͱͷ࿈ܞ • PyCall というライブラリにより、Python で計算させた結果を Julia で利⽤できる • 例:Julia で前処理して、scikit-learn
などに渡して計算させる • 注意:そのまま Pkg.add(ʻPyCallʼ) でインストールすると、Conda を 新たにインストールしようとする © 2017 Retrieva, Inc. 28
+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
© 2017 Retrieva, Inc.