Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Takuya Ueda
2,668 views
Go静的解析ハンズオン
第6回Golang勉強会 in Okinawaで行ったハンズオンの資料です。
Technology
◦
Read more
1
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 25
2
/ 25
3
/ 25
4
/ 25
5
/ 25
6
/ 25
7
/ 25
8
/ 25
9
/ 25
10
/ 25
11
/ 25
12
/ 25
13
/ 25
14
/ 25
15
/ 25
16
/ 25
17
/ 25
18
/ 25
19
/ 25
20
/ 25
21
/ 25
22
/ 25
23
/ 25
24
/ 25
25
/ 25
More Related Content
PDF
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
PDF
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
by
pospome
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
by
infinite_loop
PDF
REST API のコツ
by
pospome
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PDF
nginx入門
by
Takashi Takizawa
テスト文字列に「うんこ」と入れるな
by
Kentaro Matsui
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
by
pospome
ソーシャルゲーム案件におけるDB分割のPHP実装
by
infinite_loop
REST API のコツ
by
pospome
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
nginx入門
by
Takashi Takizawa
What's hot
PPTX
ぱぱっと理解するSpring Cloudの基本
by
kazuki kumagai
PPTX
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
PPTX
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
by
NTT DATA Technology & Innovation
PPTX
AWSで作る分析基盤
by
Yu Otsubo
PDF
DockerとPodmanの比較
by
Akihiro Suda
PPTX
がっつりMongoDB事例紹介
by
Tetsutaro Watanabe
PPTX
RLSを用いたマルチテナント実装 for Django
by
Takayuki Shimizukawa
PPTX
Redisの特徴と活用方法について
by
Yuji Otani
PDF
InnoDBのすゝめ(仮)
by
Takanori Sejima
PPTX
Azure API Management 俺的マニュアル
by
貴志 上坂
PDF
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
by
Shohei Koyama
PDF
MonotaRO のデータ活用と基盤の過去、現在、未来
by
株式会社MonotaRO Tech Team
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
by
Koichiro Matsuoka
PDF
Redmine にいろいろ埋め込んでみた
by
Kohei Nakamura
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
by
Takahiro Moteki
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
by
Yahoo!デベロッパーネットワーク
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
PDF
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
ぱぱっと理解するSpring Cloudの基本
by
kazuki kumagai
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
by
NTT DATA Technology & Innovation
AWSで作る分析基盤
by
Yu Otsubo
DockerとPodmanの比較
by
Akihiro Suda
がっつりMongoDB事例紹介
by
Tetsutaro Watanabe
RLSを用いたマルチテナント実装 for Django
by
Takayuki Shimizukawa
Redisの特徴と活用方法について
by
Yuji Otani
InnoDBのすゝめ(仮)
by
Takanori Sejima
Azure API Management 俺的マニュアル
by
貴志 上坂
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
インフラエンジニアの綺麗で優しい手順書の書き方
by
Shohei Koyama
MonotaRO のデータ活用と基盤の過去、現在、未来
by
株式会社MonotaRO Tech Team
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
by
Koichiro Matsuoka
Redmine にいろいろ埋め込んでみた
by
Kohei Nakamura
[社内勉強会]ELBとALBと数万スパイク負荷テスト
by
Takahiro Moteki
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
by
Yahoo!デベロッパーネットワーク
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
ソーシャルゲームのためのデータベース設計
by
Yoshinori Matsunobu
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
Viewers also liked
PDF
Cloud Functionsの紹介
by
Takuya Ueda
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
by
Takuya Ueda
PDF
条件式評価器の実装による管理ツールの抽象化
by
Takuya Ueda
PDF
粗探しをしてGoのコントリビューターになる方法
by
Takuya Ueda
PDF
Goにおける静的解析と製品開発への応用
by
Takuya Ueda
PDF
GoによるiOSアプリの開発
by
Takuya Ueda
PPTX
うしちゃん WebRTC Chat on SkyWayの開発コードw
by
Kensaku Komatsu
PDF
goパッケージで型情報を用いたソースコード検索を実現する
by
Takuya Ueda
PDF
Static Analysis in Go
by
Takuya Ueda
PDF
HTTP2 RFC 発行記念祝賀会
by
Jxck Jxck
PDF
Mobile Apps by Pure Go with Reverse Binding
by
Takuya Ueda
PDF
Go1.8 for Google App Engine
by
Takuya Ueda
PDF
Namespace API を用いたマルチテナント型 Web アプリの実践
by
Takuya Ueda
PDF
Javaトラブルに備えよう #jjug_ccc #ccc_h2
by
Norito Agetsuma
PDF
Cloud functionsの紹介
by
Takuya Ueda
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
by
Takuya Ueda
PDF
HTTP2 時代の Web - web over http2
by
Jxck Jxck
PDF
Google Assistant関係のセッションまとめ
by
Takuya Ueda
PDF
オススメの標準・準標準パッケージ20選
by
Takuya Ueda
PPTX
WebRTC Browsers n Stacks Implementation differences
by
Alexandre Gouaillard
Cloud Functionsの紹介
by
Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
by
Takuya Ueda
条件式評価器の実装による管理ツールの抽象化
by
Takuya Ueda
粗探しをしてGoのコントリビューターになる方法
by
Takuya Ueda
Goにおける静的解析と製品開発への応用
by
Takuya Ueda
GoによるiOSアプリの開発
by
Takuya Ueda
うしちゃん WebRTC Chat on SkyWayの開発コードw
by
Kensaku Komatsu
goパッケージで型情報を用いたソースコード検索を実現する
by
Takuya Ueda
Static Analysis in Go
by
Takuya Ueda
HTTP2 RFC 発行記念祝賀会
by
Jxck Jxck
Mobile Apps by Pure Go with Reverse Binding
by
Takuya Ueda
Go1.8 for Google App Engine
by
Takuya Ueda
Namespace API を用いたマルチテナント型 Web アプリの実践
by
Takuya Ueda
Javaトラブルに備えよう #jjug_ccc #ccc_h2
by
Norito Agetsuma
Cloud functionsの紹介
by
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
by
Takuya Ueda
HTTP2 時代の Web - web over http2
by
Jxck Jxck
Google Assistant関係のセッションまとめ
by
Takuya Ueda
オススメの標準・準標準パッケージ20選
by
Takuya Ueda
WebRTC Browsers n Stacks Implementation differences
by
Alexandre Gouaillard
Similar to Go静的解析ハンズオン
PDF
静的解析を使った開発ツールの開発
by
Takuya Ueda
PDF
マスター・オブ・goパッケージ
by
Takuya Ueda
PDF
Goでかんたんソースコードの静的解析
by
Takuya Ueda
PDF
エディタの壁を越えるGoの開発ツールの文化と作成法
by
Takuya Ueda
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
by
Google Developer Relations Team
PDF
エキスパートGo
by
Takuya Ueda
PDF
Gopher Fest 2017参加レポート
by
Takuya Ueda
PDF
TechDo Goハンズオン#3
by
privatemy
PDF
Go入門
by
Takuya Ueda
PDF
GitHub での Haskell の色が変わったんで
by
Nobutada Matsubara
PDF
Goとテスト
by
Takuya Ueda
PDF
Goで言語処理系(の途中まで)を作ろう
by
Esehara Shigeo
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
by
Takuya Ueda
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
by
Minero Aoki
PDF
PCさえあればいい。
by
bleis tift
PDF
認証Gwのプロトタイプでgolang使ってみた20171024
by
Kohji Osamura
PDF
初心者向けGo言語勉強会
by
leverages_event
PDF
ErlangでErlagVM上で動く言語の作り方
by
osamu kimura
PDF
Go Friday 傑作選
by
Takuya Ueda
PPTX
Go guide for Java programmer
by
Masaaki Yonebayashi
静的解析を使った開発ツールの開発
by
Takuya Ueda
マスター・オブ・goパッケージ
by
Takuya Ueda
Goでかんたんソースコードの静的解析
by
Takuya Ueda
エディタの壁を越えるGoの開発ツールの文化と作成法
by
Takuya Ueda
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
by
Google Developer Relations Team
エキスパートGo
by
Takuya Ueda
Gopher Fest 2017参加レポート
by
Takuya Ueda
TechDo Goハンズオン#3
by
privatemy
Go入門
by
Takuya Ueda
GitHub での Haskell の色が変わったんで
by
Nobutada Matsubara
Goとテスト
by
Takuya Ueda
Goで言語処理系(の途中まで)を作ろう
by
Esehara Shigeo
今日から始めるGopher - スタートGo #0 @GDG名古屋
by
Takuya Ueda
Cookpad Summer Intern 2015 - Programming Paradigm
by
Minero Aoki
PCさえあればいい。
by
bleis tift
認証Gwのプロトタイプでgolang使ってみた20171024
by
Kohji Osamura
初心者向けGo言語勉強会
by
leverages_event
ErlangでErlagVM上で動く言語の作り方
by
osamu kimura
Go Friday 傑作選
by
Takuya Ueda
Go guide for Java programmer
by
Masaaki Yonebayashi
More from Takuya Ueda
PDF
Goにおけるバージョン管理の必要性 − vgoについて −
by
Takuya Ueda
PDF
WebAssembly with Go
by
Takuya Ueda
PDF
GAE/Goとsyncパッケージ
by
Takuya Ueda
PDF
そうだ、Goを始めよう
by
Takuya Ueda
PDF
メルカリ カウルのマスタデータの更新
by
Takuya Ueda
PDF
Goでwebアプリを開発してみよう
by
Takuya Ueda
PDF
GAE/GoでWebアプリ開発入門
by
Takuya Ueda
PDF
GAE/GoでLINE Messaging API を使う
by
Takuya Ueda
PDF
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
by
Takuya Ueda
Goにおけるバージョン管理の必要性 − vgoについて −
by
Takuya Ueda
WebAssembly with Go
by
Takuya Ueda
GAE/Goとsyncパッケージ
by
Takuya Ueda
そうだ、Goを始めよう
by
Takuya Ueda
メルカリ カウルのマスタデータの更新
by
Takuya Ueda
Goでwebアプリを開発してみよう
by
Takuya Ueda
GAE/GoでWebアプリ開発入門
by
Takuya Ueda
GAE/GoでLINE Messaging API を使う
by
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
by
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