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.

goパッケージで型情報を用いたソースコード検索を実現する

2,407 views

Published on

Shinjuku.go#1で発表した資料です。
https://shinjukugo.connpass.com/event/52929/

Published in: Technology
  • Hi there! I just wanted to share a list of sites that helped me a lot during my studies: .................................................................................................................................... www.EssayWrite.best - Write an essay .................................................................................................................................... www.LitReview.xyz - Summary of books .................................................................................................................................... www.Coursework.best - Online coursework .................................................................................................................................... www.Dissertations.me - proquest dissertations .................................................................................................................................... www.ReMovie.club - Movies reviews .................................................................................................................................... www.WebSlides.vip - Best powerpoint presentations .................................................................................................................................... www.WritePaper.info - Write a research paper .................................................................................................................................... www.EddyHelp.com - Homework help online .................................................................................................................................... www.MyResumeHelp.net - Professional resume writing service .................................................................................................................................. www.HelpWriting.net - Help with writing any papers ......................................................................................................................................... Save so as not to lose
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

goパッケージで型情報を用いたソースコード検索を実現する

  1. 1. goパッケージで型情報を用いた ソースコード検索を実現する 2017/04/13(木) @Shinjuku.go#1 The Go gopher was designed by Renee French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.
  2. 2. 自己紹介 メルカリ/ソウゾウ 上田拓也 twitter: @tenntenn ■ コミュニティ活動 Google Cloud Platform User Group (GCPUG) Tokyo Goビギナーズ golang.tokyo Go Conference ■ 業務 GAE/Goでメルカリアッテを作ってます GoやGCPコミュニティを盛り上げる仕事 Gopherを描く仕事(LINEスタンプ) 2
  3. 3. 静的解析をして型情報から ソースコードを検索しよう 3
  4. 4. ソースコードの静的解析とは? 4 ■ ソースコードを実行せずに解析すること ● ソースコードから抽象構文木(AST)などを取 得して解析する ● 静的型付け言語だと、静的解析で型情報が 取得できる ● 逆は実行して解析する動的解析
  5. 5. Goで静的解析をすると何が嬉しいのか? ● リファクタリングツール ○ 変数の宣言位置や使用箇所の抽出 ○ パッケージの解析 ● コードジェネレーター ○ コメントによるアノテーションの抽出 ○ コードフォーマッタ ● 処理系 ○ 抽象構文木(AST)の解析 ○ 定数の扱い 5 静的型付け言語なので 静的解析でも多くの事が知れる
  6. 6. 6 コントリビュータになれる!
  7. 7. 7 https://www.slideshare.net/takuyaueda967/go-72158330
  8. 8. 開発ツールとソースコードの静的解析 8 ■ 開発ツールの多くは静的解析を行っている ● gofmt/goimports ○ コードフォーマッター ● go vet/golint ○ コードチェッカー、リンター ● guru ○ 静的解析 ● gocode ○ コード補完 ● errcheck ○ エラー処理のチェック ● gorename/gomvpkg ○ リファクタリングツール
  9. 9. ■ 標準パッケージで静的解析の機能を提供 goパッケージ 9 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 型チェックに関する機能を提供
  10. 10. 静的解析の流れ 10 ソースコード トークン 抽象構文木(AST) 型情報 構文解析 字句解析 型チェック go/scanner go/token go/parser go/ast go/types go/constant
  11. 11. 字句解析 - go/scanner,go/token ■ 文字列をトークンにしていく ● 空白などを取り除き、意味のある単位=トー クンにしていく作業 11 v + 1 IDENT ADD INT トークン ソースコード
  12. 12. 構文解析 - go/parser,go/ast ■ トークンを抽象構文木(AST)にしていく ● プログラムの構造を持たせる 12 v + 1 IDENT ADD INT ソースコード + v 1 BinaryExpr Ident BasicLit トークン 抽象構文木(AST)
  13. 13. 型チェック - go/types,go/constant ■ 型チェックを行う ● 識別子の解決 ● 型の推論 ● 定数の評価 13 n := 100 + 200 fmt.Println(n) 定数の評価 =300 型の推論 -> int 識別子の解決 識別子の解決 -> fmtパッケージ
  14. 14. 型情報を用いて検索してみる 14
  15. 15. 具象型のエラーを返してる部分を検索 15 ■ やりたいこと ● errorインタフェースを実装している型を返 す関数を探す ● そのうち、error型として返さず別の型とし て返しているものを探す ■ やりかた ● ASTを取得する ● 型情報を取得する ● 型情報とASTから該当の関数を探す ほら、簡単!
  16. 16. 今回対象とするサンプル type Err string func (err Err) Error() string { return string(err) } func f() Err { return Err("error") } func main() { fmt.Println(f()) fmt.Println(func() Err { return Err("error2") }) fmt.Println(func() error { return nil }) } 16 これ これ
  17. 17. ここから ライブコーディング! 17 https://gist.github.com/tenntenn/607e27 638a3ec850c9a7c2dec334b5b7
  18. 18. まとめ 18 ■ 静的解析はかんたん ● goパッケージを使う ● ASTや型情報の取得も簡単 ● 静的解析で多くの情報が知れる ■ 開発ツールを作って開発効率を上げよう ● 標準でも多くの開発ツールがある ● 自分でも簡単に開発ツールが作れる ● 21世紀なのでソースコードの質はツールで 保証しよう
  19. 19. Thank you! twitter: @tenntenn Qiita: tenntenn connpass: tenntenn 19

×