Open2

[勉強メモ]swiftc

みはるんみはるん

わいわいswiftc #1

多相な関数(同じ関数でも、異なる文脈では異なる型)と型推論はある意味セットで提供されている機能。型推論を使って、ポリモーフィズムを実現する。

ジェネリックな関数の型推論

func id<A>(_ a: A) -> A {
    return a
}
  • 見た目の型: <A> A -> A
  • 内部的な型の表現: <τ_0_0> τ_0_0 -> τ_0_0
    • (※ τ_0_0 = タウ・ゼロ・ゼロ)
    • コンパイラがコードを解析・最適化する過程で使用され、通常のプログラミング中には直接目にすることは少ないが、エラーメッセージやデバッグ情報で見かけることがある。

τ_0_0 の詳細な意味

  • τ(タウ): 型を表すギリシャ文字で、コンパイラ内部での型変数を示す。
  • 0_0: この部分は、ジェネリック型パラメータの「深さ」と「インデックス」を示す。最初の 0 は深さ(スコープのネストレベル)を、次の 0 はそのスコープ内での位置(何番目のパラメータか)を表す。

例えば、τ_0_0 は「最上位スコープの最初のジェネリック型パラメータ」を意味する。これは、例えば func example<T>(...) の T に対応する。同様に、τ_0_1 は「最上位スコープの2番目のジェネリック型パラメータ」を指し、func example<T, U>(...) の U に相当する。

型推論の実装寄りの話

  • 型推論関連の主要なクラス
    • TypeChecker 型検査担当
      • コード内の各式や文の型を検証し、型の整合性を確認する。具体的には、変数や関数の型が正しく使用されているか、型エラーがないかをチェックする。
    • ConstraintSystem 型推論担当
      • 型推論のプロセスを管理する。コード内の式や文に対して「型の制約」を設定し、これらの制約を解決することで、未知の型を推論する。
  • TypeChecker が関数ごとに ConstraintSystem` をインスタンス化して使う。
    • TypeChecker は、各関数や式に対して ConstraintSystem を生成し、型の制約を設定する。例えば、ある関数の引数が整数であるべき場合、その制約を ConstraintSystem に追加する。ConstraintSystem は、これらの制約をもとに未知の型を推論し、最終的な型を決定する。