📜  C#中的公共语言运行时(CLR)

📅  最后修改于: 2021-05-29 19:08:44             🧑  作者: Mango

CLR是.NET Framework的基本和虚拟机组件。 .NET Framework中的运行时环境可以运行代码,并通过提供各种服务来帮助简化开发过程。基本上,它负责管理.NET程序的执行,而不管任何.NET编程语言如何。在内部,CLR实现了VES(虚拟执行系统) ,该系统在Microsoft的CLI(通用语言基础结构)的实现中定义
在“公共语言运行时”下运行的代码称为“托管代码”。换句话说,您可以说CLR通过提高安全性(包括跨语言集成和丰富的类库等)为.NET程序提供了.NET程序的托管执行环境。CLR存在于每个.NET框架版本中。下表说明了.NET框架中的CLR版本。

CLR Versions .NET Framework Versions
1.0 1.0
1.1 1.1
2.0 2.0
2.0 3.0
2.0 3.5
4 4
4 4.5(also 4.5.1 & 4.5.2)
4 4.6(also 4.6.1 & 4.6.2)
4 4.7(also 4.7.1 & 4.7.2)

下图说明了CLR如何与操作系统/硬件以及类库相关联。在这里,运行时实际上是CLR。

CLR在C#程序执行中的作用

  • 假设您已经编写了一个C#程序并将其保存在一个称为“源代码”的文件中。
  • 特定于语言的编译器将源代码连同其元数据一起编译成MSIL(Microsoft中间语言) ,也称为CIL(通用中间语言)IL(中间语言)元数据包括程序的每个函数的所有类型,实际实现。 MSIL是与机器无关的代码。
  • 现在CLR诞生了。 CLR为MSIL代码提供服务和运行时环境。内部CLR包含JIT(即时)编译器,它将MSIL代码转换为机器代码,然后由CPU进一步执行。 CLR还使用.NET Framework类库。元数据向CLR提供有关编程语言,环境,版本和类库的信息,CLR通过该信息处理MSIL代码。由于CLR很常见,因此它允许用另一种语言编写的类的实例调用用另一种语言编写的类的方法。

CLR的主要组成部分

顾名思义,“通用”表示CLR提供了通用的运行时或执行环境,因为有60多种.NET编程语言。

CLR的主要组成部分:

  • 通用语言规范(CLS)
  • 通用类型系统(CTS)
  • 垃圾收集(GC)
  • 准时编译器(JIT)

通用语言规范(CLS):
它负责将不同的.NET编程语言语法规则和规章转换为CLR可理解的格式。基本上,它提供了语言互操作性。语言互操作性意味着也可以在.NET框架中为其他编程语言提供执行支持。

语言互操作性可以通过两种方式实现:

  1. 托管代码:由CLR管理的MSIL代码称为托管代码。对于托管代码,CLR提供了三种.NET工具:
    • CAS(代码访问安全性)
    • 异常处理
    • 自动内存管理。
  2. 非托管代码:在.NET开发之前,.COM组件和Win32 API之类的编程语言不会生成MSIL代码。因此,这些不是由CLR管理,而是由操作系统管理。

通用类型系统(CTS):
每种编程语言都有其自己的数据类型系统,因此CTS负责理解.NET编程语言的所有数据类型系统,并将它们转换为CLR可理解的格式,这是一种通用格式。

每种.NET编程语言都有两种类型的CTS:

  1. 值类型:值类型会将值直接存储到内存位置。这些类型仅与堆栈机制一起使用。 CLR允许在编译时为这些存储。
  2. 引用类型:引用类型将包含value的内存地址,因为引用类型不会将变量值直接存储在内存中。这些类型与堆机制一起使用。 CLR在运行时为此分配内存。

垃圾收集器:
它用于提供自动内存管理功能。如果没有垃圾收集器,程序员将不得不编写内存管理代码,这对程序员来说是一种开销。

JIT(及时编译器):
它负责使用公共语言运行时环境将CIL(公共中间语言)转换为机器代码或本地代码。

CLR的好处:

  • 它通过在运行时在程序之间提供丰富的交互来提高性能。
  • 通过消除在支持该程序的任何操作系统上重新编译程序的需要,增强了可移植性。
  • 当分析MSIL指令是安全还是不安全时,安全性也会提高。同样,使用委托代替函数指针可以增强类型的安全性。
  • 在垃圾收集器的帮助下支持自动内存管理。
  • 提供跨语言集成,因为CLR中的CTS提供了一个通用标准,该标准可以激活不同的语言以扩展和共享彼此的库。
  • 提供对使用以其他.NET编程语言开发的组件的支持。
  • 提供语言,平台和体系结构的独立性。
  • 由于开发人员无需考虑内存管理和安全性问题,因此可以轻松创建可伸缩的多线程应用程序。