.NET 对于构建系统应用的探索历程

这篇文章介绍和梳理一下截止到 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 也正式发布。

这方面的探索仍在持续进行中,期待未来的发展,同时如有不对之处欢迎指出。