Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
The Go gopher was designed by Renée French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commo...
あまりVimの話はしません
アジェンダ
● 自己紹介
● この発表の目的
● Goの特徴と言語思想
● エディタとGoの開発ツール
● 開発ツールを支えるGoの特徴
● まとめ
自己紹介
メルカリ/ソウゾウ
上田拓也
twitter: @tenntenn
■ 好きな言語
Go, JavaScript, Lua
■ 業務
GAE/Goでメルカリアッテを作ってます
Goのコミュニティを盛り上げる仕事
Gopherを描く仕事
この発表の目的
VimmerをGo界隈に...
この発表の目的
● Goの面白い文化について知ってもらう
● Goのツールの作りやすさを知ってもらう
● Goで開発ツールを作ってもらう
○ delveプラグインほしい
Goとは?
Googleが開発しているプログラミング言語
■ 特徴
● 強力でシンプルな言語設計と文法
● 並行プログラミング
● 豊富な標準ライブラリ群
● 開発ツールの充実
● シングルバイナリ/クロスコンパイル
7
GoのSimpleとEasyの実現
■ Simple:言語自体
● 文法や言語思想
● GoroutineとChannel
■ Easy:ライブラリや開発環境
● シングルバイナリ/クロスコンパイル
● 豊富な標準パッケージ
● 開発ツール充実...
Goのエンジニアは
Vimをつかってるの?
Goのエディタ・IDE事情
■ 決まったものはない
● Vim
● Emacs
● IntelliJ
● VSCode
● Atom
好きなエディタ/IDEを
使うことができる!
エディタ間に差はないの?
統一感のあるコード
画像引用
:https://medium.com/@hoffa/400-000-github-repositories-1-billion-files-14-terabytes-of-
code-spaces-or-tabs...
開発ツールが標準であるメリット
■ みんな同じものを使う
● 同じformatter
● 同じlinter
● 同じtestingツール
● 同じドキュメント生成ツール
■ 安心の標準ツール
● メンテされる安心感
■ エディタやIDEとの連携...
開発ツールの充実 その1
■ 開発ツールが充実している
● go build
○ ビルドを行うコマンド
● go test
○ xxxx_test.goに書かれたテストコードの実行
● go doc/godoc
○ ドキュメント生成
● gof...
開発ツールの充実 その2
■ 開発ツールが充実している
● guru
○ 静的解析
● gocode
○ コード補完
● errcheck
○ エラー処理のチェック
● gorename/gomvpkg
○ リファクタリングツール
開発ツールとエディタ/IDEの関係
エディタ/IDE
プラグイン
開発ツール
ここが同じなので、
あまり差分が出ない
開発ツールとして独立している利点
● エディタ間の差が少ない
● イチから作るよりプラグイン開発が容易
● ターミナルからも叩ける
● ライブラリとしても提供できる
開発ツールが作りやすい理由
■ シングルバイナリ
● 配布のしやすさ
■ クロスコンパイル
● OSに依存しないツールの作成
■ 豊富な標準パッケージ
● コマンドライン引数:flag
● ネットワーク:net
● ファイル操作:os,iout...
シングルバイナリ/クロスコンパイル
■ 環境変数のGOOSとGOARCHを指定する
開発環境とは違うOSやアーキテクチャ向けに
クロスコンパイルできる
# Windows(32ビット)向けにコンパイル
$ GOOS=windows GOARCH...
flagパッケージ
■ 簡単にコマンドライン引数を扱える
var msg string
func init() {
flag.StringVar(&msg,"m","hello","message")
}
func main() {
flag....
ファイル操作とテキスト処理
■ 簡単にコマンドライン引数を扱える
f, _ := os.Open("my.txt")
defer f.Close()
s := bufio.NewScanner(f)
for i := 1; s.Scan(); ...
ソースコードの静的解析
go/ast 抽象構文木(AST)を提供
go/build パッケージに関する情報を集める
go/constant 定数に関する型を提供
go/doc ドキュメントをASTから取り出す
go/format コードフォーマ...
静的解析できて何が嬉しいのか?
● リファクタリングツール
○ 変数の宣言位置や使用箇所の抽出
○ パッケージの解析
● コードジェネレーター
○ コメントによるアノテーションの抽出
○ コードフォーマッタ
● Goのサブセットとなる言語の処理...
式の構文解析
n, _ := parser.ParseExpr(`v + 1`)
ast.Inspect(n, func(n ast.Node) bool {
if n != nil { fmt.Printf("%Tn", n) }
retur...
コメントの抽出
const src = `package main
func main() {v := 100 /*comment for v*/}`
fs := token.NewFileSet()
f, _ := parser.ParseF...
宣言場所の取得
const src = `package main
var v = 100
func main() { fmt.Println(v+1) }`
fs := token.NewFileSet()
f, _ := parser.Pa...
x/tools/go
ポインタ解析
SSA
Static Single Assignment form
Goで開発ツールを作る際のポイント
■ どのOSでも動くように
● OS依存の処理を極力入れない
■ コマンドラインだけでも動く
● エディタやIDEがなくても動くようにする
■ ライブラリとしても提供する
● gofmtやgorenameみた...
ライブラリとしても提供する
■ Main関数を用意する(gorenameの例)
■ main関数からそれを利用する
ライブラリとして提供する利点
■ 他のツール内で利用しやすい
● gorenameを利用したツールを作る場合
type User struct {
Id int64
Name string
}
type User struct {
ID int...
まとめ
■ Goは開発ツールが充実している
● 標準で多くのツールがあり、統一感がある
■ GoはエディタやIDEを選ばない
● 開発ツールが同じなので、差が起きにくい
■ Goは開発ツールが作りやすい
● 標準/準標準パッケージに静的解析の機...
Goでエディタに依存しない
開発ツールを作ろう
Thank you!
twitter: @tenntenn
Qiita: tenntenn
connpass: tenntenn
follow me
Upcoming SlideShare
Loading in …5
×

エディタの壁を越えるGoの開発ツールの文化と作成法

9,557 views

Published on

VimConf 2016の発表資料です。

Published in: Technology
  • Be the first to comment

エディタの壁を越えるGoの開発ツールの文化と作成法

  1. 1. The Go gopher was designed by Renée French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. エディタの壁を超える Goの開発ツールの 文化と作成法 2016/11/05(土) @VimConf 2016
  2. 2. あまりVimの話はしません
  3. 3. アジェンダ ● 自己紹介 ● この発表の目的 ● Goの特徴と言語思想 ● エディタとGoの開発ツール ● 開発ツールを支えるGoの特徴 ● まとめ
  4. 4. 自己紹介 メルカリ/ソウゾウ 上田拓也 twitter: @tenntenn ■ 好きな言語 Go, JavaScript, Lua ■ 業務 GAE/Goでメルカリアッテを作ってます Goのコミュニティを盛り上げる仕事 Gopherを描く仕事
  5. 5. この発表の目的 VimmerをGo界隈に...
  6. 6. この発表の目的 ● Goの面白い文化について知ってもらう ● Goのツールの作りやすさを知ってもらう ● Goで開発ツールを作ってもらう ○ delveプラグインほしい
  7. 7. Goとは? Googleが開発しているプログラミング言語 ■ 特徴 ● 強力でシンプルな言語設計と文法 ● 並行プログラミング ● 豊富な標準ライブラリ群 ● 開発ツールの充実 ● シングルバイナリ/クロスコンパイル 7
  8. 8. GoのSimpleとEasyの実現 ■ Simple:言語自体 ● 文法や言語思想 ● GoroutineとChannel ■ Easy:ライブラリや開発環境 ● シングルバイナリ/クロスコンパイル ● 豊富な標準パッケージ ● 開発ツール充実 各言語の構成要素が 直交するように
  9. 9. Goのエンジニアは Vimをつかってるの?
  10. 10. Goのエディタ・IDE事情 ■ 決まったものはない ● Vim ● Emacs ● IntelliJ ● VSCode ● Atom 好きなエディタ/IDEを 使うことができる! エディタ間に差はないの?
  11. 11. 統一感のあるコード 画像引用 :https://medium.com/@hoffa/400-000-github-repositories-1-billion-files-14-terabytes-of- code-spaces-or-tabs-7cfe0b5dd7fd#.far3hwyby ほとんどタブ派!
  12. 12. 開発ツールが標準であるメリット ■ みんな同じものを使う ● 同じformatter ● 同じlinter ● 同じtestingツール ● 同じドキュメント生成ツール ■ 安心の標準ツール ● メンテされる安心感 ■ エディタやIDEとの連携 ● 標準だとプラグインが作られやすい
  13. 13. 開発ツールの充実 その1 ■ 開発ツールが充実している ● go build ○ ビルドを行うコマンド ● go test ○ xxxx_test.goに書かれたテストコードの実行 ● go doc/godoc ○ ドキュメント生成 ● gofmt/goimports ○ コードフォーマッター ● go vet/golint ○ コードチェッカー、リンター
  14. 14. 開発ツールの充実 その2 ■ 開発ツールが充実している ● guru ○ 静的解析 ● gocode ○ コード補完 ● errcheck ○ エラー処理のチェック ● gorename/gomvpkg ○ リファクタリングツール
  15. 15. 開発ツールとエディタ/IDEの関係 エディタ/IDE プラグイン 開発ツール ここが同じなので、 あまり差分が出ない
  16. 16. 開発ツールとして独立している利点 ● エディタ間の差が少ない ● イチから作るよりプラグイン開発が容易 ● ターミナルからも叩ける ● ライブラリとしても提供できる
  17. 17. 開発ツールが作りやすい理由 ■ シングルバイナリ ● 配布のしやすさ ■ クロスコンパイル ● OSに依存しないツールの作成 ■ 豊富な標準パッケージ ● コマンドライン引数:flag ● ネットワーク:net ● ファイル操作:os,ioutil ● テキスト処理:bufio,strings ● ソースコード解析:go
  18. 18. シングルバイナリ/クロスコンパイル ■ 環境変数のGOOSとGOARCHを指定する 開発環境とは違うOSやアーキテクチャ向けに クロスコンパイルできる # Windows(32ビット)向けにコンパイル $ GOOS=windows GOARCH=386 go build # Linux(64ビット)向けにコンパイル $ GOOS=linux GOARCH=amd64 go build シングルバイナリになるので 動作環境を用意しなくてよい go buildはコンパイルするコマンド
  19. 19. flagパッケージ ■ 簡単にコマンドライン引数を扱える var msg string func init() { flag.StringVar(&msg,"m","hello","message") } func main() { flag.Parse() fmt.Println(msg) } フラグのパース フラグの登録 $ ./main -m hi hi
  20. 20. ファイル操作とテキスト処理 ■ 簡単にコマンドライン引数を扱える f, _ := os.Open("my.txt") defer f.Close() s := bufio.NewScanner(f) for i := 1; s.Scan(); i++ { fmt.Println(i, strings.TrimSpace(s.Text())) } ファイルを開く $ echo -e " hello n world" > my.txt $ ./main 1 hello 2 world Playgroundで動かす ファイルを読み込む 左右の空白を取り除く
  21. 21. ソースコードの静的解析 go/ast 抽象構文木(AST)を提供 go/build パッケージに関する情報を集める go/constant 定数に関する型を提供 go/doc ドキュメントをASTから取り出す go/format コードフォーマッタの機能を提供 go/importer コンパイラに適したImporterを提供 go/parser 構文解析の機能を提供 go/printer ASTの表示機能を提供 go/scanner 字句解析の機能を提供 go/token トークンに関する型を提供 go/types 型チェックに関する機能を提供
  22. 22. 静的解析できて何が嬉しいのか? ● リファクタリングツール ○ 変数の宣言位置や使用箇所の抽出 ○ パッケージの解析 ● コードジェネレーター ○ コメントによるアノテーションの抽出 ○ コードフォーマッタ ● Goのサブセットとなる言語の処理系 ○ ASTの解析 ○ 定数の扱い
  23. 23. 式の構文解析 n, _ := parser.ParseExpr(`v + 1`) ast.Inspect(n, func(n ast.Node) bool { if n != nil { fmt.Printf("%Tn", n) } return true }) printer.Fprint(os.Stdout, token.NewFileSet(), n) *ast.BinaryExpr *ast.Ident *ast.BasicLit v + 1 + v 1 構文解析 抽象構文木(AST)を探索 抽象構文木(AST)を出力 BinaryExpr Ident BasicLit Playgroundで動かす
  24. 24. コメントの抽出 const src = `package main func main() {v := 100 /*comment for v*/}` fs := token.NewFileSet() f, _ := parser.ParseFile(fs,"my.go",src, parser.ParseComments) cmap := ast.NewCommentMap(fs, f, f.Comments) for n, cgs := range cmap { printer.Fprint(os.Stdout, fs, n) fmt.Println() for _, cg := range cgs { fmt.Println(cg.Text()) } } v := 100 comment for v Playgroundで動かす 構文解析 コメントと ノードの対応を取得
  25. 25. 宣言場所の取得 const src = `package main var v = 100 func main() { fmt.Println(v+1) }` fs := token.NewFileSet() f, _ := parser.ParseFile(fs, "my.go", src, 0) i := &types.Info{Defs: map[*ast.Ident]types.Object{}} (&types.Config{}).Check("main", fs, []*ast.File{f}, i) for n, o := range i.Defs { fmt.Println(n, o) } main <nil> v var main.v int main func main.main() Playgroundで動かす 宣言の取得 Usesを使えば 使用箇所も調べられる
  26. 26. x/tools/go ポインタ解析 SSA Static Single Assignment form
  27. 27. Goで開発ツールを作る際のポイント ■ どのOSでも動くように ● OS依存の処理を極力入れない ■ コマンドラインだけでも動く ● エディタやIDEがなくても動くようにする ■ ライブラリとしても提供する ● gofmtやgorenameみたいに公開する
  28. 28. ライブラリとしても提供する ■ Main関数を用意する(gorenameの例) ■ main関数からそれを利用する
  29. 29. ライブラリとして提供する利点 ■ 他のツール内で利用しやすい ● gorenameを利用したツールを作る場合 type User struct { Id int64 Name string } type User struct { ID int64 `datastore:"Id"` Name string `datastore:"Name"` } フィールド名をリファクタリングしたいけど、 データストア上のカラム名は変えたくない! gorenameを自作ツールから呼び出して リネームしつつstructタグを付けていくイチから作る必要がない!
  30. 30. まとめ ■ Goは開発ツールが充実している ● 標準で多くのツールがあり、統一感がある ■ GoはエディタやIDEを選ばない ● 開発ツールが同じなので、差が起きにくい ■ Goは開発ツールが作りやすい ● 標準/準標準パッケージに静的解析の機能が豊富 ● コマンドラインツールが作りやすい ● いろんなOSのユーザにやさしい
  31. 31. Goでエディタに依存しない 開発ツールを作ろう
  32. 32. Thank you! twitter: @tenntenn Qiita: tenntenn connpass: tenntenn follow me

×