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

ありがとうございました