底层.NET——CLR的环境

CLR2部分组成,即可执行文件和CLR的虚拟引擎(VEE)。

CLRVEE负责将中间语言转换成机器码,并负责执行,同时提供所需要的各种支持服务。类装载器(Class Loader)负责将.NET类装载进内存并为它的执行做准备。在.NET程序执行的任何时刻,如果想调入一个新类,都需要类加载器来完成。类型检测器主要是在程序运行时刻来验证代码是否类型安全,提供运行时安全检查,是.NET平台在可靠性方面的较大该进。JIT编译器将对每个已经通过类型安全验证的方法进行编译,将其转换为托管本地代码。JIT只在方法的第一次调用的时候进行,已编译的本地代码会在内存中保存,但在下一次开机,执行进程或组件时,JIT会再次工作。JIT在编译时生成管理器定位和托管数据,代码管理器用此数据控制代码的执行,包括代码的异常处理、安全检查、调用支持、互操作支持、无用资源回收等。如下图所示:

 

.NET架构的思想基础依然是虚拟机原理。但.NET架构最重要的事实之一是它没有像JAVA那样的通用虚拟机技术,运行在CLR上的软件不是解释执行的,而是被完全编译的,并且像C++程序编译代码一样运行在机器一级。尽管.NET使用了中间语言,但.NET使用的是多阶段编译技术,最初编译为可移植的公用中间语言,最好在执行程序时JIT编译到最终的可执行格式。.NET编译架构总图如下:

 

上图应该是一个程序员心中的.NET编译器框架图,虽然复杂但它体现很多优点:

1、           所有语言有一个共同的中间层,它们在该层上完全共享中间格式。当用某一种语言编写的某一段代码被编译成IL时,就把它与它的全部描述一起打包,把类、接口、属性、方法做为元数据格式存放。这就是.NET支持的语言能够完全集成,任何语言编写的模块混合能够创建单个应用程序的原因。

2、           放弃了解释执行的方法。CLR在执行一个已经被转化成IL的程序时,它使用的是JITIL编译为本地代码。JIT是非常快速有效的,它甚至可以做到不编译中间代码未使用的部分,以介绍编译是时间。为了能节省编译的时间,CLRhaunted提供了预编译器(PRE JIT),当程序不需要移植时,PRE JITIL编译为永久本地代码。此外CLR还提供了一个ECONOJIT,它是一个压缩移动编译器,速度非常快,它编译高度优化的代码OPTILOPTILIL的一个高度优化的子集,专门为一些没有大量内存或大量计算能力的系统使用)

3、           ,应用在PDA、手持设备、电话等小型设备上。

我们知道,CLR的环境的根本任务是管理和执行.NET代码,程序代码的执行过程,是每个程序员最关心的问题,同时对他们从本质上理解CLR环境也有很大的帮助。.NET程序执行过程可以简述为:首先由类装载器找到并装入对象,将其激活;检测器中验证程序对其进行类型验证;JIT将编译并转换为本地代码;同时可以动态对目标机器进行代码优化;执行代码,同时提供所需的其他服务(如安全检查、异常处理、垃圾回收等)。如下图:

你可能感兴趣的:(.net)