CLR

CLR常用简写词语,CLR是 公共语言运行时,Common Language Runtime)和Java 虚拟机一样也是一个运行时环境,它负责资源管理( 内存分配和垃圾收集),并保证应用和底层 操作系统之间必要的分离。

1基本信息编辑

释义一

CLR(公共语言运行时,Common Language Runtime)和Java 虚拟机一样也是一个运行时环境,是一个可由多种 编程语言使用的运行环境。CLR的核心功能包括: 内存管理程序集加载、安全性、 异常处理线程同步,可由面向CLR的所有语言使用。并保证应用和底层 操作系统之间必要的分离。CLR是.NET Framework的主要执行引擎。 [1]
为了提高平台的可靠性,以及为了达到面向事务的 电子商务应用所要求的稳定性级别,CLR还要负责其他一些任务,比如监视程序的运行。按照 .NET的说法,在CLR监视之下运行的程序属于“托管的”(managed)代码,而不在CLR之下、直接在 裸机上运行的应用或者组件属于“ 非托管的”(unmanaged)的代码。
CLR将监视形形色色的常见编程错误,许多年来这些错误一直是 软件故障的主要根源,其中包括:访问 数组元素越界,访问未分配的内存空间,由于数据体积过大而导致的 内存溢出,等等。
然而,这种对受管理代码的运行监视是有代价的。虽然当前还不可能精确地得到监视程序运行所需要的开销,但从当前Beta测试版的性能表现来看,正如Microsoft所承认的那样,我们可以预料由它导致的性能降低程度至少达到10%。当然,如果监视程序运行能够将稳定性和可用性提高到一个新的档次,那么,我们是否仍会怀疑这10%的性能降低是一件坏事?
在处理器性能改善方面, 摩尔定律已经一再被证明是正确的。既然如此,我们要得到一台性能增加了10%的服务器要等待多长时间呢。

释义二

CLR(公用语言运行时,Common Language Runtime)
NET提供了一个运行时环境,叫做公用语言运行时(Common Language Runtime),是一种多语言执行环境,支持众多的 数据类型和语言特性。他管理着代码的执行,并使开发过程变得更加简单。这是一种可操控的执行环境,其功能通过 编译器与其他工具共同展现。
依靠一种以运行时为目标的 编译器开发的代码叫做可操控代码。
元数据:为了使运行时环境可以向可操控代码提供服务,语言 编译器需要产生一种元数据,它将提供在使用语言中的类型、成员、引用的信息。运行时环境使用元数据定位并载入类,在内存中展开对象实例,解决方法调用,产生 本地代码,强制执行安全性,并建立运行时环境的边界。
可操控执行的含义:对象在执行的过程中完全被运行时环境所控制。运行时环境提供以下服务:自动 内存管理、调试支持、增强的安全性及与非可操控性代码的 互操作性。条件:1、选择以运行时为目标的语言 编译器,如VB、C#;2、在组件的输出类型中使用CLR要求的语言特性。

2集成能力编辑

跨语言集成的能力:CLR包含了一个丰富的语言特性集,保证了它与各种 程序设计语言的兼容性。这一特性集即公用语言规范,稍后将对其进行详细说明。

3内存管理编辑

内存管理的自动化:在执行过程中管理 应用程序的资源是一项单调而困难的工作。它会将你的注意力从你本应解决的问题中引开。而垃圾收集机制完全解决了程序员在编程过程中头痛的问题,跟踪内存的使用,并知道何时将它们释放。
面向对象的环境中,每种类型都标识了对你的 应用程序有用的某种资源。为了使用这些资源,你需要为类型分配内存。在应用中,访问一种资源要通过以下步骤:
(1)为类型分配内存。
(2)初始化内存,设置资源的初始状态并使其可用。
(3)通过访问该类型的实例成员来访问资源。
(4)卸下将被清除的资源状态。
(5)释放内存。
这一看似简单的过程在实际的编程中是产生错误的主要来源之一。更可怕的是:内存中的错误往往导致不可预见的结果。如果你有过编程的经验,想想看,有多少次你的程序因为内存访问错误而崩溃?特别是计算机存在多根内存条时特别容易内存报错 死机。建议升级电脑时换掉原来的内存,不要采用加内存的方式。
CLR要求所有的资源从可操控的堆(注:在此指一种内存结构)中分配。当一个进程被初始化后,CLR保留了一个未被分配的 地址空间。这一区域叫做可操控堆。在堆中保持了指向下一个将被分配给对象的堆地址的 指针(NEXT)。
初始状态下,该 指针是保留 地址空间的基地址。一个应用使用新的操作产生对象。此操作首先检查新对象需要字节的大小是否会超出保留空间。如果对象大小合适,指向下一个地址的 指针将指向堆中的这个对象,该对象的 构造器被调用,新的操作返回对象的地址。
当一个应用请求建立一个对象时, 地址空间可能不够大。堆将发现这一点(通过将新对象的大小与NEXT 指针相加,并与堆的大小进行比较),这时垃圾收集器就将被调用。在这里,CLR引入了“代”的概念。代,指堆中对象产生的先后。这样,垃圾收集器在将发生溢出时回收属于特定的“代”的对象,而不是回收堆中的所有对象。
(6)即时编译
在各种语言的 编译器源代码进行编译之后,在CLR环境中产生的是 中间代码(出于兼容性与跨语言集成的考虑),其内容虽然有效,但在转化为 本地代码之前它本身是不可执行的。这就是 JIT编译器需要完成的工作。
这里需要说明一个问题:为什么要即时编译,而不是一次性的将 中间代码文件进行编译?答案很简单:原因在于效率。在大型的应用中,你很少会用到程序的全部功能,这种边执行边编译的措施比一次性的完全编译效率更高。
CLR带有三个不同的JIT编译器,在Windows平台中,CLR带有三个不同的JIT 编译器
(1)缺省的 编译器---主编译器,由它进行数据流分析并输出经过优化的 本地代码,所有的 中间代码指令均可被它处理。
(2)PREJIT,它建立在主JIT 编译器之上。其运行方式更象一个传统的 编译器:每当一个.NET组件被安装时它就运行。
(3)ECONOJIT,在并不充分优化的前提下,它能够快速完成IL代码到本地码的转换,编译速度与运行速度都非常快。
为了配合 编译器的工作,在.NET SDK的安装路径下的/bin目录中有一个负责管理JIT的 应用程序:jitman.exe。具体的使用参见 联机帮助

4版本发布编辑

在当前以组件为基础的系统中,开发人员和用户对于 软件版本和发布中存在的问题已经十分熟悉了。当我们安装一个新的应用之后,我们很可能发现原本正常的某个 应用程序奇怪的停止了工作。绝大多数开发人员将时间花在了确保所有注册表入口的一致性,以便激活COM类上。这就是所谓的“DLL地狱”。
.NET平台通过使用集合来解决这一问题。在这里,“集合”是一个专有名词,指类型与资源的发布单元,在很大程度上它等同于今天的DLL。正象.NET用元数据描述类型一样,它也用元数据描述包含类型的集合。
通常说来,集合由四个部分组成:集合的元数据(集合的内部清单)、元数据描述的类型、实现类型的 中间语言代码和一组资源。在一个集合中,以上四个部分并不是都必须存在,但是,集合中必须包含类型或资源,这样集合才有意义。
在.NET中一个基本的设计方针是使用孤立的组件。一个孤立的集合的含义是指一个集合只能被一个应用所访问。在一台机器上,它不被多个应用共享,也不会受其它 应用程序对系统的更改的影响。“孤立”赋予了开发人员在自己的程序中对代码的完全控制权。
任何共享代码都需要被明确地标识。同时,.NET 框架也支持共享集合的概念。一个共享集合指在一台机器上被多个应用共享的集合。共享集合需要严格地命名规定。
有了.NET, 应用程序间的共享代码是明确定义的。共享集合需要一些额外的规则来避免我们今天遇到的共享冲突问题。共享代码必须有一个全局唯一的名称,系统必须提供名称保护,并在每当引用共享集合时,CLR将对版本信息进行检查。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐