なぜGoのジェネリクスはこの形なのか? - Featherweight Goが明かす設計の核心
by
QualiArts
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
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心 CyberAgent / Qualiarts 鈴木 稜太朗 Go Conference 2025
Slide 2
Slide 2 text
Ryotaro Suzuki •CyberAgent / Qualiarts バックエンドエンジニアとして、運用タイトルの 開発をしている 圏論がとっても好き Go歴は2年くらい Haskellが8年くらい
Slide 3
Slide 3 text
資料
Slide 4
Slide 4 text
GOとジェネリクス
Slide 5
Slide 5 text
ジェネリクスを求める声 Go Developer Survey 2019 Resultsより https://go.dev/blog/survey2019-results
Slide 6
Slide 6 text
初期案 型が満たすべき条件を定義する contractsの導入 https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md
Slide 7
Slide 7 text
想定実装
Slide 8
Slide 8 text
想定実装
Slide 9
Slide 9 text
contractsの撤回 • 新しい概念の追加になるので、大変 • すでに「interface」という型の振る舞いを定義できるものがある interfaceをそのまま型制約に上手く使って実装したい
Slide 10
Slide 10 text
Featherweight Go
Slide 11
Slide 11 text
Featherweight Go Goチームからの依頼で執筆 ジェネリクス設計において根本の設計思想 ジェリックなコードをどのように変換するか定式化
Slide 12
Slide 12 text
Featherweight Java
Slide 13
Slide 13 text
各研究でのモデル FG:Go言語の主要な機能を抽出した最小限の言語モデル FGG:FGにジェネリクスを追加した言語モデル Featherweight Go FJ:Javaの主要な機能を抽出した最小限の言語モデル FGJ:FJにジェネリクスを追加した言語モデル Featherweight Java
Slide 14
Slide 14 text
Featherweight Goのアプローチ Goチームの要件 ● 使いやすく理解しやすいこと ● ランタイムコストが低いこと ● 可能な限り保守的な拡張であること 方針 ● 構造的サブタイピングとジェネリクスの組み合わせ ● 追加の言語機能なしに型制約を導入 ● モノモーフィゼーションに基づいたコンパイル戦略
Slide 15
Slide 15 text
FGとFGG
Slide 16
Slide 16 text
FG • チューニング完全な関数型言語としてモデル化 • Goのコンパクトなサブセット Structs Method Interfaces Structural Typing • 型アサーション e.(t)
Slide 17
Slide 17 text
FGモデル
Slide 18
Slide 18 text
FGモデル
Slide 19
Slide 19 text
FGの例
Slide 20
Slide 20 text
FGの課題 EqualにEqを満たした別の型を渡す 実行時にパニック!! ジェネリクスのない世界での多態の限界 『実行時まで安全かわからない』という問題を 解決するのが FGGの設計
Slide 21
Slide 21 text
FGG • FGのStructs、Methods、Interfacesが型パラメーターを持つ • 型パラメータの制約に Interfacesを使用 • 汎用的な構造に対し、特化した制約を持つ Methodsを定義可能 (共変レ シーバ) • 構造的サブタイピングを維持
Slide 22
Slide 22 text
FGG
Slide 23
Slide 23 text
FGGの例
Slide 24
Slide 24 text
FGGの比較
Slide 25
Slide 25 text
FGGの例(再帰的型制約)
Slide 26
Slide 26 text
FGGの比較
Slide 27
Slide 27 text
FGGモデル
Slide 28
Slide 28 text
まとめ FGの世界 ● 多態性をインターフェースで表現 ● 型の安全性は実行時に型アサーションで保証(プログラマの責任) ● 常にパニックのリスクが伴う FGGの世界 ● 多態性を型パラメータで表現 ● 型の安全性はコンパイル時に型制約で保証(コンパイラの責任) ● パニックのリスクをコンパイル時に排除
Slide 29
Slide 29 text
コンパイル戦略
Slide 30
Slide 30 text
ジェネリクスのコンパイル戦略 FJ FGJ ジェネリクス イレイジャ FG FGG ジェネリクス モノモーフィゼーション
Slide 31
Slide 31 text
ジェネリクスのコンパイル戦略 モノモーフィゼーション ● 型ごとに使われている部分の専用コードを生成 ● List[string] →(コンパイル)→ string専用のList ● ランタイムで型アサーションが制限されない ● ランタイムオーバーヘッドが低いが、メモリをより食う イレイジャ ● コンパイル時に型情報を削除 ● List →(コンパイル)→ List ● ランタイムで型アサーションができない ● メモリはあまり食わない
Slide 32
Slide 32 text
変換するFGGのコード
Slide 33
Slide 33 text
FGGからFGへの変換
Slide 34
Slide 34 text
FGGからFGへの変換
Slide 35
Slide 35 text
Pairの場合
Slide 36
Slide 36 text
多相再帰:モノモルフィゼーションできない 全ての型付け可能なFGGがFGに変換できるわけではない
Slide 37
Slide 37 text
ダミーメソッド
Slide 38
Slide 38 text
ダミーメソッド なんのためにダミーメソッドが生成されるのか?
Slide 39
Slide 39 text
ダミーメソッドの例(List)
Slide 40
Slide 40 text
ダミーメソッドの例(List) Listのmapは使用しない
Slide 41
Slide 41 text
ダミーメソッドがない場合 ● List[bool]のMapは未使用 ● コンパイラはメソッドを省略し、空のイ ンターフェースを生成 ● 全ての型が空のインターフェースを満 たす ● コンパイルエラーになるべきlistBool = listIntが可能になり、 型安全性が崩壊
Slide 42
Slide 42 text
ダミーメソッドの追加
Slide 43
Slide 43 text
Expression Problem(式問題)
Slide 44
Slide 44 text
Expression Problem Eval(評価) String(文字列化) PrettyPrint (整形) Num (数) 実装済み 実装済み 後から追加したい Plus (足し算) 実装済み 実装済み 後から追加したい Mul (掛け算) 後から追加したい 後から追加したい 後から追加したい 行(データ型)と列(操作)のテーブル 関数型言語は列の追加が得意、オブジェクト指向言語は行の追加が得意
Slide 45
Slide 45 text
FGGのアプローチ 「汎用的な構造体定義」と「特化した制約を持つメソッド」の組み合わせ 共変レシーバが、静的な型安全ながら高い拡張性を実現
Slide 46
Slide 46 text
Goと共変レシーバ リリースされた Goのジェネリクスも不変 (invariant) な設計を採用 - 構造体を定義した時点での型制約が、その後のすべてのメソッドで一貫して適用 - Plus[T any]ならメソッドも anyのまま、Plus[T Expr]ならメソッドも Exprのまま 現在のGoで、式問題のような拡張性を実現するには ● 柔軟性を諦め、静的な安全性を取るか ● 静的な安全性を諦め、柔軟性を取るか ● 2つのトレードオフに直面
Slide 47
Slide 47 text
柔軟性の低下
Slide 48
Slide 48 text
型アサーションの復活
Slide 49
Slide 49 text
まとめ
Slide 50
Slide 50 text
まとめ ● contractsという新しい概念ではなく、interfaceを土台に変更 ● Goチームから多大な感謝が送られた ○ あなた方の型理論に関する研究のおかげで、我々の理解は絶 大なまでに明確になりました。本当にありがとう! ○ 理論と実践が結びついた ● 共変レシーバさん...どこ...?
Slide 51
Slide 51 text
ありがとうございました