辞書渡し(dictionary passing)

ジェネリクス(総称型)を実装する方式のひとつ。ジェネリックなコード(関数など)の機械語は型ごとに複製せず1本だけ生成し、型ごとに異なる振る舞い(演算・メソッド呼び出しなど)は呼び出し側から「辞書」というデータ構造として実行時に渡す。関数側は辞書に入っている関数ポインタや型情報を引いて処理を行う。

Haskellの型クラス(type class)実装がこの方式の代表例。対になる方式が単態化で、両者はGoのジェネリクス実装(GC Shape Stenciling)が解決しようとした「Generic Dilemma」の両極をなす。

利点

  • コードが型ごとに複製されないため、バイナリサイズが小さく済む。
  • コンパイル時間も単態化方式より短くなりやすい。

欠点

  • 辞書からの間接参照(関数ポインタ経由の呼び出しなど)が実行時に発生するため、単態化に比べて実行速度のオーバーヘッドがある。
  • 型固有の情報がコンパイル時に確定しないため、インライン化などの最適化が効きにくい。

ジェネリクスの実装方式の中での位置づけ

単態化と対をなす、もう一方の極として位置づけられる。

#generics #compiler-design

作成日時: 2026-08-15 21:28 / 更新日時: 2026-08-15 21:28