Submit Search
Go静的解析ハンズオン
1 like
2,656 views
Takuya Ueda
第6回Golang勉強会 in Okinawaで行ったハンズオンの資料です。
Technology
Read more
1 of 25
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
More Related Content
PDF
Java 8 features
NexThoughts Technologies
PDF
Java8 features
Elias Hasnat
PDF
Dependency Injection
Giovanni Scerra ☃
PDF
PHP unserialization vulnerabilities: What are we missing?
Sam Thomas
PDF
Go1.18 Genericsを試す
asuka y
PDF
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
PPTX
Interfaces in java
Abishek Purushothaman
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
Java 8 features
NexThoughts Technologies
Java8 features
Elias Hasnat
Dependency Injection
Giovanni Scerra ☃
PHP unserialization vulnerabilities: What are we missing?
Sam Thomas
Go1.18 Genericsを試す
asuka y
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
Interfaces in java
Abishek Purushothaman
オブジェクト指向できていますか?
Moriharu Ohzu
What's hot
(20)
PDF
OpenAPI development with Python
Takuro Wada
PPT
Java exception
Arati Gadgil
PPTX
OOP Introduction with java programming language
Md.Al-imran Roton
PPTX
C# classes objects
Dr.Neeraj Kumar Pandey
PDF
Mavenの真実とウソ
Yoshitaka Kawashima
PDF
Testing with JUnit 5 and Spring
VMware Tanzu
PDF
Lambda and Stream Master class - part 1
José Paumard
PPTX
Wrapper classes
Kongu Engineering College, Perundurai, Erode
PPTX
C# Inheritance
Prem Kumar Badri
PPTX
Asp.NET Validation controls
Guddu gupta
PDF
CLASS & OBJECT IN JAVA
Riaj Uddin Mahi
PPTX
Factory Method Pattern
Anjan Kumar Bollam
PDF
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
onozaty
ODP
Java 9 Features
NexThoughts Technologies
ODP
Groovy intro
NexThoughts Technologies
PPTX
LINQ in C#
Basant Medhat
KEY
Go言語のスライスを理解しよう
Yasutaka Kawamoto
PPTX
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Arjun Thakur
PDF
Tackling Complexity
Yoshitaka Kawashima
PDF
業務で使うIRC
onozaty
OpenAPI development with Python
Takuro Wada
Java exception
Arati Gadgil
OOP Introduction with java programming language
Md.Al-imran Roton
C# classes objects
Dr.Neeraj Kumar Pandey
Mavenの真実とウソ
Yoshitaka Kawashima
Testing with JUnit 5 and Spring
VMware Tanzu
Lambda and Stream Master class - part 1
José Paumard
Wrapper classes
Kongu Engineering College, Perundurai, Erode
C# Inheritance
Prem Kumar Badri
Asp.NET Validation controls
Guddu gupta
CLASS & OBJECT IN JAVA
Riaj Uddin Mahi
Factory Method Pattern
Anjan Kumar Bollam
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
onozaty
Java 9 Features
NexThoughts Technologies
Groovy intro
NexThoughts Technologies
LINQ in C#
Basant Medhat
Go言語のスライスを理解しよう
Yasutaka Kawamoto
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Arjun Thakur
Tackling Complexity
Yoshitaka Kawashima
業務で使うIRC
onozaty
Ad
Viewers also liked
(20)
PDF
Cloud Functionsの紹介
Takuya Ueda
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
PDF
条件式評価器の実装による管理ツールの抽象化
Takuya Ueda
PDF
粗探しをしてGoのコントリビューターになる方法
Takuya Ueda
PDF
Goにおける静的解析と製品開発への応用
Takuya Ueda
PDF
GoによるiOSアプリの開発
Takuya Ueda
PPTX
うしちゃん WebRTC Chat on SkyWayの開発コードw
Kensaku Komatsu
PDF
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
PDF
Static Analysis in Go
Takuya Ueda
PDF
HTTP2 RFC 発行記念祝賀会
Jxck Jxck
PDF
Mobile Apps by Pure Go with Reverse Binding
Takuya Ueda
PDF
Go1.8 for Google App Engine
Takuya Ueda
PDF
Namespace API を用いたマルチテナント型 Web アプリの実践
Takuya Ueda
PDF
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
PDF
Cloud functionsの紹介
Takuya Ueda
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
PDF
HTTP2 時代の Web - web over http2
Jxck Jxck
PDF
Google Assistant関係のセッションまとめ
Takuya Ueda
PDF
オススメの標準・準標準パッケージ20選
Takuya Ueda
PPTX
WebRTC Browsers n Stacks Implementation differences
Alexandre Gouaillard
Cloud Functionsの紹介
Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
条件式評価器の実装による管理ツールの抽象化
Takuya Ueda
粗探しをしてGoのコントリビューターになる方法
Takuya Ueda
Goにおける静的解析と製品開発への応用
Takuya Ueda
GoによるiOSアプリの開発
Takuya Ueda
うしちゃん WebRTC Chat on SkyWayの開発コードw
Kensaku Komatsu
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
Static Analysis in Go
Takuya Ueda
HTTP2 RFC 発行記念祝賀会
Jxck Jxck
Mobile Apps by Pure Go with Reverse Binding
Takuya Ueda
Go1.8 for Google App Engine
Takuya Ueda
Namespace API を用いたマルチテナント型 Web アプリの実践
Takuya Ueda
Javaトラブルに備えよう #jjug_ccc #ccc_h2
Norito Agetsuma
Cloud functionsの紹介
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
HTTP2 時代の Web - web over http2
Jxck Jxck
Google Assistant関係のセッションまとめ
Takuya Ueda
オススメの標準・準標準パッケージ20選
Takuya Ueda
WebRTC Browsers n Stacks Implementation differences
Alexandre Gouaillard
Ad
Similar to Go静的解析ハンズオン
(20)
PDF
静的解析を使った開発ツールの開発
Takuya Ueda
PDF
マスター・オブ・goパッケージ
Takuya Ueda
PDF
Goでかんたんソースコードの静的解析
Takuya Ueda
PDF
エディタの壁を越えるGoの開発ツールの文化と作成法
Takuya Ueda
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Relations Team
PDF
エキスパートGo
Takuya Ueda
PDF
Gopher Fest 2017参加レポート
Takuya Ueda
PDF
TechDo Goハンズオン#3
privatemy
PDF
Go入門
Takuya Ueda
PDF
GitHub での Haskell の色が変わったんで
Nobutada Matsubara
PDF
Goとテスト
Takuya Ueda
PDF
Goで言語処理系(の途中まで)を作ろう
Esehara Shigeo
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
PDF
PCさえあればいい。
bleis tift
PDF
認証Gwのプロトタイプでgolang使ってみた20171024
Kohji Osamura
PDF
初心者向けGo言語勉強会
leverages_event
PDF
ErlangでErlagVM上で動く言語の作り方
osamu kimura
PDF
Go Friday 傑作選
Takuya Ueda
PPTX
Go guide for Java programmer
Masaaki Yonebayashi
静的解析を使った開発ツールの開発
Takuya Ueda
マスター・オブ・goパッケージ
Takuya Ueda
Goでかんたんソースコードの静的解析
Takuya Ueda
エディタの壁を越えるGoの開発ツールの文化と作成法
Takuya Ueda
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Relations Team
エキスパートGo
Takuya Ueda
Gopher Fest 2017参加レポート
Takuya Ueda
TechDo Goハンズオン#3
privatemy
Go入門
Takuya Ueda
GitHub での Haskell の色が変わったんで
Nobutada Matsubara
Goとテスト
Takuya Ueda
Goで言語処理系(の途中まで)を作ろう
Esehara Shigeo
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
Cookpad Summer Intern 2015 - Programming Paradigm
Minero Aoki
PCさえあればいい。
bleis tift
認証Gwのプロトタイプでgolang使ってみた20171024
Kohji Osamura
初心者向けGo言語勉強会
leverages_event
ErlangでErlagVM上で動く言語の作り方
osamu kimura
Go Friday 傑作選
Takuya Ueda
Go guide for Java programmer
Masaaki Yonebayashi
More from Takuya Ueda
(9)
PDF
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
PDF
WebAssembly with Go
Takuya Ueda
PDF
GAE/Goとsyncパッケージ
Takuya Ueda
PDF
そうだ、Goを始めよう
Takuya Ueda
PDF
メルカリ カウルのマスタデータの更新
Takuya Ueda
PDF
Goでwebアプリを開発してみよう
Takuya Ueda
PDF
GAE/GoでWebアプリ開発入門
Takuya Ueda
PDF
GAE/GoでLINE Messaging API を使う
Takuya Ueda
PDF
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Takuya Ueda
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
WebAssembly with Go
Takuya Ueda
GAE/Goとsyncパッケージ
Takuya Ueda
そうだ、Goを始めよう
Takuya Ueda
メルカリ カウルのマスタデータの更新
Takuya Ueda
Goでwebアプリを開発してみよう
Takuya Ueda
GAE/GoでWebアプリ開発入門
Takuya Ueda
GAE/GoでLINE Messaging API を使う
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
Takuya Ueda
Go静的解析ハンズオン
1.
Go静的解析ハンズオン 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. 2017/06/25(日) 第6回Golang勉強会 in Okinawa 1
2.
自己紹介 メルカリ/ソウゾウ 上田拓也 twitter: @tenntenn ■ コミュニティ活動 Google
Cloud Platform User Group (GCPUG) Tokyo Goビギナーズ golang.tokyo Go Conference ■ 業務 GAE/Goでメルカリカウルを作ってます GoやGCPコミュニティを盛り上げる仕事 Gopherを描く仕事(LINEスタンプ) 2
3.
2017年7月1日(土) BigQueryのハンズオン開催! https://okipug.connpass.com/event/56374/ 3
4.
アジェンダ ● Goにおける静的解析の方法(復習) ● ハンズオン ○
Hello, Worldをパースしてみよう ○ 手でHello, Worldを書いてみよう ○ gopherを探せ ○ 型情報を取得みよう 4
5.
Goにおける静的解析の方法 (ハッカーズチャンプルーの復習) 5
6.
goパッケージ ■ 標準パッケージとして静的解析の機能を提供 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 型チェックに関する機能を提供 6
7.
静的解析の流れ 7 ソースコード トークン 抽象構文木(AST) 型情報 構文解析 字句解析 型チェック go/scanner go/token go/parser go/ast go/types go/constant
8.
字句解析 - go/scanner,go/token ■
文字列をトークンにしていく ● 空白などを取り除き、意味のある単位=トー クンにしていく作業 8 IDENT ADD INT トークン ソースコード v + 1
9.
v + 1 構文解析
- go/parser,go/ast ■ トークンを抽象構文木(AST)にしていく ● プログラムの構造を持たせる 9 IDENT ADD INT ソースコード + v 1 BinaryExpr Ident BasicLit トークン 抽象構文木(AST)
10.
n := 100
+ 200 m := n + 300 型チェック - go/types,go/constant ■ 抽象構文木から型に関する情報を取得する ● 識別子の解決 ● 型の推論 ● 定数の評価 10 定数の評価 =300 型の推論 -> int 識別子の解決
11.
抽象構文木(AST)の取得 ■ go/parserパッケージの関数を使う ● ParseExpr,ParseExprFrom ○
式をパースする ○ ParseExprはParseExprFromを簡易版 ● ParseFile ○ ファイル単位でパースする ● ParseDir ○ ディレクトリ単位でパースする ○ 中でParseFileを呼んでいる 11
12.
package main import "fmt" func
main() { fmt.Println("Hello, 世界") } Hello, Worldの抽象構文木の構成 12 Goの抽象構文木(AST)を手入力してHello, Worldを作る http://qiita.com/tenntenn/items/0cbc6f1f00dc579fcd8c Playgroundで動かす *ast.File []ast.Decl *ast.GenDecl *ast.FuncDecl
13.
式の抽象構文木を取得する ■ 式単位を構文解析する ■ ParseExprFromでも書ける 13 expr,
err := parser.ParseExpr(`v + 1`) if err != nil { /* エラー処理 */ } /* exprを解析する処理 */ fset := token.NewFileSet() // ファイル情報 src := []byte(`v + 1`) f := "" // ファイル名(式なので不要) m := 0 // モード(式なので不要) expr, err := parser.ParseExprFrom(fset, f, s, m)
14.
const src =
` package main var v = 100 func main() { fmt.Println(v+1) }` fs := token.NewFileSet() f, err := parser.ParseFile(fs, "my.go", src, 0) if err != nil { /* エラー処理 */ } /* f を解析する処理 */ ソースから抽象構文木を取得する ■ Goのソースコードを構文解析する 14 引数はparse.ExprFromと 同じ構成 srcがnilだとファイル名 でファイルを開く 解析するファイルの中身
15.
token.FileSetとは? ■ ファイル中の位置情報を記録する為の型 ● 位置情報は数値で表される ●
複数のファイル間で一意の値 ● 各ファイルのoffsetが記録されている ● パースする際に記録されていく 15 token.FileSetは出力引数として Parse系の関数に渡す
16.
*ast.BinaryExpr *ast.Ident *ast.BasicLit v + 1 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.Inspectを使う 16 + v 1 構文解析 抽象構文木(AST)を探索 抽象構文木(AST)を出力 BinaryExpr Ident BasicLit Playgroundで動かす ast.Walkというのもある
17.
func traverse(n ast.Node)
{ switch n := n.(type) { case *ast.Indent: fmt.Println(n.Name) case *ast.BinaryExpr: traverse(n.X) traverse(n.Y) case *ast.UnaryExpr: traverse(n.X) } } 抽象構文木をトラバースする ■ 再帰を使ってトラバースする 17 識別子の場合は名前を出力 二項演算式の場合は 各項を探索 単項演算式の場合は 項を探索 型でswitchする Playgroundで動かす ast.Nodeはインタフェース
18.
参考資料 ■ goパッケージで簡単に静的解析して世界を広げよう ● コードジェネレータ ○
ASTを取得する方法を調べる ○ 抽象構文木(AST)をトラバースする ○ 抽象構文木(AST)をいじってフォーマットをかける ○ Goの抽象構文木(AST)を手入力してHello, Worldを作る ○ go-app-builderのソースコードを読む ● リファクタリングツール ○ gorenameをライブラリとして使う ○ Goのスコープについて考えてみよう ○ go/typesパッケージを使い変数名をリネームしてみる ● 処理系 ○ 簡単な式の評価機を作ってみる ○ 【実践goパッケージ】文字列から複素数型の値をパースする ○ もっと楽して式の評価器を作る 18
19.
ハンズオン 19
20.
Hello, Worldをパースしてみよう 20 package main import
"fmt" func main() { fmt.Println("Hello, 世界") } fs := token.NewFileSet() f, _ := parser.ParseFile(fs, "main.go", src, 0) ast.Print(fs, f) Playgroundで動かす
21.
package main import "fmt" func
main() { fmt.Println("Hello, 世界") } Hello, Worldの抽象構文木を手入力 21 Goの抽象構文木(AST)を手入力してHello, Worldを作る http://qiita.com/tenntenn/items/0cbc6f1f00dc579fcd8c Playgroundで動かす *ast.File []ast.Decl *ast.GenDecl *ast.FuncDecl
22.
gopherを探せ ■ ソースコードからgopherを探そう 22 type Gopher
struct { gopher string `json:"gopher"` } func main() { const gopher = "GOPHER" gogopher := GOPHER() gogopher.gopher = gopher fmt.Println(gogopher) } func GOPHER() (gopher *Gopher) { gopher = &Gopher{ gopher: "gopher" } return } https://gist.github.com/tenntenn/ca92384795133b3ec5de0e0d7de5eec5
23.
型チェックをしてみよう ■ 例:int型の変数を探す 23 cfg :=
&types.Config{Importer: importer.Default()} info := &types.Info{ Defs: map[*ast.Ident]types.Object{}, } cfg.Check("main", fs, []*ast.File{f}, info) it := types.Universe.Lookup("int").Type() for idnt, o := range info.Defs { if o != nil && types.Identical(o.Type(), it) { fmt.Println(fs.Position(idnt.Pos()), idnt) } } https://gist.github.com/tenntenn/706d73e0d82105b0d25179578b953745
24.
型チェックをしてみよう ■ 構造体型のgopherを探そう 24 type Gopher
struct { gopher string `json:"gopher"` } func main() { const gopher = "GOPHER" gogopher := GOPHER() gogopher.gopher = gopher fmt.Println(gogopher) } func GOPHER() (gopher *Gopher) { gopher = &Gopher{ gopher: "gopher" } return }
25.
Thank you! twitter: @tenntenn Qiita:
tenntenn connpass: tenntenn 25
Download