Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心

Avatar for Ryotaro Ryotaro
September 28, 2025

なぜGoのジェネリクスはこの形なのか? Featherweight Goが明かす設計の核心

Avatar for Ryotaro

Ryotaro

September 28, 2025
Tweet

Other Decks in Programming

Transcript

  1. Featherweight Goのアプローチ Goチームの要件 
 • 使いやすく理解しやすいこと
 • ランタイムコストが低いこと
 • 可能な限り保守的な拡張であること

    
 方針
 • 構造的サブタイピングとジェネリクスの組み合わせ
 • 追加の言語機能なしに型制約を導入
 • モノモーフィゼーションに基づいたコンパイル戦略 

  2. FGG

  3. まとめ FGの世界
 • 多態性をインターフェースで表現
 • 型の安全性は実行時に型アサーションで保証(プログラマの責任)
 • 常にパニックのリスクが伴う 
 FGGの世界


    • 多態性を型パラメータで表現
 • 型の安全性はコンパイル時に型制約で保証(コンパイラの責任)
 • パニックのリスクをコンパイル時に排除 

  4. ジェネリクスのコンパイル戦略 モノモーフィゼーション 
 • 型ごとに使われている部分の専用コードを生成
 • List[string] →(コンパイル)→ string専用のList
 •

    ランタイムで型アサーションが制限されない 
 • ランタイムオーバーヘッドが低いが、メモリをより食う 
 イレイジャ
 • コンパイル時に型情報を削除
 • List<String> →(コンパイル)→ List
 • ランタイムで型アサーションができない 
 • メモリはあまり食わない 

  5. Expression Problem Eval(評価) String(文字列化) PrettyPrint (整形) Num (数) 実装済み 実装済み

    後から追加したい Plus (足し算) 実装済み 実装済み 後から追加したい Mul (掛け算) 後から追加したい 後から追加したい 後から追加したい 行(データ型)と列(操作)のテーブル 関数型言語は列の追加が得意、オブジェクト指向言語は行の追加が得意
  6. Goと共変レシーバ リリースされた Goのジェネリクスも不変 (invariant) な設計を採用 - 構造体を定義した時点での型制約が、その後のすべてのメソッドで一貫して適用 - Plus[T any]ならメソッドも

    anyのまま、Plus[T Expr]ならメソッドも Exprのまま 現在のGoで、式問題のような拡張性を実現するには
 • 柔軟性を諦め、静的な安全性を取るか
 • 静的な安全性を諦め、柔軟性を取るか
 • 2つのトレードオフに直面