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