Upgrade to Pro — share decks privately, control downloads, hide ads and more …

About Go Lang

About Go Lang

2014/5/9 Livesense SICP倶楽部LT大会にて
Goについての解説

Livesense Inc.

May 15, 2014
Tweet

More Decks by Livesense Inc.

Other Decks in Programming

Transcript

  1. GO言語
    岡前直由

    View full-size slide

  2. Agenda
    •  Go言語とは
    •  特徴
    •  言語仕様
    •  Interface
    •  並列処理の仕組み

    View full-size slide

  3. Go言語とは
    •  Googleが開発したコンパイラ言語
    •  2009年、Robert Griesemer, Rob Pike, Ken Thompson
    •  対象:大規模なシステムソフトウェア、サーバソフトウェア
    •  低レイヤとの親和性(プロセス管理、システムコール…)
    •  C/C++に並ぶ実行速度
    •  開発者の増大に耐える、シンプルな洗練された言語セット
    C/C++に代わる新しい選択肢

    View full-size slide

  4. Go言語の特徴
    •  静的型付け + 型推論
    •  ネイティブコードへのコンパイル
    •  Linux, OS X, Free BSD, Windows
    •  DuckTyping
    •  ガベージコレクション
    •  豊富なライブラリ
    C言語に動的型付け言語の技術を取り込んだ

    View full-size slide

  5. 言語仕様
    •  基本はCの拡張
    •  関数と構造体(+メソッド)
    •  基本文法は大きく変化
    •  変数・関数宣言の型は後置
    •  var message string = "hello"
    •  変数宣言時に型の明示が不要(型推論)
    •  message := "hello"
    •  ループはfor文のみ
    •  基本方針:シンプルかつ必要十分な言語セット

    View full-size slide

  6. 言語仕様(続き)
    •  クラス階層が存在しない
    •  継承が存在しない
    •  簡易な委譲の仕組みが提供されている
    •  複数戻り値、複数同時代入
    •  a, b = b, a
    •  ポインタ演算は存在しない
    •  配列に対するアドレス加算などはできない
    •  Slice
    •  固定長配列をラップした組み込み型
    •  メモリ領域の再確保などを容易に行える
    •  第一級関数
    •  クロージャが作れる
    •  コールバック関数など
    •  Interfaceを用いたDuckTypingの実現
    •  並列処理を容易にする機能
    •  Goroutine, Channel

    View full-size slide

  7. いわゆる「クラス」の表現
    type!Vertex!struct!{!
    !!X,!Y!float64!
    }!
    !!
    func!(v!*Vertex)!Abs()!float64!{!
    !!return!math.Sqrt(v.X*v.X!+!v.Y*v.Y)!
    }!
    !!
    func!main()!{!
    !!v!:=!&Vertex{3,!4}!
    !!fmt.Println(v.Abs())!
    }!
    struct
    メソッド

    View full-size slide

  8. Interface
    •  大体Javaと同じ
    •  抽象と具象を分離
    •  ポリモーフィズムを実現
    •  実装型でimplements宣言は不要
    •  DuckTypingを実現
    type!Abser!interface!{!
    !!Abs()!float64!
    }!
    インターフェース宣言:メソッド型定義の羅列

    View full-size slide

  9. 実装型
    •  必要なメソッドを実装するだけ
    type!Vertex!struct!{!
    !!X,!Y!float64!
    }!
    !!
    func!(v!*Vertex)!Abs()!float64!{!
    !!return!math.Sqrt(v.X*v.X!+!v.Y*v.Y)!
    }!
    Vertex構造体(再掲)
    インターフェースAbserを実装しているとみなされる

    View full-size slide

  10. Interface型の利用
    •  Interface型を引数に取る関数を定義すると...
    •  Vertex型だけじゃなく、Abs()を実装した型はなんでも入れられ

    func!showAbs(a!Abser)!{!
    !!fmt.Println(a.Abs())!
    }!
    静的なDuckTypingを実現

    View full-size slide

  11. 並列処理
    Foo()
    Bar()
    Baz()
    go Foo()
    go Bar()
    Baz()
    逐次処理 並列処理
    Foo(), Bar()はそれぞれ新しい
    Goroutineで並列実行される
    •  Goroutine(ゴルーチン)という仕組みを使う
    •  スレッドのようなもの

    View full-size slide

  12. Goroutineとは
    •  概ねスレッドのようなもの
    •  Goroutine != スレッド
    •  スレッドをさらに分割したもの
    •  一つのスレッドに複数のGoroutine
    •  軽量
    •  たくさん立ち上げられる
    Goroutine
    プロセス
    スレッド スレッド
    Goroutine

    View full-size slide

  13. Goroutine間の通信
    •  1. 共有メモリを使う
    •  Mutexが用意されている
    •  2. Channelという仕組みを使う
    •  Goが推奨する並行処理モデル
    •  メッセージパッシング
    •  Go曰く:"Do not communicate by sharing memory; instead, share
    memory by communicating"
    メモリ共有によって通信するのではなく、通信によってメモリを共有しろ

    View full-size slide

  14. Channel
    func  RoutineA(c  chan  int)  {  
           ...  
           c  <-­‐  v  
           ...  
    }  
     
    func  RoutineB(c  chan  int)  {  
           ...  
           var  v  :=  <-­‐c  
           ...  
    }
    •  値の交換と同期を担ってくれる
    RoutineAが c <- v
    を実行するまで
    ブロックされる
    channel c

    View full-size slide

  15. まとめ
    •  Go言語はC/C++に動的言語の流行技術を取り込んだ
    •  速度が要求される低レイヤのシステムで生産性が上がりそう
    •  DockerはGoで書かれている
    •  Webアプリケーションとの親和性は不明
    •  Rubyと比べて優位性は無いように見える

    View full-size slide

  16. 終わり
    質疑応答

    View full-size slide