当前位置: 首页 > 科技观察

说说.NET的执行模型

时间:2023-03-18 22:15:48 科技观察

前面介绍.NET的历史时提到,微软基于.NETFramework重新设计创建了跨平台的.NETCore。现在已经发展到.NET5版本。它的性能比以前的.NETFramework有了巨大的改进。.NETFramework产品线也已终止(微软将继续维护,但不会发布新版本),其最后一个版本.NETFramework4.8已成为绝唱。.NETFramework终将成为历史。我们想把思维从.NETFramework跳到.NETCore/.NET5+,首先我们需要了解它们的执行模型和底层架构发生了哪些变化。注意:为了简单起见,下面提到的.NETCore包括.NETCore和.NET5+。我们先从高处来了解一下.NETCore执行模型的全貌,然后在后面的章节中从低处一一讲解各个模块。.NETCore有两种执行模型,一种是基于CoreCLR运行时,与.NETFramework几乎相同;另一种是基于NativeAOT的本地运行时,这是.NETCore新增的一种执行模型。1基于CoreCLRCoreCLR与原来.NETFramework的CLR(CommonLanguageRuntime,公共语言运行时)几乎相同,只是CoreCLR去掉了Windows操作系统特有的部分,实现了跨平台。因此,除了CLR运行时的一些差异外,它们的执行模型是相同的。注意,我们通常习惯性地将CoreCLR简写为CLR。在.NETCore的上下文中,CLR指的是CoreCLR。基于CoreCLR的执行模型用一个简单的流程图表示如下:源代码由编译器编译生成程序集,运行时CLR针对不同的操作系统和CPU架构(如x86、x64)编译程序集或ARM)。本机代码(NativeCode),本机代码可以直接由操作系统运行。注意:在.NET中,nativecode是机器码(MachineCode),只是叫法不同而已。它是处理器可以直接理解和执行的字节码指令。所有其他代码都必须翻译或转换为机器代码才能在计算机上运行。2基于NativeAOT.NETCore基于CoreCLR,提取本地运行时的简化版本,去掉JIT编译器,保留垃圾收集器、内存管理等模块。这个原生运行时以前的代号是CoreRT,现在叫做NativeAOT。NativeAOTruntime提供了一套AOT(AheadOfTime)提前编译机制,采用新一代RyuJIT编译器,可以将.NETCore程序编译成本地代码(机器码),直接在本地运行宿主机,无需提前安装.NETCore运行时。基于NativeAOT运行时的执行模型用一个简单的流程图表示如下:源代码由编译器编译,直接生成native代码。跑步。使用本地运行时,请在VS中发布时选择Self-Contained模式,并指定目标平台和CPU架构(如win-x64、linux-x65等)。由于打包后的文件包含原生运行时,因此比基于CoreCLR的发行版大了数十兆字节。使用NativeAOT在本地运行有两个好处:一是发布时只有一个文件,已经包含了本地运行时,不需要提前安装运行时环境,可以运行直接在主机上;二是启动时本身就是一台机器,不通过JIT编译器编译,启动效率更高。3小结基于CoreCLR的.NETCore执行模型与原来的.NETFramework相同,没有发生大的变化。另外.NETCore增加了基于NativeAOT本地运行时的执行模型,利用AOT编译机制直接将.NETCore程序编译成机器码。希望大家能够根据文中的流程图,了解.NETCore的两种执行模型的全貌,牢记于心。这有助于我们了解.NET程序的工作原理,并且是面试中的高频话题。关于执行模型中的主要核心模块(编译器、汇编、运行时),后续章节将分别进行详细讲解。