Weitere ähnliche Inhalte Ähnlich wie 20130316 プログラミング言語Go (20) Mehr von Yoshifumi Yamaguchi (8) Kürzlich hochgeladen (12) 20130316 プログラミング言語Go2. メッセージ
21世紀のプログラミング言語で、クラ
ウド時代を生き抜くコアインフラの最
適化を!
2
6. お前、誰よ?
• Pythonが好きです
• 翻訳
「Java開発者のための関数プログラミング」
オライリー・ジャパン
2012年06月発行 1,365円 (Ebook)
「Learn You Some Erlang for Great Good!」
オーム社
絶賛翻訳中 価格未定 (がんばります...)
6
13. 実行速度&ビルド
実行速度
出典:The Computer Language Benchmarks Game
LL
Go
http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php
13
14. 実行速度&ビルド
ビルド
• ビルドファイルを作成する必要がない
• 3rdパーティーパッケージは勝手に取得
ソースコード ビルド
package hoge $ cd $GOPATH
$ go get
import ( $ go build -o main
“github.com/foo/go-spam” $ ./main
“bitbucket.org/gopher/bar”
…
)
func SomeProcess(…) {…}
14
16. 言語仕様
強く柔軟な型付け
強い型付け
ダメな例 良い例
type JPY float64 type JPY float64
type USD float64 type USD float64
func SomeFunc() JPY { func Exchange(u USD) JPY {
j := JPY(1000) return JPY(u * 100)
u := USD(10) }
return j + u func SomeFunc() JPY {
} j := JPY(1000)
u := USD(10)
return j + Exchange(u)
型推論 }
16
17. 言語仕様
強く柔軟な型付け
柔軟な型付け
Goではstructとinterfaceが定義できる
• struct
– フィールドとメソッドを宣言/定義
• interface
– メソッドの型定義のみを宣言
17
18. 言語仕様
強く柔軟な型付け
柔軟な型付け(例: io.Readerの定義)
io.Readerの定義
type Reader interface {
Read(p []byte) (n int, err error)
}
io.Readerとみなされる
os.Fileの定義
type File struct {
// filtered and private fields
}
func (f *File) Read(b []byte) (n int, err error)
18
19. 言語仕様
強く柔軟な型付け
柔軟な型付け(例: CSVファイルの読み込み)
import (
“encoding/csv” os.Fileはio.Readerを実
“fmt” 装している
“os”
) io.Readerを引数にとる
… 関数
file, _ := os.Open(“hoge.csv”)
reader := csv.NewReader(file)
records, _ := reader.ReadAll()
記述力 大!
for i, r := range records {
fmt.Println(r[1])
}
…
19
20. 言語仕様
Intel CPUと言語の歴史
8086-8088 i386 Pentium Xeon Pentium D Core Duo Xeon Quad Core i7
1978 1985 1993 2000 2005 2006 2008
マルチコアCPU時代
1971 1987 1995 2009
圧倒的現代感!!!!!
1983 1991 1993 2000
20
21. 言語仕様
並行プログラミング
言語仕様として並行プログラミングをサポート
• goroutine
• channel
21
22. 言語仕様
goroutine
簡単な記述で並列(非同期)処理が可能に
同期 非同期
Foo() go Foo()
Bar() go Bar()
SomeFunc() SomeFunc()
“go” と書けば新しい
goroutineが立ち上がる
22
23. 言語仕様
channel
複数のgoroutine間でのやり取りができる
イメージ コード例
func ProcessA(c chan int) {
…
c <- SomeProcessA()
Process B Process A …
}
Channel C
func ProcessB(c chan int) {
…
SomeProcessB(<-c)
…
}
23
25. 標準パッケージ
豊富な標準パッケージ
“Battery included”と呼ばれるPython並
archive crypto database errors image net regexp unicode
tar aes sql expvar color http syntax utf16
zip cipher driver flag draw cgi runtime utf8
bufio des debug fmt gif fcgi cgo unsafe
builtin dsa dwarf go jpeg httptest debug
bytes ecdsa elf ast png httputil pprof
compress elliptic gosym build index pprof sort
bzip2 hmac macho doc suffixarray mail strconv
flate md5 pe parser io rpc strings
gzip rand encoding printer ioutil jsonrpc sync
lzw rc4 ascii85 scanner log smtp atomic
zlib rsa asn1 token syslog textproto syscall
container sha1 base32 hash math url testing
heap sha256 base64 adler32 big os iotest
list sha512 binary crc32 cmplx exec quick
ring subtle csv crc64 rand signal text
tls gob fnv mime user scanner
x509 hex html multipart path tabwriter
pkix json template filepath template
pem reflect pars
xml e
time
http://golang.org/pkg/
25
26. 標準パッケージ
豊富な標準パッケージ
準標準パッケージ
標準ではないがコアメンバーが管理している
レポジトリ名
crypto net image
bcrypt otr dict bmp
blowfish pbkdf2 html testdata
bn256 poly1305 atom tiff
cast5 ripemd160 testdata
curve25519 salsa20 webkit
md4 salsa scripted
nacl scrypt idna
box ssh ipv4
secretbox terminal proxy
ocsp test publicsuffix
openpgp twofish spdy
armor xtea websocket
clearsign xts
elgamal
errors
packet https://code.google.com/p/go/source/browse?repo=xxxxx
s2k
26
28. 標準パッケージ
便利な標準ツール群
Goでの開発を助ける標準ツール
• go build パッケージをビルド
• go get 必要なパッケージを取得
• go install 必要なパッケージを取得&ビルド
• go run 一時的にビルドし実行
• go test テストとベンチマークを実行
• gofmt フォーマットを直してくれる
• godoc ドキュメントを生成
28
30. 事例
vitess (YouTube)
• vitess (vtocc)
• MySQLのロードバランサ
– YouTubeの全MySQLクエリをさばいている
– Rowキャッシュとかもしてる
• プレゼンはここで見られます
30
31. 事例
vitess (YouTube)
• Goを採用した理由
1. CとPythonの間で書きやすく簡潔に書ける
• ログローテーション 105行
• コネクションプール 227行
• memcacheクライアント 250行
2. ビルド&テストのサイクルが早い
3. 標準ライブラリが豊富で楽
4. 簡潔に書ける
31
32. 事例
Doozer (Heroku)
• Doozer
• PaxosのGo実装
• Goを採用した理由
1. 言語として並行性のサポート
• goroutine
2. 標準パッケージが豊富
3. gofmt
4. 静的リンクのバイナリ
5. 文法が簡潔
32
33. 事例
IronWorker (Iron.io)
• IronWorker
• タスクキューサーバ
– Ruby on Railsで書いてたAPIサーバをGoで書きなおした
– 30台のサーバが2台に
• Goを採用した理由
1. 言語として並行性のサポート
2. 標準パッケージの豊富さ
3. 簡潔
4. ビルドが早い
33
34. 事例
他の大きな事例
• SoundCloud
– Bazookaと呼ばれるDoozerを使った社内デプロイ
ツールを始め、多くの箇所で利用
• Canonical
– JujuをPythonからGoに移行
• Atlassian
– 仮想マシンクラスタのテストシステム
• ngmoco:)
– 独自HTTPサーバ & ロガー
https://code.google.com/p/go-wiki/wiki/GoUsers
34
Hinweis der Redaktion 3年前のPyFesでもりよしさんが発表したが、2012年3月のversion 1.0のリリースはかなり充実したものだった。プロダクション環境での利用事例も増えているのでぜひ試して貰いたい。 20分という時間では語りきれない 密度高く書きました チャンネルにも型があるチャンネルに値を渡す/チャンネルから値を持ってくる演算子は矢印 147の標準パッケージcrypto: 暗号化関係encoding: フォーマット関係image: 画像関係net: 通信関係testing: テストgo: Goのソースコード解析など 全部紹介するのは大変なので下の3つだけ紹介 https://www.usenix.org/conference/lisa12/vitess-scaling-mysql-youtube-using-go https://www.usenix.org/conference/lisa12/vitess-scaling-mysql-youtube-using-go動画ではビルドは3秒で終わると言っている他にもconcurrencyとcgoについて触れていた Paxosは、信頼性の低い複数の処理ノードによるネットワークで「コンセンサス」を得るための各種手順Paxos自体は汎用的なアルゴリズムでさまざまな問題に適用できますが、最近のNoSQLの文脈で語られるのは「データストアをマルチマスター構成にしたときに、どうやってデータの整合性を効率的に確保するか」って問題へのPaxos応用です。Paxosは独立した並列なプロセスをメッセージパッシングで行うので、goroutine & channelがはまったwebsocketとか便利だった(いまは準標準パッケージ)無駄な議論をしなくて済むようになったデプロイがすごく楽簡潔に書けてとてもよい Jujuは「サービス実装・オーケストレーションフレームワーク」と呼ばれる管理ツールで、複数の物理/仮想サーバーを一括管理できる。http://backstage.soundcloud.com/tag/golang/