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
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
250
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
190
OTel × Datadog で 「AI活用」を計測し、改善に繋げる
shihochan
2
440
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
280
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
160
AI時代のコスト管理を考えよう〜明日から使える実践AWSノウハウ~
yoshimi0227
0
320
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
150
脆弱性対応、どこで線を引くか
rymiyamoto
1
420
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
180
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
1
180
インシデントレスポンス演習 I / Incident Response Exercise I
ks91
PRO
0
100
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Documentation Writing (for coders)
carmenintech
77
5.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Code Review Best Practice
trishagee
74
20k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
200
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
630
Embracing the Ebb and Flow
colly
88
5.1k
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.