空の型セットを検出したい
by
nobishii
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
空の型セットを検出したい https://andpad.connpass.com/event/212051/ 2021/05/19(水) @shino_nobishii
Slide 2
Slide 2 text
自己紹介 - Nobishii(のびしー) @shino_nobishii - Go言語経験 2020年2月〜 - 静的解析初心者 - Go言語仕様書の知識が少しあります
Slide 3
Slide 3 text
目次 - 背景: 型パラメータと型制約と型セット - 型セットの具体例 - 問題: 空の型セット - Underlying type - サンプルコード: Underlying typeが自分自身かどうかを判定する - 参考資料
Slide 4
Slide 4 text
型セットってなんだ? いきなり知らないものが出てき たけど...
Slide 5
Slide 5 text
背景 - 型パラメータ(ジェネリクス) Proposal: accepted - 型制約をinterfaceとして記述する - 型セットProposal: acceptedではないけどacceptされそうな状況 - 型制約の記述方法を改善するもの - 全ての型は、型セットを持つ - 「型Tがinterface Iを実装する」は「型TがIの型セットに属する」と同じ意味になる
Slide 6
Slide 6 text
型セットの具体例
Slide 7
Slide 7 text
underlying typeってなんだ? また知らないものが出てきたけ ど... 少し後で出てきます!
Slide 8
Slide 8 text
空の型セット問題: これを実装する型は存在しない! https://github.com/golang/go/issues/45346 より引用
Slide 9
Slide 9 text
結論:コンパイラで空の型セットはチェックされない 我々は諦めない。 コンパイラも使わず、コードを実行もせずに 型セットの性質を調べる、そんな手段を見つ けさえすればいいのだ。 あるいは夢物語かもしれないが ...
Slide 10
Slide 10 text
静的解析で型セットを調べる - 「空の型セット」の検出を一般的に解決するのは難しい - 特定の場合なら解決できる - その一つが”underlying type”に関係するパターン - 静的解析を使う
Slide 11
Slide 11 text
型セットの具体例
Slide 12
Slide 12 text
underlying typeとは
Slide 13
Slide 13 text
underlying typeとは - ~Tは、「underlying typeがTである ような全ての型」の集合 - ~int は{int , MyInt, MyMyInt, …} - ~MyInt は {} (空集合) - underlying typeがMyIntになるよう な型は存在しないから - intの特徴: underlying typeが自分 自身
Slide 14
Slide 14 text
判定方法 - ~SomeTypeをParseする(※今日は行いません) - SomeTypeのunderlying typeがSomeTypeに等しいかどうか調べる - 使う関数: - (*types.Package).Scope() *types.Scope - パッケージレベルで宣言されたモノを取得 - (*types.Scope).Lookup(name string) types.Object - Scopeから名前で検索 - (types.Type).Underlying() types.Type - ある型のunderlying typeを返す
Slide 15
Slide 15 text
Underlying typeが自分自身かどうかを判定する - サンプルコードをきれいに貼れなかったのでGitHubで説明します - https://github.com/nobishino/studyast/blob/main/main.go#L40
Slide 16
Slide 16 text
参考資料 - Go公式資料 - Type Parameters Proposal 型パラメータ(ジェネリクス)に関するProposal(accepted) - https://github.com/golang/go/issues/45346 型セットに関するProposal - その他資料 - Go の "Type Sets" proposal を読む - underlying types by DQNEOさん - 発表アーカイブ動画 - 勇者さま一行のイラストは いらすとや様からお借りしました