NGWS(後來的 .NET Framework)Runtime 提供受管理的執行環境,管理程式碼執行並提供多項核心服務。本章深入探討 Runtime 運作機制,包含中間語言(IL)、中繼資料、即時編譯器(JIT)與虛擬物件系統(VOS),為理解 C# 程式執行奠定基礎。
編譯器必須輸出中繼資料與受管理程式碼(Managed Code),中繼資料描述程式碼中的型別,與程式碼共同存在於擴展 PE 格式的檔案中。
C# 編譯器產生的不是原生機器碼,而是 CPU 無關的 IL 程式碼。IL 程式碼需在目標機器上由 JIT 編譯器轉換為原生碼才能執行。IL 指令集涵蓋:
中繼資料包含型別定義、成員簽章等資訊,相當於 COM 的型別庫與登錄資訊,但直接內嵌於執行檔中,不分離儲存。執行時 Runtime 從 PE 檔案定位並分離中繼資料與 IL。
型別載入時,載入器為每個方法建立存根。方法首次被呼叫時,存根將控制權交給 JIT,將 IL 編譯為原生碼並快取,後續呼叫直接執行原生碼。此機制避免編譯從未執行的程式碼(如文字處理器的郵件合併功能),提升啟動效能。
| 編譯器 | 特性 | 適用場景 |
|---|---|---|
| 標準 JIT | 預設編譯器,執行資料流分析與後端優化,產生高度優化原生碼,但需較多記憶體與編譯時間。 | 一般應用程式,追求執行效能 |
| EconoJIT | 目標為快速編譯,輸出較小但較少優化的程式碼,允許捨棄未使用的已編譯程式碼以節省記憶體。 | 記憶體受限環境、快速啟動需求 |
| PreJIT | 安裝時將整個組件 IL 編譯為原生碼,類似傳統編譯器,提供最快載入與啟動速度,無執行時 JIT 開銷。 | 生產環境部署、效能關鍵應用 |
SDK 提供 jitman.exe 圖形化工具,可設定:僅使用 EconoJIT、程式碼快取大小限制、優化目標(大小或速度)、啟用並行垃圾收集(Concurrent GC,僅 Windows 2000 支援)等選項。UI 密集型應用啟用 Concurrent GC 可減少回應延遲。
VOS 定義了型別系統的核心規範,包含值型別、參考型別、介面、繼承、多型等規則,確保跨語言的型別安全與互通性。所有 .NET 語言編譯器皆遵循 VOS 規範產生相容的 IL 與中繼資料。
NGWS Runtime 透過 IL、中繼資料、JIT 編譯與 VOS,實現了跨語言整合、自動記憶體管理、版本控制與安全性等核心優勢。理解這些基礎機制,有助於撰寫高效能、可維護的 .NET 應用程式。