Lightweight Language Go
山口能迪
id:ymotongpoo
1
13/08/24(Sat)
お前、誰よ
• 山口能迪(やまぐちよしふみ)
• @ymotongpoo
• Pythonが好きです
• Goはもっと好きです
• GoCon, Go羅温泉, 電車でGo!
• 仕事でもGoを使っています
2
13/08/24(Sat)
Agenda
• What is Lightweight Language?
• Lightweight Language “Go”
• Goのすごいところ
3
13/08/24(Sat)
注意
4
今日は巻き気味で行きます!
紹介しきれないので
僕のSlideShareも
見てください
13/08/24(Sat)
What is
“Lightweight Language”?
5
13/08/24(Sat)
Lightweight programming language
A lightweight programming language is one
that is designed to have very small memory
foot...
は?
7
13/08/24(Sat)
軽量プログラミング言語
日本における軽量プログラミング言語の「軽さ」は、
英語における lightweight の意味とは大きく異なり、
プログラマの負担の軽重を指し、実行速度やメモリ消
費量に優れているという意味ではない。
Wikipedia...
どっち?
9
13/08/24(Sat)
軽量プログラミング言語
軽量プログラミング言語という単語の推進者は、
‣事前にコンパイルが不要なインタプリタ
‣動的型
‣関数オブジェクト
などの特色を備えるものを軽量プログラミング言語と分
類しているが、スクリプト言語の特色を逸脱するもので
...
軽量プログラミング言語
現在、日本で一般に軽量プログラミング言語と言った
場合、おおむね以下のようなスクリプト言語を指す。
Wikipedia,“軽量プログラミング言語”
11
‣AWK
‣ECMAScript
(ActionScript、
J...
軽量プログラミング言語
また、以下の言語なども挙げられる。一部、事前にコ
ンパイルが必要な言語も含まれる。
Wikipedia,“軽量プログラミング言語”
12
‣Clojure
‣Curl
‣Groovy
‣Haskell
‣JavaFX S...
13
だったら
13/08/24(Sat)
Goもありなんじゃね?
14
13/08/24(Sat)
Goについて
15
Rob Pike、Ken Thompson、Robert Griesemer
が2007年に着想、2009年リリース
「今、こういう言語が求められている」
1.単一のマシンでも巨大なコードベースをビルド
2.依存関係を簡単に...
Goについて
16
8086-8088
1978
i386
1985
Pentium
1993 2000
Xeon Pentium D
2005
Core Duo
2006
Xeon Quad Core i7
2008
1995
1991
19...
Goについて
16
8086-8088
1978
i386
1985
Pentium
1993 2000
Xeon Pentium D
2005
Core Duo
2006
Xeon Quad Core i7
2008
1995
1991
19...
Goについて
17
• コンパイラ言語
• Linux、FreeBSD、Mac OS X、Windows
• 強い静的型付け
• GC
• 並列プログラミング
• ビルド、フォーマット、テスト、ドキュメン
トシステムを内蔵
13/08/24(S...
Lightweight Language Go
18
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい
• 実装が簡単
• 文法や機能が最小限
• インタプリタ
• 動的型
• 関数オブジェクト
13/...
Lightweight Language Go
19
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい
• 実装が簡単
• 文法や機能が最小限
• インタプリタ
• 動的型
• 関数オブジェクト
13/...
Goのメモリフットプリント
• メモリフットプリント
• Mark & Sweep GCが常に走っている
• 未使用のimportや変数はコンパイル時にエラー
20
メモリフットプリントは普通です!!
13/08/24(Sat)
Lightweight Language Go
21
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい → OK
• 実装が簡単
• 文法や機能が最小限
• インタプリタ
• 動的型
• 関数オブジェク...
実装が簡単なGo
• 「実装が簡単」を次の3つの要素に分解
• 文法が簡単
• ライブラリ呼び出しが簡単
• 実行が簡単
22
13/08/24(Sat)
実装が簡単なGo
• 文法が簡単
• CとPythonの中間ぐらいの文法
• “A Tour of Go”をやれば2時間で習得可能
• 型推論による短い記述
23
13/08/24(Sat)
実装が簡単なGo
24
package	
  main
import	
  "fmt"
type	
  Person	
  struct	
  {
	
  	
  	
  	
  Name	
  string
	
  	
  	
  	
  A...
実装が簡単なGo
• ライブラリ呼び出しが簡単
• ディレクトリ構造に応じたパッケージシステム
• 外部ライブラリも直接レポジトリを指定
• 豊富な標準パッケージ
• 147におよぶ標準パッケージ
25
13/08/24(Sat)
実装が簡単なGo
26
archive
     tar
     zip
bufio
builtin
bytes
compress
     bzip2
     flate
     gzip
     lzw
     zlib
contai...
実装が簡単なGo
27
package	
  main
import	
  (
	
  	
  	
  	
  "encoding/json"
	
  	
  	
  	
  "flag"
	
  	
  	
  	
  "fmt"
	
  	...
実装が簡単なGo
• 実行が簡単
• ライブラリ依存関係を自動で解決
• 必要なライブラリを自動で取得
• Git、Mercurial、Bazaar、Subversion
• 高速なビルド
• 静的実行バイナリ
28
13/08/24(Sat)
実装が簡単なGo
29
$	
  go	
  get
$	
  go	
  build
$	
  ls
main
$	
  ./main
オラしんのすけ、5歳だゾ
プロジェクトの場合 単一ファイルの場合
$	
  go	
  run	
  ma...
Lightweight Language Go
30
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい → OK
• 実装が簡単 → OK
• 文法や機能が最小限
• インタプリタ
• 動的型
• 関数...
文法/機能が最小限なGo
• CとPythonの中間の最小限の文法
• A Tour of Goをひと通り見れば習得可能
• クラスシステムはない
• interfaceによるダックタイピング
• コンポジション
31
13/08/24(Sat)
文法/機能が最小限なGo
32
type	
  Person	
  interface	
  {
	
  	
  	
  	
  Greet()	
  string
}
type	
  Japanese	
  struct	
  {
	
  	...
Lightweight Language Go
33
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい → OK
• 実装が簡単 → OK
• 文法や機能が最小限 → OK
• インタプリタ
• 動的型...
Goのインタプリタ
34
そんなものはない!!
13/08/24(Sat)
Lightweight Language Go
35
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい → OK
• 実装が簡単 → OK
• 文法や機能が最小限 → OK
• インタプリタ → NG
...
Goの動的型?
• Go自体はそもそも強い静的型付け
• 型推論とダックタイピングで柔軟な記述がで
きる
36
13/08/24(Sat)
Goの動的型?
37
type	
  Reader	
  interface	
  {
	
   Read(p	
  []byte)	
  (n	
  int,	
  err	
  error)
}
type	
  File	
  struct...
Lightweight Language Go
38
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい → OK
• 実装が簡単 → OK
• 文法や機能が最小限 → OK
• インタプリタ → NG
...
Goの関数オブジェクト
• Goでは関数は第1級オブジェクト
• クロージャも沢山使います
39
13/08/24(Sat)
Goの関数オブジェクト
40
package	
  main
import	
  (
	
  	
  	
  	
  "fmt"
	
  	
  	
  	
  "net/http"
)
func	
  hello(w	
  http.Resp...
Lightweight Language Go
41
• Lightweight Languageの要素を検証
• メモリフットプリントが小さい → OK
• 実装が簡単 → OK
• 文法や機能が最小限 → OK
• インタプリタ → NG
...
結論: GoはLL
42
13/08/24(Sat)
Goのすごいところ
43
• goroutine & channel
• goツール
13/08/24(Sat)
goroutine & channelがすごい
44
Foo()
Bar()
Buz()
同期
go	
  Foo()
go	
  Bar()
Buz()
非同期
“go” と書くだけで新しいgoroutineが立ち上がる
言語仕様で非同期処理...
goroutine & channelがすごい
45
Process B Process A
Channel C
複数のgoroutine間でのやり取り
func	
  ProcessA(c	
  chan	
  int)	
  {
	
   ...
Goツールがすごい
46
‣go build	

	

 パッケージをビルド
‣go get	

 	

 必要なパッケージを取得
‣go install	

 必要なパッケージを取得&ビルド
‣go run	

 	

 一時的にビルドし実行...
結論: GoはすごいLL
47
13/08/24(Sat)
Upcoming SlideShare
Loading in …5
×

20130824 Lightweight Language "Go" @LL matsuri

3,138 views

Published on

GoはLLだ!ということを無理矢理結論付けた発表です!

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

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

No notes for slide

20130824 Lightweight Language "Go" @LL matsuri

  1. 1. Lightweight Language Go 山口能迪 id:ymotongpoo 1 13/08/24(Sat)
  2. 2. お前、誰よ • 山口能迪(やまぐちよしふみ) • @ymotongpoo • Pythonが好きです • Goはもっと好きです • GoCon, Go羅温泉, 電車でGo! • 仕事でもGoを使っています 2 13/08/24(Sat)
  3. 3. Agenda • What is Lightweight Language? • Lightweight Language “Go” • Goのすごいところ 3 13/08/24(Sat)
  4. 4. 注意 4 今日は巻き気味で行きます! 紹介しきれないので 僕のSlideShareも 見てください 13/08/24(Sat)
  5. 5. What is “Lightweight Language”? 5 13/08/24(Sat)
  6. 6. Lightweight programming language A lightweight programming language is one that is designed to have very small memory footprint, is easy to implement (important when porting a language), and/or has minimalist syntax and features. Wikipedia,“Lightweight programming language” 6 13/08/24(Sat)
  7. 7. は? 7 13/08/24(Sat)
  8. 8. 軽量プログラミング言語 日本における軽量プログラミング言語の「軽さ」は、 英語における lightweight の意味とは大きく異なり、 プログラマの負担の軽重を指し、実行速度やメモリ消 費量に優れているという意味ではない。 Wikipedia,“軽量プログラミング言語” 8 13/08/24(Sat)
  9. 9. どっち? 9 13/08/24(Sat)
  10. 10. 軽量プログラミング言語 軽量プログラミング言語という単語の推進者は、 ‣事前にコンパイルが不要なインタプリタ ‣動的型 ‣関数オブジェクト などの特色を備えるものを軽量プログラミング言語と分 類しているが、スクリプト言語の特色を逸脱するもので はない。 Wikipedia,“軽量プログラミング言語” 10 13/08/24(Sat)
  11. 11. 軽量プログラミング言語 現在、日本で一般に軽量プログラミング言語と言った 場合、おおむね以下のようなスクリプト言語を指す。 Wikipedia,“軽量プログラミング言語” 11 ‣AWK ‣ECMAScript (ActionScript、 JavaScript、JScript) ‣Lua ‣Perl ‣PHP ‣Python ‣Ruby ‣Shell Script (bash, csh, etc...) ‣Tcl ‣VBScript 13/08/24(Sat)
  12. 12. 軽量プログラミング言語 また、以下の言語なども挙げられる。一部、事前にコ ンパイルが必要な言語も含まれる。 Wikipedia,“軽量プログラミング言語” 12 ‣Clojure ‣Curl ‣Groovy ‣Haskell ‣JavaFX Script ‣PowerShell ‣Scala ‣Scheme 13/08/24(Sat)
  13. 13. 13 だったら 13/08/24(Sat)
  14. 14. Goもありなんじゃね? 14 13/08/24(Sat)
  15. 15. Goについて 15 Rob Pike、Ken Thompson、Robert Griesemer が2007年に着想、2009年リリース 「今、こういう言語が求められている」 1.単一のマシンでも巨大なコードベースをビルド 2.依存関係を簡単に解決 3.強い型付け・柔軟・型解決も素早い型システム 4.GCがありマルチコアの並列性サポートする 5.LLな書きやすさ 13/08/24(Sat)
  16. 16. Goについて 16 8086-8088 1978 i386 1985 Pentium 1993 2000 Xeon Pentium D 2005 Core Duo 2006 Xeon Quad Core i7 2008 1995 1991 1971 1983 1993 1987 2000 2009 マルチコアCPU時代 13/08/24(Sat)
  17. 17. Goについて 16 8086-8088 1978 i386 1985 Pentium 1993 2000 Xeon Pentium D 2005 Core Duo 2006 Xeon Quad Core i7 2008 1995 1991 1971 1983 1993 1987 2000 2009 マルチコアCPU時代 圧倒的現代感!!!!!! 13/08/24(Sat)
  18. 18. Goについて 17 • コンパイラ言語 • Linux、FreeBSD、Mac OS X、Windows • 強い静的型付け • GC • 並列プログラミング • ビルド、フォーマット、テスト、ドキュメン トシステムを内蔵 13/08/24(Sat)
  19. 19. Lightweight Language Go 18 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい • 実装が簡単 • 文法や機能が最小限 • インタプリタ • 動的型 • 関数オブジェクト 13/08/24(Sat)
  20. 20. Lightweight Language Go 19 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい • 実装が簡単 • 文法や機能が最小限 • インタプリタ • 動的型 • 関数オブジェクト 13/08/24(Sat)
  21. 21. Goのメモリフットプリント • メモリフットプリント • Mark & Sweep GCが常に走っている • 未使用のimportや変数はコンパイル時にエラー 20 メモリフットプリントは普通です!! 13/08/24(Sat)
  22. 22. Lightweight Language Go 21 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい → OK • 実装が簡単 • 文法や機能が最小限 • インタプリタ • 動的型 • 関数オブジェクト 13/08/24(Sat)
  23. 23. 実装が簡単なGo • 「実装が簡単」を次の3つの要素に分解 • 文法が簡単 • ライブラリ呼び出しが簡単 • 実行が簡単 22 13/08/24(Sat)
  24. 24. 実装が簡単なGo • 文法が簡単 • CとPythonの中間ぐらいの文法 • “A Tour of Go”をやれば2時間で習得可能 • 型推論による短い記述 23 13/08/24(Sat)
  25. 25. 実装が簡単なGo 24 package  main import  "fmt" type  Person  struct  {        Name  string        Age    int } func  (p  *Person)  Greet()  {        fmt.Printf("オラ%v、%v歳だゾ",  p.Name,  p.Age) } func  main()  {        p  :=  Person{"しんのすけ",  5}        p.Greet() } メソッド struct宣言 型推論 13/08/24(Sat)
  26. 26. 実装が簡単なGo • ライブラリ呼び出しが簡単 • ディレクトリ構造に応じたパッケージシステム • 外部ライブラリも直接レポジトリを指定 • 豊富な標準パッケージ • 147におよぶ標準パッケージ 25 13/08/24(Sat)
  27. 27. 実装が簡単なGo 26 archive      tar      zip bufio builtin bytes compress      bzip2      flate      gzip      lzw      zlib container      heap      list      ring crypto      aes      cipher      des      dsa      ecdsa      elliptic      hmac      md5      rand      rc4      rsa      sha1      sha256      sha512      subtle      tls      x509           pkix database      sql           driver debug      dwarf      elf      gosym      macho      pe encoding      ascii85      asn1      base32      base64      binary      csv      gob      hex      json      pem      xml errors expvar flag fmt go      ast      build      doc      parser      printer      scanner      token hash      adler32      crc32      crc64      fnv html      template image      color      draw      gif      jpeg      png index      suffixarray io      ioutil log      syslog math      big      cmplx      rand mime      multipart net      http           cgi           fcgi           httptest           httputil           pprof      mail      rpc           jsonrpc      smtp      textproto      url os      exec      signal      user path      filepath reflect regexp      syntax runtime      cgo      debug      pprof sort strconv strings sync      atomic syscall testing      iotest      quick text      scanner      tabwriter      template           parse time unicode      utf16      utf8 unsafe http://golang.org/pkg/ 13/08/24(Sat)
  28. 28. 実装が簡単なGo 27 package  main import  (        "encoding/json"        "flag"        "fmt"        "html/template"        "regexp"        "github.com/mattn/go-­‐sqlite3"        "github.com/ymotongpoo/go-­‐twitter/twitter" ) ... 13/08/24(Sat)
  29. 29. 実装が簡単なGo • 実行が簡単 • ライブラリ依存関係を自動で解決 • 必要なライブラリを自動で取得 • Git、Mercurial、Bazaar、Subversion • 高速なビルド • 静的実行バイナリ 28 13/08/24(Sat)
  30. 30. 実装が簡単なGo 29 $  go  get $  go  build $  ls main $  ./main オラしんのすけ、5歳だゾ プロジェクトの場合 単一ファイルの場合 $  go  run  main.go オラしんのすけ、5歳だゾ ビルドファイルが必要ない 13/08/24(Sat)
  31. 31. Lightweight Language Go 30 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい → OK • 実装が簡単 → OK • 文法や機能が最小限 • インタプリタ • 動的型 • 関数オブジェクト 13/08/24(Sat)
  32. 32. 文法/機能が最小限なGo • CとPythonの中間の最小限の文法 • A Tour of Goをひと通り見れば習得可能 • クラスシステムはない • interfaceによるダックタイピング • コンポジション 31 13/08/24(Sat)
  33. 33. 文法/機能が最小限なGo 32 type  Person  interface  {        Greet()  string } type  Japanese  struct  {        Namae  string } func  (j  *Japanese)  Greet()  string  {        return  "こんにちは"  +  Namae  +  "です" } type  American  struct  {        Name  string } func  (a  *American)  Greet()  string  {        return  "Hi,  I’m  "  +  Name   } 13/08/24(Sat)
  34. 34. Lightweight Language Go 33 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい → OK • 実装が簡単 → OK • 文法や機能が最小限 → OK • インタプリタ • 動的型 • 関数オブジェクト 13/08/24(Sat)
  35. 35. Goのインタプリタ 34 そんなものはない!! 13/08/24(Sat)
  36. 36. Lightweight Language Go 35 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい → OK • 実装が簡単 → OK • 文法や機能が最小限 → OK • インタプリタ → NG • 動的型 • 関数オブジェクト 13/08/24(Sat)
  37. 37. Goの動的型? • Go自体はそもそも強い静的型付け • 型推論とダックタイピングで柔軟な記述がで きる 36 13/08/24(Sat)
  38. 38. Goの動的型? 37 type  Reader  interface  {   Read(p  []byte)  (n  int,  err  error) } type  File  struct  {   //  filtered  and  private  fields } func  (f  *File)  Read(b  []byte)  (n  int,   err  error) io.Readerの定義 os.Fileの定義 func  Fscanln(r  io.Reader,   a  ...interface{})  (n  int,  err   error) type  Buffer  struct  {   //  filtered  and  private  fields } func  (b  *Buffer)  Read(b  []byte)  (n   int,  err  error) bytes.Bufferの定義 fmt.Fscanlnの定義 io.Readerを実装 os.Fileもbytes.BufferもOK 13/08/24(Sat)
  39. 39. Lightweight Language Go 38 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい → OK • 実装が簡単 → OK • 文法や機能が最小限 → OK • インタプリタ → NG • 動的型 → OK • 関数オブジェクト 13/08/24(Sat)
  40. 40. Goの関数オブジェクト • Goでは関数は第1級オブジェクト • クロージャも沢山使います 39 13/08/24(Sat)
  41. 41. Goの関数オブジェクト 40 package  main import  (        "fmt"        "net/http" ) func  hello(w  http.ResponseWriter,  r  *http.Request)  {        fmt.Fprintln(w,  "Hello,  Gopher") } func  main()  {        http.HandleFunc("/",  hello)        http.ListenAndServe(":8080",  nil) } 関数オブジェクト 13/08/24(Sat)
  42. 42. Lightweight Language Go 41 • Lightweight Languageの要素を検証 • メモリフットプリントが小さい → OK • 実装が簡単 → OK • 文法や機能が最小限 → OK • インタプリタ → NG • 動的型 → OK • 関数オブジェクト → OK 13/08/24(Sat)
  43. 43. 結論: GoはLL 42 13/08/24(Sat)
  44. 44. Goのすごいところ 43 • goroutine & channel • goツール 13/08/24(Sat)
  45. 45. goroutine & channelがすごい 44 Foo() Bar() Buz() 同期 go  Foo() go  Bar() Buz() 非同期 “go” と書くだけで新しいgoroutineが立ち上がる 言語仕様で非同期処理をサポート 簡単な記述で非同期(並列)処理が可能に 13/08/24(Sat)
  46. 46. goroutine & channelがすごい 45 Process B Process A Channel C 複数のgoroutine間でのやり取り func  ProcessA(c  chan  int)  {   …   c  <-­‐  SomeProcessA()   … } func  ProcessB(c  chan  int)  {   …   SomeProcessB(<-­‐c)   … } イメージ コード例 13/08/24(Sat)
  47. 47. Goツールがすごい 46 ‣go build パッケージをビルド ‣go get 必要なパッケージを取得 ‣go install 必要なパッケージを取得&ビルド ‣go run 一時的にビルドし実行 ‣go test テストとベンチマークを実行 ‣gofmt フォーマットを直してくれる ‣godoc ドキュメントを生成 標準ツールが大変便利 13/08/24(Sat)
  48. 48. 結論: GoはすごいLL 47 13/08/24(Sat)

×