Open2
[勉強メモ]swiftc
わいわいswiftcのアーカイブを地道に見ていくスレ
わいわいswiftc #1
わいわい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
は、これらの制約をもとに未知の型を推論し、最終的な型を決定する。
-