型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
by
mazrean
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
Conference に Go! タイムテーブルの歩き方 for Gophers 型解析で実現する Go の言語内 DSL @mazrean
Slide 2
Slide 2 text
マズリーン mazrean ■ Goでツール等を作っている ● DIツールKessoku ■ Go Proposal Weekly Digest ■ SRE @DeNA @mazrean22 2
Slide 3
Slide 3 text
マズリーン mazrean ■ Goでツール等を作っている ● DIツールKessoku ■ Go Proposal Weekly Digest ■ SRE @DeNA 今日はこの話 @mazrean22 3
Slide 4
Slide 4 text
mazrean/kessoku 並行処理 でDIするためのツール ■ 初期化はIO latencyが律速 ■ 並行処理コード を生成し高速化 Cache DB App 4
Slide 5
Slide 5 text
kessokuの設定 設定をGoコードとしてかける ■ 関数名などに補完が効く ■ 変数・パッケージ分割 なども使える Cache DB App 5
Slide 6
Slide 6 text
嬉しい
Slide 7
Slide 7 text
嬉しい 使用者は
Slide 8
Slide 8 text
Goを設定ファイルにする難しさ 自由度が過剰で解析が難しい ■ 変数の追跡 ● ssa 使えば不可能ではない ● ただ、追跡の実装が大変 ■ 想定外の値の使用防止 ● バリデーションに際限がない ■ 構文上正しい書き方ができない と悪体験 8
Slide 9
Slide 9 text
Q. どうする? A. 型で解決する
Slide 10
Slide 10 text
型を利用した設定構成 型情報に全設定を入れる ■ 型パラメーター に情報を詰め込む kessoku.asyncProvider [ func() *Cache, kessoku.fnProvider [ func() *Cache ]] 並行化対象 最終初期化関数 型 初期化関数を提供 初期化関数型 10
Slide 11
Slide 11 text
設定のパース 静的解析 で簡単にパース可能 ■ 型解析は標準・準標準ライブラリ で可能 ● go/types ● golang.org/x/tools/go/packages ■ あとは型を再帰的に解析するだけ 11
Slide 12
Slide 12 text
設定の制限 型制約で設定を制限 ■ 設定はprivateな構造体型 で構成 ■ 最上段はprivate method付きinterface ● 変数を作る手段がなく代入不可 → 一意な既知の型のみに制限 12
Slide 13
Slide 13 text
型のみではできないこと パラメータ数が可変 の設定は実現できない ■ 型引数は固定長なため実現不可 ■ ここだけはssaで頑張る必要がある ssaベースで解析 13
Slide 14
Slide 14 text
話したかったこと ■ 全体的に詳しい解説 ● 特に型制約 ● かなり端折っている ■ コード生成との結合方法 ■ 1.27で入ったGeneric Methodの活用 14
Slide 15
Slide 15 text
まとめ ■ kessokuではGo言語で設定を記述できる ■ 型での設定なら使用者・開発者両方幸せ ● 使用者視点で自由度が高い ● 開発者的にも解析が楽 ■ 可変長の設定は型のみでは扱えない ● それでもかなり手間は減る ■ Go Conference で話したかった~~~~~ 15