种豆资源网

当前位置:首页 > 百科 > 百科综合 / 正文

公共语言运行时

(2019-04-07 12:54:00) 百科综合
公共语言运行时

公共语言运行时

CLR叫做公共语言运行时(Common Language Runtime),它是所有.NET应用程式运行时环境,是所有.NET应用程式都使用的编程基础,它如同一个支持.NET Framework,运行一个.NET程式也必须安装。公共语言运行时遵循公共语言架构的标準,能够使C++、C# 、Visual Basic、以及JScript等多种语言深度集成。

基本介绍

  • 中文名:公共语言运行时
  • 外文名:Common Language Runtime
  • 简称:CLR
  • 两个组件:公共类型系统、公共类型系统
  • 特点:能使多种语言深度集成
  • 理解:相当于Java中的Java虚拟机

定义

公共语言运行时(Common Language Runtime,CLR)是Microsoft的公共语中言基础结构(CLI)的一个商业实现,CLI是一种国际标準,用于创建语言和库在其中无缝协同工作的执行和开发环境基础。.NET Framework 提供了一个称为公共语言运行时的运行环境,它运行代码并提供使开发过程更轻鬆的服务。有了公共语言运行时,就可以很容易的设计出对象能够跨语言互动的组件和应用程式。也就是说,用不同语言编写的对象可以互相通信,并且它们的行为可以紧密集成。
公共语言运行时遵循公共语言架构的标準,能够使C++、C#、Visual Basic、以及JScript等多种语言深度集成。CLR从某种意义上理解相当于Java中的Java虚拟机(JVM),而MSIL相当于Java中的位元组码(.class档案)。MSIL总是及时编译(称为JIT编译)为相应平台的机器代码,这一点与Java也很相似。

託管执行过程

公共语言运行时的功能通过编译器和工具开发,开发者可以编写利用此託管执行环境的代码。使用基于公共语言运行时的语言编译器开发的代码称为託管代码,反之则被称为非託管代码。託管代码有很多优点,例如跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件互动模型、调试和分析服务等。
执行託管代码的过程包括以下4个步骤:

选择编译器

为获得公共语言运行时提供的优点,必须使用一个或多个针对运行时的语言编译器。例如 Visual Basic、C# 、Visual C++、F#或其它的第三方编译器(如 Eiffel、Perl或 COBOL编译器)中的一个。

将代码编译为 Micrisoft 中间语言

编译将原始码翻译为Micrisoft 中间语言(MSIL)并生成所需的元数据。MSIL是一组可以有效地转换为本机代码且独立于CPU的指令。它包括用于载入、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接记忆体存取、异常处理和其他操作的指令。元数据描述代码中的类型,包括每种类型的定义、每种类型的成员的签名、代码引用的成员和运行时在执行时使用的其他数据。

将SMIL翻译为本机语言

在执行时,实时(JIT)编译器将MSIL翻译为本机代码。在此编译过程中,代码必须通过验证过程,该过程检查MSIL和元数据以查看是否可以将代码确定为类型安全。

运行代码

公共语言运行时提供使託管代码能够发生及可在执行期间使用的各种服务的基础结构。

自动记忆体管理

自动记忆体管理是公共语言运行时在託管执行过程中所能提供的服务之一。公共语言运行时的垃圾回收器为应用程式管理记忆体的分配和释放。对开发者而言,这意味着开发託管应用程式时不必编写执行记忆体管理任务的代码。自动记忆体管理可解决常见问题,例如忘记释放对象并导致记忆体泄露,或尝试访问已释放对象的记忆体。

分配记忆体

初始化进程时,CLR为进程保留一个连续的地址空间区域。这个保留的地址空间被称为託管堆。託管堆上部署了所有引用类型,应用程式创建第一个引用类型时,将为託管堆的基址中的类型分配记忆体。从记忆体堆中分配记忆体要比非託管记忆体分配速度快。由于CLR通过为指针添加值来为对象分配记忆体,所以这几乎和堆叠中分配记忆体一样快。另外,由于连续分配的新对象在託管堆中是连续存储,所以应用程式可以快速访问这些对象。

释放记忆体

垃圾回收器的最佳化引擎根据所执行的分配决定执行回收的最佳时间。垃圾回收器在执行回收时会释放应用程式不再使用的对象的记忆体。它通过检查应用程式的根本来确定不再使用的对象。每个应用程式都有一组根,每个根或者引用託管堆中的对象,或者设定为空。

级别和性能

运行时的垃圾回收算法基于以下几个普遍原理。首先,压缩託管堆的一部分记忆体要比压缩整个託管堆速度快。其次,较新的对象生存期较短,而较旧的对象生存期则较长。最后,较新的对象趋于相互管理,并且大致同时由应用程式访问。
为最佳化垃圾回收机制的性能,将託管堆分为3代:第0代、第1代和第2代。运行时的垃圾回收器将新对象存储在第0级中。在应用程式生存期的早期创建的对象如果未被回收,则被升级并存储在第1级和第2级中。

为非託管资源释放记忆体

对于应用程式创建的大多数对象,可以依赖垃圾回收器自动执行必要的记忆体管理任务。但是,非託管资源需要显式清除。最常用的非託管资源类型是包装作业系统资源的对象,例如,档案句柄、视窗句柄或网路连线。
垃圾回收器可以跟蹤封装非託管资源的託管对象的生存期,但是无法具体了解如何清理资源。创建封装非託管资源的对象时,可以在公共Dispose()方法中提供必要的代码以清理非託管资源。通过提供Dispose()方法,对象的用户在使用完对象后显式释放其记忆体。

CLR的组件

CLR叫做公共语言运行时(Common Language Runtime)。它是所有.NET应用程式运行时环境,是所有.NET应用程式都使用的编程基础,它如同一个支持.NET Framework,运行一个.NET程式也必须安装。CLR也可以看作一个在执行时管理代码的代理,管理代码是CLR的基本原则,能够被管理的代码成为託管代码,反之称为非託管代码。CLR包含两个组成部分,CLS(公共语言规範)和CTS(通用类型系统)。下面我们通过理解.NET的编程技术来具体了解这两个组件的功能。

公共类型系统

公共类型系统(Common Type System,CTS)。CLR通过公共类型系统和公共语言规範定义了标準数据类型和语言间互操作性的规则。
C#和VB.NET都是公共语言运行时的託管代码,它们的语法和数据类型各不相同。CLR是如何对这两种不同的语言进行託管的呢?通用类型系统(Common Type System)用于解决不同语言的数据类型不同的问题,如C#中的整型是int,而VB.NET中是Integer,通过CTS我们把它们两个编译成通用的类型Int32。所有的.NET语言共享这一类型系统,在它们之间实现无缝互操作。
公共类型系统支持.NET Framwork提供的常用两种类型:值类型和引用类型。其中每一类又可以细分成子类型。公共类型系统所执行的功能如下:
(1)建立一个支持跨语言的集成、类型安全和高性能代码执行的框架;
(2)提供一个支持完整实现多种程式语言的面向对象的模型;
(3)定义各语言必须遵守的规则,有助于确保用不同语言编写的对象能够互动作用。

公共语言规範

公共语言规範(Common Language Specification,CLS)。公共语言规範是一组结构和限制条件,它是公共类型系统的子集,它们一起定义了允许不同程式语言的标準集,由这些程式语言编写的应用程式可以互操作。
程式语言的区别不仅仅在于类型,语法或者说语言规範也都有很大的区别。因此.NET通过定义公共语言规範(Common Language Specification),限制了由这些不同点引发的互操作性问题。CLS是一种最低的语言的标準,制定了一种以.NET平台为目标的语言所必须支持的最小特徵,以及该语言与其他.NET语言之间实现互操作性所需要的完备特徵。凡是遵守这个标準的语言在.NET框架下都可以实现互相调用。例如,在C#中命名是区分大小写的,而VB.NET不区分大小写,这样CLS就规定,编译后的中间代码必须除了大小写之外有其他的不同之处。
为了实现跨语言开发和跨平台的战略目标,.NET所有编写的套用都不是编译为本地代码,而是编译成微软中间代码MSIL(Microsoft Intermediate Language)。它将由JIT(Just In Time)编译器转换成机器代码。C#和VB.NET代码通过它们各自的编译器编译成MSIL,MSIL遵守通用的语法,CPU不需要了解它,再通过JIT编译器编译成相应的平台专用代码,这里所说的平台是指我们的作业系统。这种编译方式实现了代码託管,还能够提高程式的运行效率。

优点

使用公共语言运行时有许多优点,部分优点如下:
(1)它使程式的性能得到了改进;
(2)能够轻鬆的使用其他语言开发的组件;
(3)支持语言功能,例如面向对象编程的继承、接口和重载;
(4)允许创建多执行绪的可放缩应用程式的显示自由执行绪处理支持;
(5)结构化异常处理支持;
(6)自定义特性支持;
(7)垃圾回收机制;
(8)使用委託取代函式指针,从而增强了类型安全和安全性。

标 签

搜索
随机推荐

Powered By 种豆资源网||