C# 的 int 實際是 mscorlib.dll 中的 System.SInt32,Haskell 的 (x:xs) 定義於 prelude。先進語言的核心類型系統離不開核心庫的支撐。Vczh Library++ 3.0 的 ManagedX 語言同樣擁有 System.CoreManaged 核心庫,包含 System.SInt32、System.IEnumerable<T>、System.Reflection.Type 等基本不可或缺的類型。語義分析器完成核心庫分析,標誌著類型系統基本成型。
現代面向物件語言類型系統的基石:
object)Func/Action,Haskell 更徹底)IEnumerable)修飾工具:
dynamic,區別於編譯期綁定的 var)Java 的基本型別與類型擦除泛型被視為設計缺陷,本文不再贅述。
this、base、decl、params、replace為了讓編譯器自動進行類型推導,必須將直覺性的類型運算形式化。定義類型 T 的屬性:
this(T):類型 T 的成員函數所見的自身類型(非泛型時 this(T) == T)base(T):父類型(僅物件類型擁有,指唯一非介面父類)針對泛型類型聲明 T[U, V] 與實例化類型 T<A, B>:
decl(T<A, B>) = T[U, V](返回泛型聲明)params(T<A, B>) = {U=>A, V=>B}(提取型別映射)replace(T[U, V], {U=>A, V=>B}) = T<A, B>(型別替換)核心恆等式:replace(this(decl(T)), params(T)) == T,確保實例化類型與其聲明的一致性。
Derived<int, string>.GetEnumerator() 的回傳型別給定:
interface IEnumerable<T> { IEnumerator<T> GetEnumerator(); }
class Base<T> : IEnumerable<T> { public T Value { get; set; } }
class Derived<T, U> : Base<U> { }
目標:求 Derived<int, string> 的 GetEnumerator 回傳型別。
tm = params(Derived<int, string>) = {T=>int, U=>string}tb = base(decl(Derived<int, string>)) = Base<U>result = replace(tb, tm) = Base<string>tm = params(Base<string>) = {T=>string}result = replace(IEnumerable<T>, tm) = IEnumerable<string>replace(IEnumerator<T>, params(IEnumerable<string>)) = IEnumerator<string>整個過程本質上是不斷計算 replace(A, params(B))。在 Vczh Library++ 的語義分析器中,這六個函數(this、base、decl、params、replace、replace_by_type)以 C++ 實現,並透過指標唯一性保證類型比較的 O(1) 效率。
類型系統的運算規則看似抽象,實則是編譯器進行靜態類型檢查、泛型實例化、介面映射的核心邏輯。掌握這套形式化體系,是構建現代語言編譯器、理解類型理論的關鍵一步。函數類型推導(Lambda 表達式)留待後續探討。