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
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ryotaro
September 28, 2025
Programming
2.5k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心
https://gocon.jp/2025/talks/958641/
Ryotaro
September 28, 2025
Other Decks in Programming
See All in Programming
フィードバックで育てるAI開発
kotaminato
1
110
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
140
継続モナドとリアクティブプログラミング
yukikurage
3
490
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
340
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
280
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
200
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
370
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.4k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
Bash Introduction
62gerente
615
220k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
320
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
310
AI: The stuff that nobody shows you
jnunemaker
PRO
8
820
Transcript
なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心 CyberAgent / Qualiarts 鈴木 稜太朗 Go Conference
2025
Ryotaro Suzuki •CyberAgent / Qualiarts バックエンドエンジニアとして、運用タイトルの 開発をしている 圏論がとっても好き Go歴は2年くらい Haskellが8年くらい
GOとジェネリクス
ジェネリクスを求める声 Go Developer Survey 2019 Resultsより https://go.dev/blog/survey2019-results
初期案 型が満たすべき条件を定義する contractsの導入 https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md
想定実装
想定実装
contractsの撤回 • 新しい概念の追加になるので、大変 • すでに「interface」という型の振る舞いを定義できるものがある interfaceをそのまま型制約に上手く使って実装したい
Featherweight Go
Featherweight Go Goチームからの依頼で執筆 ジェネリクス設計において根本の設計思想 ジェリックなコードをどのように変換するか定式化
Featherweight Java
各研究でのモデル FG:Go言語の主要な機能を抽出した最小限の言語モデル FGG:FGにジェネリクスを追加した言語モデル Featherweight Go FJ:Javaの主要な機能を抽出した最小限の言語モデル FGJ:FJにジェネリクスを追加した言語モデル Featherweight Java
Featherweight Goのアプローチ Goチームの要件 • 使いやすく理解しやすいこと • ランタイムコストが低いこと • 可能な限り保守的な拡張であること
方針 • 構造的サブタイピングとジェネリクスの組み合わせ • 追加の言語機能なしに型制約を導入 • モノモーフィゼーションに基づいたコンパイル戦略
FGとFGG
FG • チューニング完全な関数型言語としてモデル化 • Goのコンパクトなサブセット Structs Method Interfaces Structural Typing
• 型アサーション e.(t)
FGモデル
FGの例
FGの課題 EqualにEqを満たした別の型を渡す 実行時にパニック!! ジェネリクスのない世界での多態の限界 『実行時まで安全かわからない』という問題を 解決するのが FGGの設計
FGG • FGのStructs、Methods、Interfacesが型パラメーターを持つ • 型パラメータの制約に Interfacesを使用 • 汎用的な構造に対し、特化した制約を持つ Methodsを定義可能 (共変レ
シーバ) • 構造的サブタイピングを維持
FGG
FGGの例
FGGの比較
FGGの例(再帰的型制約)
FGGの比較
FGGモデル
まとめ FGの世界 • 多態性をインターフェースで表現 • 型の安全性は実行時に型アサーションで保証(プログラマの責任) • 常にパニックのリスクが伴う FGGの世界
• 多態性を型パラメータで表現 • 型の安全性はコンパイル時に型制約で保証(コンパイラの責任) • パニックのリスクをコンパイル時に排除
コンパイル戦略
ジェネリクスのコンパイル戦略 FJ FGJ ジェネリクス イレイジャ FG FGG ジェネリクス モノモーフィゼーション
ジェネリクスのコンパイル戦略 モノモーフィゼーション • 型ごとに使われている部分の専用コードを生成 • List[string] →(コンパイル)→ string専用のList •
ランタイムで型アサーションが制限されない • ランタイムオーバーヘッドが低いが、メモリをより食う イレイジャ • コンパイル時に型情報を削除 • List<String> →(コンパイル)→ List • ランタイムで型アサーションができない • メモリはあまり食わない
変換するFGGのコード
FGGからFGへの変換
FGGからFGへの変換
Pairの場合
多相再帰:モノモルフィゼーションできない 全ての型付け可能なFGGがFGに変換できるわけではない
ダミーメソッド
ダミーメソッド なんのためにダミーメソッドが生成されるのか?
ダミーメソッドの例(List)
ダミーメソッドの例(List) List<bool>のmapは使用しない
ダミーメソッドがない場合 • List[bool]のMapは未使用 • コンパイラはメソッドを省略し、空のイ ンターフェースを生成 • 全ての型が空のインターフェースを満 たす •
コンパイルエラーになるべきlistBool = listIntが可能になり、 型安全性が崩壊
ダミーメソッドの追加
Expression Problem(式問題)
Expression Problem Eval(評価) String(文字列化) PrettyPrint (整形) Num (数) 実装済み 実装済み
後から追加したい Plus (足し算) 実装済み 実装済み 後から追加したい Mul (掛け算) 後から追加したい 後から追加したい 後から追加したい 行(データ型)と列(操作)のテーブル 関数型言語は列の追加が得意、オブジェクト指向言語は行の追加が得意
FGGのアプローチ 「汎用的な構造体定義」と「特化した制約を持つメソッド」の組み合わせ 共変レシーバが、静的な型安全ながら高い拡張性を実現
Goと共変レシーバ リリースされた Goのジェネリクスも不変 (invariant) な設計を採用 - 構造体を定義した時点での型制約が、その後のすべてのメソッドで一貫して適用 - Plus[T any]ならメソッドも
anyのまま、Plus[T Expr]ならメソッドも Exprのまま 現在のGoで、式問題のような拡張性を実現するには • 柔軟性を諦め、静的な安全性を取るか • 静的な安全性を諦め、柔軟性を取るか • 2つのトレードオフに直面
柔軟性の低下
型アサーションの復活
まとめ
まとめ • contractsという新しい概念ではなく、interfaceを土台に変更 • Goチームから多大な感謝が送られた ◦ あなた方の型理論に関する研究のおかげで、我々の理解は絶 大なまでに明確になりました。本当にありがとう! ◦ 理論と実践が結びついた
• 共変レシーバさん...どこ...?
ありがとうございました