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
Submit search
EN
Uploaded by
Takuya Ueda
2,666 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
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
by
Kazumi OHIRA
PPTX
「品質ダッシュボード」と「データによる意思決定」
by
Kohei Tomita
PDF
PlaySQLAlchemy: SQLAlchemy入門
by
泰 増田
PDF
SQLインジェクション総”習”編
by
Yasuo Ohgaki
PDF
Neural networks for Graph Data NeurIPS2018読み会@PFN
by
emakryo
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
PPTX
SQiP2015-研究のデザイン入門
by
Hironori Washizaki
ODP
コサインクラスタリング
by
osamu morimoto
Azure でサーバーレス、 Infrastructure as Code どうしてますか?
by
Kazumi OHIRA
「品質ダッシュボード」と「データによる意思決定」
by
Kohei Tomita
PlaySQLAlchemy: SQLAlchemy入門
by
泰 増田
SQLインジェクション総”習”編
by
Yasuo Ohgaki
Neural networks for Graph Data NeurIPS2018読み会@PFN
by
emakryo
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
SQiP2015-研究のデザイン入門
by
Hironori Washizaki
コサインクラスタリング
by
osamu morimoto
What's hot
PDF
機械学習工学の進展と課題 2021
by
Fuyuki Ishikawa
PDF
今更聞けない!?Microsoft Graph で始める Office 365 データ活用と事例の紹介
by
Kenichiro Nakamura
PDF
マルチテナントのアプリケーション実装〜実践編〜
by
Yoshiki Nakagawa
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
by
Hideki Tsunashima
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PDF
ビジネスルールの複雑さに立ち向かう
by
増田 亨
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
PPTX
オーバーエンジニアリングって何? #devsumi #devsumiA
by
Ore Product
PPTX
DRIVE CHARTを支えるAI技術
by
Yusuke Uchida
PDF
App013 ここはあえて紙と
by
Tech Summit 2016
PDF
階層ベイズによるワンToワンマーケティング入門
by
shima o
PDF
SAT/SMTソルバの仕組み
by
Masahiro Sakai
PDF
混合ガウスモデルとEMアルゴリスム
by
貴之 八木
PPTX
Triplet Lossによる Person Re-identification
by
tancoro
PDF
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
by
Deep Learning JP
PPTX
金融時系列のための深層t過程回帰モデル
by
Kei Nakagawa
PPTX
【LT資料】 Neural Network 素人なんだけど何とかご機嫌取りをしたい
by
Takuji Tahara
PDF
ディープラーニングのフレームワークと特許戦争
by
Yosuke Shinya
PDF
機械学習モデルの判断根拠の説明
by
Satoshi Hara
PPT
Anova君を使った分散分析
by
Takashi Yamane
機械学習工学の進展と課題 2021
by
Fuyuki Ishikawa
今更聞けない!?Microsoft Graph で始める Office 365 データ活用と事例の紹介
by
Kenichiro Nakamura
マルチテナントのアプリケーション実装〜実践編〜
by
Yoshiki Nakagawa
分散学習のあれこれ~データパラレルからモデルパラレルまで~
by
Hideki Tsunashima
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
ビジネスルールの複雑さに立ち向かう
by
増田 亨
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
オーバーエンジニアリングって何? #devsumi #devsumiA
by
Ore Product
DRIVE CHARTを支えるAI技術
by
Yusuke Uchida
App013 ここはあえて紙と
by
Tech Summit 2016
階層ベイズによるワンToワンマーケティング入門
by
shima o
SAT/SMTソルバの仕組み
by
Masahiro Sakai
混合ガウスモデルとEMアルゴリスム
by
貴之 八木
Triplet Lossによる Person Re-identification
by
tancoro
[DL輪読会]Non-Autoregressive Machine Translation with Latent Alignments
by
Deep Learning JP
金融時系列のための深層t過程回帰モデル
by
Kei Nakagawa
【LT資料】 Neural Network 素人なんだけど何とかご機嫌取りをしたい
by
Takuji Tahara
ディープラーニングのフレームワークと特許戦争
by
Yosuke Shinya
機械学習モデルの判断根拠の説明
by
Satoshi Hara
Anova君を使った分散分析
by
Takashi Yamane
Viewers also liked
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
by
Takuya Ueda
PDF
GoによるiOSアプリの開発
by
Takuya Ueda
PDF
オススメの標準・準標準パッケージ20選
by
Takuya Ueda
PDF
Javaトラブルに備えよう #jjug_ccc #ccc_h2
by
Norito Agetsuma
PDF
粗探しをしてGoのコントリビューターになる方法
by
Takuya Ueda
PDF
Mobile Apps by Pure Go with Reverse Binding
by
Takuya Ueda
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
by
Takuya Ueda
PPTX
WebRTC Browsers n Stacks Implementation differences
by
Alexandre Gouaillard
PDF
Goにおける静的解析と製品開発への応用
by
Takuya Ueda
PDF
goパッケージで型情報を用いたソースコード検索を実現する
by
Takuya Ueda
PDF
Static Analysis in Go
by
Takuya Ueda
PDF
Go1.8 for Google App Engine
by
Takuya Ueda
PDF
条件式評価器の実装による管理ツールの抽象化
by
Takuya Ueda
PDF
Cloud Functionsの紹介
by
Takuya Ueda
PDF
Cloud functionsの紹介
by
Takuya Ueda
PDF
Namespace API を用いたマルチテナント型 Web アプリの実践
by
Takuya Ueda
PDF
Google Assistant関係のセッションまとめ
by
Takuya Ueda
PPTX
うしちゃん WebRTC Chat on SkyWayの開発コードw
by
Kensaku Komatsu
PDF
HTTP2 RFC 発行記念祝賀会
by
Jxck Jxck
PDF
HTTP2 時代の Web - web over http2
by
Jxck Jxck
メルカリ・ソウゾウでは どうGoを活用しているのか?
by
Takuya Ueda
GoによるiOSアプリの開発
by
Takuya Ueda
オススメの標準・準標準パッケージ20選
by
Takuya Ueda
Javaトラブルに備えよう #jjug_ccc #ccc_h2
by
Norito Agetsuma
粗探しをしてGoのコントリビューターになる方法
by
Takuya Ueda
Mobile Apps by Pure Go with Reverse Binding
by
Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
by
Takuya Ueda
WebRTC Browsers n Stacks Implementation differences
by
Alexandre Gouaillard
Goにおける静的解析と製品開発への応用
by
Takuya Ueda
goパッケージで型情報を用いたソースコード検索を実現する
by
Takuya Ueda
Static Analysis in Go
by
Takuya Ueda
Go1.8 for Google App Engine
by
Takuya Ueda
条件式評価器の実装による管理ツールの抽象化
by
Takuya Ueda
Cloud Functionsの紹介
by
Takuya Ueda
Cloud functionsの紹介
by
Takuya Ueda
Namespace API を用いたマルチテナント型 Web アプリの実践
by
Takuya Ueda
Google Assistant関係のセッションまとめ
by
Takuya Ueda
うしちゃん WebRTC Chat on SkyWayの開発コードw
by
Kensaku Komatsu
HTTP2 RFC 発行記念祝賀会
by
Jxck Jxck
HTTP2 時代の Web - web over http2
by
Jxck Jxck
Similar to Go静的解析ハンズオン
PDF
静的解析を使った開発ツールの開発
by
Takuya Ueda
PDF
Goでかんたんソースコードの静的解析
by
Takuya Ueda
PDF
Go入門
by
Takuya Ueda
PDF
エキスパートGo
by
Takuya Ueda
PDF
エディタの壁を越えるGoの開発ツールの文化と作成法
by
Takuya Ueda
PDF
Goとテスト
by
Takuya Ueda
PDF
Goで言語処理系(の途中まで)を作ろう
by
Esehara Shigeo
PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
by
Takuya Ueda
PDF
ErlangでErlagVM上で動く言語の作り方
by
osamu kimura
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
by
Google Developer Relations Team
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
by
Minero Aoki
PDF
マスター・オブ・goパッケージ
by
Takuya Ueda
PDF
Go Friday 傑作選
by
Takuya Ueda
PDF
Gopher Fest 2017参加レポート
by
Takuya Ueda
PDF
初心者向けGo言語勉強会
by
leverages_event
PDF
TechDo Goハンズオン#3
by
privatemy
PDF
認証Gwのプロトタイプでgolang使ってみた20171024
by
Kohji Osamura
PPTX
Go guide for Java programmer
by
Masaaki Yonebayashi
PDF
PCさえあればいい。
by
bleis tift
PDF
GitHub での Haskell の色が変わったんで
by
Nobutada Matsubara
静的解析を使った開発ツールの開発
by
Takuya Ueda
Goでかんたんソースコードの静的解析
by
Takuya Ueda
Go入門
by
Takuya Ueda
エキスパートGo
by
Takuya Ueda
エディタの壁を越えるGoの開発ツールの文化と作成法
by
Takuya Ueda
Goとテスト
by
Takuya Ueda
Goで言語処理系(の途中まで)を作ろう
by
Esehara Shigeo
今日から始めるGopher - スタートGo #0 @GDG名古屋
by
Takuya Ueda
ErlangでErlagVM上で動く言語の作り方
by
osamu kimura
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
by
Google Developer Relations Team
Cookpad Summer Intern 2015 - Programming Paradigm
by
Minero Aoki
マスター・オブ・goパッケージ
by
Takuya Ueda
Go Friday 傑作選
by
Takuya Ueda
Gopher Fest 2017参加レポート
by
Takuya Ueda
初心者向けGo言語勉強会
by
leverages_event
TechDo Goハンズオン#3
by
privatemy
認証Gwのプロトタイプでgolang使ってみた20171024
by
Kohji Osamura
Go guide for Java programmer
by
Masaaki Yonebayashi
PCさえあればいい。
by
bleis tift
GitHub での Haskell の色が変わったんで
by
Nobutada Matsubara
More from Takuya Ueda
PDF
Goにおけるバージョン管理の必要性 − vgoについて −
by
Takuya Ueda
PDF
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
by
Takuya Ueda
PDF
メルカリ カウルのマスタデータの更新
by
Takuya Ueda
PDF
GAE/GoでLINE Messaging API を使う
by
Takuya Ueda
PDF
GAE/Goとsyncパッケージ
by
Takuya Ueda
PDF
GAE/GoでWebアプリ開発入門
by
Takuya Ueda
PDF
Goでwebアプリを開発してみよう
by
Takuya Ueda
PDF
WebAssembly with Go
by
Takuya Ueda
PDF
そうだ、Goを始めよう
by
Takuya Ueda
Goにおけるバージョン管理の必要性 − vgoについて −
by
Takuya Ueda
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
by
Takuya Ueda
メルカリ カウルのマスタデータの更新
by
Takuya Ueda
GAE/GoでLINE Messaging API を使う
by
Takuya Ueda
GAE/Goとsyncパッケージ
by
Takuya Ueda
GAE/GoでWebアプリ開発入門
by
Takuya Ueda
Goでwebアプリを開発してみよう
by
Takuya Ueda
WebAssembly with Go
by
Takuya Ueda
そうだ、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