SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Go言語を語っ
てみるか
CORE 北海道カンパニー 勉強会
2015/10/3 松浦
Goのセマンティクスというか、Goの意図みた
いなところを語ってみます。
Goの目標、 Goの特徴と理由、とか
裏にある意図、ついでに少しシンタックス
細かいシンタックスの解説はしません。
今日集まっている皆さんはレベルが高いので見りゃーわかるでし
ょ
今日は
とはいっても
少し勉強したくらいなので間違いは
勘弁です。
ごめん、私見入りまくっています。
議論のネタにしてくれると嬉!
自己紹介(堀さん向け)
部門長だけどプログラミングが好き
「C++の設計と進化」
http://www.amazon.co.jp/dp/4797328541/
「ストラウストラップのプログラミング入門」
http://www.amazon.co.jp/dp/4798119598/
「ユーザたちがつくり上げた言語 C++」
https://sites.google.com/site/sapporocpp/linguamagi
僕の公開スライド
http://www.slideshare.net/akihikomatuura/presentations
Goの目標
解決したい課題
目標
Goの特徴
継承をサポートしていない
例外がない
並列・並行処理のサポート
その他の特徴
もくじ
Goの目標
ソフトウエア開発は遅い
あまりに多くの冗長な記述、繰り返し
依存関係の複雑さとコンパイル速度
扱いにくい型システム(静的にせよ動的にせよ)
ガベージコレクションや並列処理がサポートされな
い
マルチコアコンピュータの出現
解決したい課題
目標
大きなプログラムをほんの数秒でコンパイル
依存関係の解析を容易にする
型間の関係性を定義することに時間を費やす必要がない
完全なガベージコレクション
並列実行と通信を言語としてサポート
C/C++とほぼ同等の実行効率
言語をシンプルに保つ
ようは
CやC++が使用されるようなシス
テムプログラミングの領域で、
より安全で効率よくプログラム
を書くことを目標として設計さ
れた。
とにかく、シンプルで早い。
Goの特徴
Goの特徴
継承をサポートしない
継承をサポートしない
シグネチャに基づくポリモフィズム
「埋め込み」による拡張
シンタックスを見たほうが早いです。
// User構造体の定義
type User struct {
age int
name string
}
// User型にmynameメソッドを実装する
func (this User) myname() string {
return this.name
}
var u1 User = User{47,"matuura"}
fmt.Println(u1.myname()) // matuura
// printerインターフェースの宣言
type printer interface {
myname() string
}
// printerインターフェースを受け取る関数
func Print( p printer ) {
fmt.Println(p.myname())
}
var u1 User = User{47,"matuura"}
// Print関数にUserを渡すことができる
Print(u1)
シグネチャに基づくポリモ
つまり
シグネチャさえ合致していれば、そ
のインターフェースをサポートして
いるとみなされる。
→ シグネチャに基づくポリモフィズム
「埋め込み」による拡張
type Employee struct {
User // Userを埋め込む(型のみの宣言)
no int
}
e := Employee{User : User{47,"matuura"}, no : 482 }
fmt.Println(e.myname()) // Userのメソッドを呼び出している
fmt.Println(e.no) // Employeeのデータメンバ
Go言語はオブジェクト指向
言語か?(公式FAQより)
Yesであり、Noでもあります。Go言語は型とメソッドを持ち、オ
ブジェクト志向スタイルでプログラミングが可能ですが、型の階層
はありません。Go言語における「インタフェース」のコンセプト
は、他の言語と異なるアプローチを取っており、簡単に使え、いく
つかの点で他の言語より一般的であると我々は思っています。型に
、別の型を埋め込むことでサブクラスのように機能の提供を受ける
方法もありますが、これはサブクラスと同じではありません。その
上、Go言語のメソッドはC++やJavaよりも普遍的であり、どのよ
うなデータ、たとえばビルトイン型である整数型に対してもメソッ
ドが定義可能です。構造体(クラス)である必要はありません。
型の継承を採用しなかっ
た理由は?(問題点)
従来のOO言語は、
必要以上に型の関連性を検討する必要があ
る
多重継承の複雑さ(interface継承にせよ)
柔軟性の欠如
型の継承を採用しなかっ
た理由は?(利点)
型に関連性があることを事前に宣言させ
る必要がない
不要な記述を減らす、
実装先の型に手を加える必要がない
型階層の管理や検討が不要
ちょい具体例
メソッドがひとつ、あるいはひとつもないイ
ンターフェースを用いてコンセプトを表現で
きる→インターフェースありき
後から思いついた新しいアイデアやテストの
ためにインタフェースを後付することも可能
言語がシンプルなためコンパイルが高速
余談:C++に1990年に提案さ
れたsigofキーワード
sigof(XWindowSystem)* list[N];
list[0] = new MotifWindowSystem;
list[1] = new OpenLookWindowSystem;
sigof により、シグネチャが同じであれば継承
関係を用いずともポリモフィズムを実現できる
更に余談:ジェネリック
勘の良い人は気がついたはず。
シグネチャに基づくポリモフィズムは、
C++/C#/Java なんかのジェネリックと似てい
る。
C++のSTLは、構造とアルゴリズムを分離し
、オブジェクト指向のアンチテーゼとしての
側面があった。それはGoの設計思想に影響を
与えた。。。。ような気がする。
ジェネリックは見送り
しかし、Goは以下の理由でジェネリッ
クの採用を見送った。
型システムとランタイムの複雑さ
コンパイル時間の増大
Goの特徴
例外をサポートしない
従来の例外構文の問題点
try-catch-finally 形式の例外処理機構によ
って、コードが入り組んでしまう。
(どこぞの言語などは)ごく一般的なエ
ラーをさえも特別なエラーであるかのよ
うに扱わせる傾向がある。
Goのアプローチ
戻り値として複数の値が返せる(タプル)
スタック巻き戻し時の処理実行(finallyの代わり)
エラーシグナルの発行機構と回復(throw/catchの代わり)
ようは、
基本的に普通のエラーは普通にエラー処理しようよ
本気の例外的状況で例外処理を使おうよ
func exceptionTest() {
file, err := os.Open("XXXX")
if( err != nil ) {
fmt.Println("Open error")
return
}
defer file.Close() // 必ず実行される
// このあとfileを使う
}
複数の値を返して
func panicTest() {
defer func() {
err := recover() // recoverによるパニックエラー取得
if( err != nil ) { // パニック発生状態なら
fmt.Println(err)
}
fmt.Println("exit to defer function.")
} () // defer must be function call
func(){
panic(errors.New("this is panic function."))
}() // パニック関数の実行
}
this is panic function.
exit to defer function.
本気の例外発生
Goの特徴
並列処理のサポート
現実
ある程度プログラムを書いた人なら絶対に通る道
マルチスレッドで複数のタスクを動かす
各タスクはメッセージキュー(的なもの)で通信
で、
メッセージキューを手作りしたり
オブジェクトの寿命管理に気を使ったり
コア数のスケーラビリティに追従できなかったり
スレッド生成のコストがでかくて死亡
で、スレッドプールを自作したり
。。。あるある
Goのアプローチ
並行プログラミングを言語がサポート
go キーワードによるゴルーチンの起動
チャネルによるゴルーチン間通信のサポー
ト
// チャネルのオープン
var message_ch = make(chan string)
func bigLoop() {
・・・
// メッセージ取り出し
message = <- message_ch
// メッセージ送信
message_ch <- "hello controller"
}
func controller() {
・・・
var from_BigLoop_message string
message_ch <- "hello!" // 送信
from_BigLoop_message = <- message_ch // 取り出し
fmt.Println(from_BigLoop_message)
}
go bigLoop()
go controller()
こんな感じです
しかしながら...
C++のboost.asioやnode.jsのような
非同期プログラミングはサポートされていません
。
今後に期待ですかね、バヤシさん
Goの特徴
その他の特徴
その他の特徴
ポインタがある!
ジェネリック型がない
アサートがない
クロスコンパイルサポート
スクリプトとしても実行可能
クロージャのサポート
などなど
高階関数
var clojure2 func(int) func() = func(y int) func() {
return func(){
fmt.Println("y=",y)
y=y+1
}
}
var f3 func() = clojure2(3)
f3() // y=3
f3() // y=4
ご清聴ありがとうございました
。
今回も勉強になりました。僕が。

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (9)

boost and c++11
boost and c++11boost and c++11
boost and c++11
 
DL on Azure ML with Python where type DL = Deep Learning | Deep LOVE
DL on Azure ML with Python where type DL = Deep Learning | Deep LOVEDL on Azure ML with Python where type DL = Deep Learning | Deep LOVE
DL on Azure ML with Python where type DL = Deep Learning | Deep LOVE
 
TensorFlow 3分紹介 with 速攻 windows 環境構築
TensorFlow 3分紹介 with 速攻 windows 環境構築TensorFlow 3分紹介 with 速攻 windows 環境構築
TensorFlow 3分紹介 with 速攻 windows 環境構築
 
Azure MLで機械学習をやってみよう
Azure MLで機械学習をやってみようAzure MLで機械学習をやってみよう
Azure MLで機械学習をやってみよう
 
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオンTensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
Tensorflowのチュートリアルで理解するdeep learningはじめてハンズオン
 
TensorFlowで遊んでみよう!
TensorFlowで遊んでみよう!TensorFlowで遊んでみよう!
TensorFlowで遊んでみよう!
 
【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)TensorFlow を使った機械学習ことはじめ (GDG京都 機械学習勉強会)
TensorFlow を使った 機械学習ことはじめ (GDG京都 機械学習勉強会)
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 

Ähnlich wie Go 言語を語ってみるか

磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!
uka yare
 
気の合う人達と社外で社内勉強会
気の合う人達と社外で社内勉強会気の合う人達と社外で社内勉強会
気の合う人達と社外で社内勉強会
Yu Shibatsuji
 

Ähnlich wie Go 言語を語ってみるか (20)

Studentgo1
Studentgo1Studentgo1
Studentgo1
 
磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!
 
Goはじめました
GoはじめましたGoはじめました
Goはじめました
 
Go言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンドGo言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンド
 
社内勉強会1 go lang
社内勉強会1 go lang 社内勉強会1 go lang
社内勉強会1 go lang
 
Goの深め方
Goの深め方Goの深め方
Goの深め方
 
OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島
 
勉強会の活動内容、目的について
勉強会の活動内容、目的について勉強会の活動内容、目的について
勉強会の活動内容、目的について
 
Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発Clojureの世界と実際のWeb開発
Clojureの世界と実際のWeb開発
 
気の合う人達と社外で社内勉強会
気の合う人達と社外で社内勉強会気の合う人達と社外で社内勉強会
気の合う人達と社外で社内勉強会
 
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
ジーノ先生の文系的オブジェクト指向(1) - ジーノ誕生
 
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた: Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
Soramame.Block 100行のJavaScriptで ビジュアルプログラミング言語(のフロントエンド)を作ってみた:
 
エンジニアになり1ヶ月が経って!
エンジニアになり1ヶ月が経って!エンジニアになり1ヶ月が経って!
エンジニアになり1ヶ月が経って!
 
第1回技術向上委員会
第1回技術向上委員会第1回技術向上委員会
第1回技術向上委員会
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
 
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
 
20160326 第10回 Rad Studio 勉強会@Osaka
20160326 第10回 Rad Studio 勉強会@Osaka20160326 第10回 Rad Studio 勉強会@Osaka
20160326 第10回 Rad Studio 勉強会@Osaka
 
chrome拡張機能で ブラウザにp5jsを召喚!
chrome拡張機能で ブラウザにp5jsを召喚!chrome拡張機能で ブラウザにp5jsを召喚!
chrome拡張機能で ブラウザにp5jsを召喚!
 
私なりのGo言語のご紹介
私なりのGo言語のご紹介私なりのGo言語のご紹介
私なりのGo言語のご紹介
 
プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会プログラミング同好会とすごい合同勉強会
プログラミング同好会とすごい合同勉強会
 

Mehr von Akihiko Matuura (6)

最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
アーキテクチャパターンの紹介
アーキテクチャパターンの紹介アーキテクチャパターンの紹介
アーキテクチャパターンの紹介
 
Objectie-C de ラムダ
Objectie-C de ラムダObjectie-C de ラムダ
Objectie-C de ラムダ
 
マルチコア時代の並列プログラミング
マルチコア時代の並列プログラミングマルチコア時代の並列プログラミング
マルチコア時代の並列プログラミング
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
Open Business Model
Open Business ModelOpen Business Model
Open Business Model
 

Go 言語を語ってみるか