這篇文章介紹和梳理一下截止到 2022 年的 .NET 向系統編程探索的歷程。
2003 年的 Singularity 項目試圖讓 Windows 的內核態與用戶態應用完全建立在 .NET 托管世界上,并試驗了一個支持編譯到本機代碼的類似 C# 的語言,并發布了很多相關的論文。后來 Singularity 項目被放棄,因為當時的 CLR 和 C# 的類型系統被認為難以處理系統編程。
2008 年的 Midori 項目試圖讓 Windows 的用戶態應用全部建立在 .NET 上,并且出了很多讓 CLR 和 C# 類型系統向適合系統編程的方向改進的提案,例如 ref 相關和各種零分配抽象設施等等,同時誕生了 RedHawk 項目,也就是 .NET Native 的前身,一個以 UTC 為后端(MSVC 的代碼生成后端)的支持將 C# 代碼編譯到本機代碼的編譯器。
2015 年 Project N 項目將 RedHawk 編譯器帶到了 .NET Core 1.0 中,并且改名為 .NET Native,同時支持了 UWP。以及誕生了 LLILC 項目,實驗將 LLVM 作為后端的 JIT。另外,.NET 發布了下一代高吞吐量 JIT:RyuJIT,用于取代先前 UTC 后端的 JIT64,顯著改善了代碼生成效率和質量,并給 .NET Core 啟用。.NET Native 更名為 CoreRT 后開源,將 UTC 后端更換為 RyuJIT 后端。
2017 年開始在 CoreCLR、C# 和 .NET BCL 中加入 Midori 項目中探索出來的特性之一 ref struct 和 Span 系列。同年 LLILC 項目基本宣告失敗,主要因為 LLVM 導致的 JIT 吞吐量低下和 CoreCLR 與 LLVM 類型系統相關問題難以解決,該方案被放棄。另外,RyuJIT 正式上位成為 .NET Framework 和 .NET Core 的默認 JIT。
2019 年 CoreRT 更名為 NativeAOT 再次成為實驗性項目繼續發展,并分叉出 NativeAOT-LLVM 分支實驗將 LLVM 作為后端支持生成 WebAssembly 的將 .NET 程序集編譯到本機代碼的編譯器。同年 CoreRT 的一部分成果被拿去做 crossgen2,這是一個支持交叉編譯的生成本機代碼的編譯器,用來作為混合 AOT 方案。
2021 年 crossgen2 作為下一代 ReadyToRun 特性正式推出,同時也使得 .NET RyuJIT 支持了交叉編譯來生成各平臺和架構的代碼。
2022 年 Midori 項目提案的另一波語言特性繼續加入 CoreCLR 和 C#,諸如 ref fields、生命周期以及 ref struct 配套的泛型和反射支持等等,同時 NativeAOT 也正式發布。
這方面的探索仍在持續進行中,期待未來的發展,同時如有不對之處歡迎指出。