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
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
PDF
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
by
Kazumi OHIRA
PDF
ストリーム処理を支えるキューイングシステムの選び方
by
Yoshiyasu SAEKI
PDF
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
PDF
Best Practices for Running PostgreSQL on AWS
by
Amazon Web Services Japan
PDF
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
by
Takahiko Ito
PPTX
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
by
Tokoroten Nakayama
PPTX
backlogsでもCI/CDする夢を見る
by
Takeru Maehara
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
GitHub Codespaces と Azure でつくる、エンタープライズレベルの開発環境
by
Kazumi OHIRA
ストリーム処理を支えるキューイングシステムの選び方
by
Yoshiyasu SAEKI
Python 3.9からの新定番zoneinfoを使いこなそう
by
Ryuji Tsutsui
Best Practices for Running PostgreSQL on AWS
by
Amazon Web Services Japan
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
by
Takahiko Ito
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
by
Tokoroten Nakayama
backlogsでもCI/CDする夢を見る
by
Takeru Maehara
What's hot
PPTX
Spring Integration 超入門
by
Yasutaka Sugamura
PPTX
DevOps勉強会
by
Shuntaro Saiba
PPTX
PenTesterが知っている危ないAWS環境の共通点
by
zaki4649
PDF
チケット駆動開発の解説~タスク管理からプロセス改善へ
by
akipii Oga
PDF
[AWS Summit 2012] クラウドデザインパターン#5 CDP バッチ処理編
by
Amazon Web Services Japan
PPTX
Redmineでメトリクスを見える化する方法
by
Hidehisa Matsutani
PDF
10分でわかる Cilium と XDP / BPF
by
Shuji Yamada
PDF
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
by
Hironobu Isoda
PDF
Confluenceショートカットキー表 v1
by
Naho Inuyama
ODP
Code Golf
by
Shinichiro Hamaji
PPTX
初心者向けMongoDBのキホン!
by
Tetsutaro Watanabe
PDF
マイクロサービス 4つの分割アプローチ
by
増田 亨
PDF
誰でもできるスマートシティ向けOSS : FIWAREのはじめかた
by
Shunsuke Kikuchi
PPTX
アジャイルメトリクス実践ガイド
by
Hiroyuki Ito
PDF
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
by
Masahito Zembutsu
PDF
MQTTとAMQPと.NET
by
terurou
PDF
Scapyで作る・解析するパケット
by
Takaaki Hoyo
PPTX
Apache Avro vs Protocol Buffers
by
Seiya Mizuno
PDF
View customize plugin for Redmineの紹介 (2019年版)
by
onozaty
PPTX
テストコードの DRY と DAMP
by
Yusuke Kagata
Spring Integration 超入門
by
Yasutaka Sugamura
DevOps勉強会
by
Shuntaro Saiba
PenTesterが知っている危ないAWS環境の共通点
by
zaki4649
チケット駆動開発の解説~タスク管理からプロセス改善へ
by
akipii Oga
[AWS Summit 2012] クラウドデザインパターン#5 CDP バッチ処理編
by
Amazon Web Services Japan
Redmineでメトリクスを見える化する方法
by
Hidehisa Matsutani
10分でわかる Cilium と XDP / BPF
by
Shuji Yamada
LogbackからLog4j 2への移行によるアプリケーションのスループット改善 ( JJUG CCC 2021 Fall )
by
Hironobu Isoda
Confluenceショートカットキー表 v1
by
Naho Inuyama
Code Golf
by
Shinichiro Hamaji
初心者向けMongoDBのキホン!
by
Tetsutaro Watanabe
マイクロサービス 4つの分割アプローチ
by
増田 亨
誰でもできるスマートシティ向けOSS : FIWAREのはじめかた
by
Shunsuke Kikuchi
アジャイルメトリクス実践ガイド
by
Hiroyuki Ito
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
by
Masahito Zembutsu
MQTTとAMQPと.NET
by
terurou
Scapyで作る・解析するパケット
by
Takaaki Hoyo
Apache Avro vs Protocol Buffers
by
Seiya Mizuno
View customize plugin for Redmineの紹介 (2019年版)
by
onozaty
テストコードの DRY と DAMP
by
Yusuke Kagata
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