Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)

3,339 views

Published on

プログラミング言語 Go は Google が 2009 年秋にオープンソースで公開した新しいプログラミング言語です。C や C++ のようなコンパイル言語の良さをもちつつ、Python のような動的言語でのプログラムの書き易さを兼ねそなえた特徴をもっています。クラスを使わないオブジェクト指向の言語で、コンカレントに実行するための仕組みもそなえています。 プログラミングをより速く、より生産的に、そしてより楽しくしてくれる新しいプログラミング言語 Go について説明します。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,339
On SlideShare
0
From Embeds
0
Number of Embeds
624
Actions
Shares
0
Downloads
24
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)

  1. 1. Revised v4Presenter プログラミング言語Go 鵜飼文敏 / Google Software Engineer
  2. 2. 今日の内容 godentaku - Goで作った電卓 入出力の基本 sliceの使い方 型システム: struct, pointer, interface goパッケージ ローカル・サードパーティ 使い方・作り方
  3. 3. Go言語とは? 新しいシステムプログラミング言語 Googleが設計・開発 Rob Pike, Ken Thompson, Robert Griesemer, Russ Cox, Ian Lance Taylerなど 2009/11/10にオープンソースとして公開 http://golang.org コントリビュータ: 125名 (2010/09)
  4. 4. Go言語の特徴 静的型付け・型安全 ダックタイピング 短いコンパイル時間 大規模プログラミング可能 ネットワーキング マルチコア 主流プログラミング言語 C++, Java ライトウェイト言語 Python, Rubyなど
  5. 5. What's new? DevFest (2010/3)から complex型 x := m[k] がpanicしなくなった。 s[0:n] が s[:n]に panic(), recover() goinstallコマンド gomakeコマンド ($GOOS, $GOARCH, ...) goprofコマンド Go dashboard new package crypto/ripemd160, hash/crc64, crypto/rand, utf16, nntp, mime/multipart, html, net/textp roto, net/dict, crypto/ocsp, runtime/pprof, http/pprof, cmath, rpc/jsonrpc, go/typechecker once -> sync.Once()
  6. 6. The Go Playground
  7. 7. 今日のお題:電卓 $ ./godentaku >1+2*3 7 >y=x*x + (a+b)*x + a*b (((x * x) + ((a + b) * x)) + (a * b)) >a=1 1 >b=2 2 >y (((x * x) + (3 * x)) + 2) >x=5 5 >y 42
  8. 8. godentaku 仕様 式を入力して、それを評価して出力 四則演算 変数 言語の基本機能で実装 パッケージをあまり使わない (fmt, os, bufioのみ)
  9. 9. godentaku 入力 標準入力から一行づつバイト列を読み取る 式を解析 バイト列を抽象構文木に変換 式を評価 抽象構文木を解釈・実行 結果を出力 結果を文字列にして標準出力に 繰り返す
  10. 10. 入力: bufio http://golang.org/pkg/bufio/#Reader.ReadBytes func (*Reader) ReadBytes func (b *Reader) ReadBytes(delim byte) (line []byte, err os.Error) ReadBytes reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter. If ReadBytes encounters an error before finding a delimiter, it returns the data read before the error and the error itself (often os.EOF). ReadBytes returns err != nil if and only if line does not end in delim. import ("bufio"; "os") in := bufio.NewReader(os.Stdin) line, err := in.ReadBytes('n') if err != nil { ... }
  11. 11. 出力: fmt http://golang.org/pkg/fmt/#Printf func Printf func Printf(format string, a ...interface{}) (n int, errno os.Error) Printf formats according to a format specifier and writes to standard output. It returns the number of bytes written and any write error encountered. import "fmt" fmt.Printf("> ") fmt.Printf("%d", i) fmt.Printf("%#v", v)
  12. 12. コンパイル&実行 % cat main.go package main import ("bufio"; "fmt"; "os") func main() { in := bufio.NewReader(os.Stdin) for { line, err := in.ReadBytes('n') if err != nil { break } fmt.Println(string(line)) } } % 6g main.go # 8g main.go % 6l main.6 # 8l main.8 % ./6.out # ./8.out
  13. 13. Read-eval-print loop package main import ("bufio"; "fmt"; "os") func readEvalPrint(in *bufio.Reader, env *Env) os.Error func main() { in := bufio.NewReader(os.Stdin) env := NewEnv() // for variable table for { err := readEvalPrint(in, env) if err != nil { break } } }
  14. 14. Read-eval-print loop func readEvalPrint(in *bufio.Reader, env *Env) os.Error { fmt.Printf("> ") line, err := in.ReadBytes('n') if err != nil { return err } ast, nbuf := Read(line) v := Eval(ast, env) fmt.Println(Print(v, env)) return nil }
  15. 15. Read: getNum func getNum(buf []byte) (n int, nbuf []byte) { n := digitVal(buf[0]) nbuf = buf[1:] for len(nbuf) > 0 { if d := digitVal(nbuf[0]); d >= 0 { n = n * 10 + d } else { break } nbuf = nbuf[1:] } return n, nbuf } func digitVal(b byte) int { if b >= '0' && b <= '9' { return int(b - '0') // int型に変換 } else { return -1 } }
  16. 16. slice sliceは配列につかうポインタ
  17. 17. Read: getSymbol func getSymbol(buf []byte) (sym string, nbuf []byte) { var i int for i = 0; i < len(buf); i++ { if !isAlpha(buf[i]) && !isDigit(buf[i]) { break } } return string(buf[0:i]), buf[i:] }
  18. 18. 抽象構文木
  19. 19. 再帰降下パーザ // stmt := expr | sym '=' expr func parseStatement(b []byte) (stmt Ast, n []byte) // expr := ['+'|'-'] term { ['+'|'-'] term } func parseExpression(b []byte) (expr Ast, n []byte) // term := factor { ['*'|'/'] factor } func parseTerm(b []byte) (term Ast, n []byte) // factor := num | symbol | '(' expr ')' func parseFactor(b []byte) (factor Ast, n []byte)
  20. 20. interface: Ast type Ast interface { String() string Eval(env* Env) Ast } Ast型の変数に代入できるのは、これらのメソッドが定義されて いる型のオブジェクト Astにいれて使う型はこれらのメソッドを定義 Astを使うほうは、これらのメソッドが利用可能
  21. 21. named type: Num type Num int func (n Num) String() string { return fmt.Sprintf("%d", int(n)) } func (n Num) Eval(env *Env) Ast { return n } func getNum(b []byte) (num Num, nbuf []byte) { ... return Num(n), nbuf } NumはAst型
  22. 22. named type: Symbol type Symbol string func (s Symbol) String() string { return string(s) } func (s Symbol) Eval(env *Env) Ast { ... } SymbolもAst型
  23. 23. map: variable table type Env struct { Var map[string]Ast; .. } func NewEnv() *Env { env := new(Env) env.Var = make(map[string]Ast) return env } func Set(env* Env, key string, n int) { env.Var[key] = Num(n) } func envValue(env* Env, key string) (n int, ok bool) { if v, found := env.Var[key]; found { .. } return 0, false }
  24. 24. structとポインタ type Point struct { x, y int } type Rect struct { min, max Point } type Rect2 struct { min, max *Point }
  25. 25. BinOp type Ast interface { .. } type BinOp struct { Op byte; Left, Right Ast } func (b BinOp) String() string {..} func (b BinOp) Eval(env *Env) Ast { .. } func parseExpression(b []byte) (expr Ast, n []byte) { expr, n = parseTerm(b) for n[0] == '+' || n[0] == '-' { op := n[0]; var term Ast term, n = parseTerm(n[1:]) expr = BinOp{Op: op, Left:expr, Right:term} } return expr, n } BinOpもAst型
  26. 26. interface: memory layout
  27. 27. interface type-switch func parseStatement(b []byte) (stmt Ast, n []byte) { stmt, n = parseExpression(b) if n[0] == '=' { if sym, ok := stmt.(Symbol); ok { var expr Ast expr, n = parseExpression(n[1:]) stmt = AssignOp{Var:sym, Expr:expr} } else { /* 例外処理 */ } } return stmt, n }
  28. 28. 例外処理 func readEvalPrint(in *bufio.Reader, env *Env) os.Error { defer func() { if x := recover(); x != nil { ... } }() .. Read(line) .. } func Read(b []byte) (ast Ast, n[]byte) { return parseStatement(b) } func parseStatement(b []byte) (stmt Ast, n []byte) { ... if sym, ok := stmt.(Symbol); ok { .. } else { panic("lvalue is not symbol:" + stmt.String()); } }
  29. 29. いままでのまとめ 入出力 bufio fmt 型システム int, string, .. slice map struct ポインタ interface
  30. 30. packageにする 1. ファイルを分割する メインのファイル (main.go) パッケージのファイル (godentaku.go) 2. メインのファイル import に "./godentaku" godentaku.Read(line) 3. パッケージのファイル package godentaku 大文字ではじまるシンボルがパブリック
  31. 31. packageのビルド % 6g godentaku.go % 6g main.go # main.goとgodentaku.6を読む % ls godentaku.6 godentaku.go main.6 main.go % 6l main.6 % ./6.out
  32. 32. packageディレクトリ % mkdir godentaku; mv godentaku.* godentaku/; cd godentaku % cat > Makefile include $(GOROOT)/src/Make.inc TARG=godentaku # importでつかうパッケージパス GOFILES= godentaku.go include $(GOROOT)/src/Make.pkg % gomake # コンパイルとリンク % gomake install # -> ${GOROOT}/pkg/${GOOS}_${GOARCH}/${TARG}.a
  33. 33. packageの公開 標準packageにコントリビュート codereview http://golang.org/doc/contribute.html サードパーティpackageとして公開 http://godashboard.appspot.com/package
  34. 34. サードパーティpackageの利用 インストール % goinstall goprotobuf.googlecode.com/hg/proto 利用する時 import "goprotobuf.googlecode.com/hg/proto" data, err := proto.Marshal(obj)
  35. 35. googlecode - project hosting
  36. 36. googlecode - createProject
  37. 37. Mercurial https://yourproj.googlecode.com/hg
  38. 38. hgrc % cat .hg/hgrc [paths] default = https://yourproj.googlecode.com/hg/ [ui] username = Your Name <foo@example.com> [auth] googlecode.prefix = yourproj.googlecode.com/hg/ gogolecode.username = foo@example.com googlecode.password = XXXXX googlecode.schemes = https
  39. 39. publish package 1. プロジェクトの作成 2. hg clone 3. hgrcの編集 4. ファイルの追加 hg add Makefileの編集 TARGを import path 5. hg commit 6. hg push
  40. 40. 本日のまとめ Go言語を使って 入出力の基本 型システムの基本 packageの使い方・作り方 googlecode project hostingで公開
  41. 41. 今日やらなかったこと 並行処理: goroutineとchannel Iota: enum的なもの goツール godoc, gofmt, gotest, goyacc など cgo: Cコードを呼ぶgoパッケージの作成 標準パッケージの使い方 などなど
  42. 42. May the Source be with You

×