Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
空の型セットを検出したい
Search
nobishii
May 18, 2021
Programming
0
200
空の型セットを検出したい
https://andpad.connpass.com/event/212051/
nobishii
May 18, 2021
Tweet
Share
More Decks by nobishii
See All by nobishii
introduction to type sets
nobishino
1
1.8k
Other Decks in Programming
See All in Programming
CA.swift19 恋するAIアプリ開発の裏側
oskmr
0
330
1BRC--Nerd Sniping the Java Community
gunnarmorling
0
300
9年開発を牽引して見えてきた、共通化すべきものと個別でつくるもの ~プログラム言語~
shinout
1
640
puregoの活用例
aethiopicuschan
0
220
ONE WEDGE_company_guide
1wedge_one
0
330
スクラムガイドのスプリントレトロスペクティブを改めて読みかえしてみた / Re-reading the Sprint Retrospective Section in the Scrum Guide
mackey0225
3
320
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
360
try! Swift Tokyo 初参加報告LT
hinakko2
0
180
"config" ってなんだ? / What is "config"?
okashoi
0
210
pixivアプリでマルチモジュールを実現するまで
gatosyocora
1
130
⼤規模⾔語モデルの拡張(RAG)が 終わったかも知れない件について
nearme_tech
22
15k
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
25
7.6k
Featured
See All Featured
Web development in the modern age
philhawksworth
201
10k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
19
1.9k
The Art of Programming - Codeland 2020
erikaheidi
41
12k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
240
1.2M
The Mythical Team-Month
searls
214
42k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
657
120k
The Cult of Friendly URLs
andyhume
73
5.7k
Into the Great Unknown - MozCon
thekraken
10
980
Infographics Made Easy
chrislema
237
18k
GraphQLとの向き合い方2022年版
quramy
29
12k
Build The Right Thing And Hit Your Dates
maggiecrowley
23
2k
Transcript
空の型セットを検出したい https://andpad.connpass.com/event/212051/ 2021/05/19(水) @shino_nobishii
自己紹介 - Nobishii(のびしー) @shino_nobishii - Go言語経験 2020年2月〜 - 静的解析初心者 -
Go言語仕様書の知識が少しあります
目次 - 背景: 型パラメータと型制約と型セット - 型セットの具体例 - 問題: 空の型セット -
Underlying type - サンプルコード: Underlying typeが自分自身かどうかを判定する - 参考資料
型セットってなんだ? いきなり知らないものが出てき たけど...
背景 - 型パラメータ(ジェネリクス) Proposal: accepted - 型制約をinterfaceとして記述する - 型セットProposal: acceptedではないけどacceptされそうな状況
- 型制約の記述方法を改善するもの - 全ての型は、型セットを持つ - 「型Tがinterface Iを実装する」は「型TがIの型セットに属する」と同じ意味になる
型セットの具体例
underlying typeってなんだ? また知らないものが出てきたけ ど... 少し後で出てきます!
空の型セット問題: これを実装する型は存在しない! https://github.com/golang/go/issues/45346 より引用
結論:コンパイラで空の型セットはチェックされない 我々は諦めない。 コンパイラも使わず、コードを実行もせずに 型セットの性質を調べる、そんな手段を見つ けさえすればいいのだ。 あるいは夢物語かもしれないが ...
静的解析で型セットを調べる - 「空の型セット」の検出を一般的に解決するのは難しい - 特定の場合なら解決できる - その一つが”underlying type”に関係するパターン - 静的解析を使う
型セットの具体例
underlying typeとは
underlying typeとは - ~Tは、「underlying typeがTである ような全ての型」の集合 - ~int は{int ,
MyInt, MyMyInt, …} - ~MyInt は {} (空集合) - underlying typeがMyIntになるよう な型は存在しないから - intの特徴: underlying typeが自分 自身
判定方法 - ~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を返す
Underlying typeが自分自身かどうかを判定する - サンプルコードをきれいに貼れなかったのでGitHubで説明します - https://github.com/nobishino/studyast/blob/main/main.go#L40
参考資料 - Go公式資料 - Type Parameters Proposal 型パラメータ(ジェネリクス)に関するProposal(accepted) - https://github.com/golang/go/issues/45346
型セットに関するProposal - その他資料 - Go の "Type Sets" proposal を読む - underlying types by DQNEOさん - 発表アーカイブ動画 - 勇者さま一行のイラストは いらすとや様からお借りしました