.NET学习笔记 -- 那堆名词究竟是啥(CLR、CLI、CTS、CLS、IL、JIT)

什么是CLR?html

CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”。他的核心功能包括(内存管理、程序集加载、安全性、异常处理和线程同步),能够被面向CLR的全部语言使用。这里的“运行时”,就是一个运行时环境,就像JAVA虚拟机同样。哦,错了,确切的说是JRE(Java  Runtime Enviromental)。JVM确切的说不是一个实体的java虚拟机,而是一个规范,就像CLI同样。会有不一样的实现,如:JRockit仍是Hotspot(前者是Oracle的JVM商业实现,后者是Sun的开源实现——固然如今也是Oracle的)java

什么是CLI?编程

公共语言基础结构(Common Language Infrastructure),定义了构成.NET Framework基础结构的可执行代码,以及代码运行时的环境规范。它定义了一个与语言无关的跨体系结构的运行环境,这使得开发者能够用规范内定义的各类高级语言来开发软件,而且无须修正便可将软件运行在不一样的计算机体系结构上。CLI是一个开放型的技术规范,由微软、惠普和英特尔于2000年向ECMA倡议的。说白了,CLI就是一套规范,CLR是对CLI的一种实现。那么CLI这份规范中具体定义了哪些内容呢?不妨去ECMA的网站下一份看看,也能够在这里下载:数组

image

如上面截图所示:包含了6部分,:安全

Partition I: Concepts and Architecture –描述.NET CLI的所有体系结构,提供公共类型系统(CTS,Common Type System)、虚拟执行系统(VES,Virtual Execution System)和公共语言规范(CLS,Common Language Specification)的标准化描述,还提供对元数据(Metadata)的信息性描述。编程语言

通用类型系统(CTS):规范.NET中数据的类型。函数

元数据系统(Metadata):是.NET中描述数据的数据。网站

通用语言规范(CLS):描述多语言之间进行交互的语言规范,.NET系统包括的语言有C#、C++、VB、J#,它们都遵照通用语言规范。spa

虚拟执行系统(VES):是一个可运行受管理代码(Managed Code)的运行环境,它提供了运行受管理代码所须要的内置数据类型(data type),以及假定的机器型态与状态设置、流程控制与例外处理等参数。.net

Partition II: Metadata Definition and Semantics - 提供元数据的标准化描述,包括元数据在.NET扩展PE文件格式中的位置(以.NET扩展PE文件格式的形式表示),元数据的逻辑内容(以表格及其关联的集合的形式表示,实际上使用了形式化方法表示)和元数据的语义(以汇编成为虚拟机代码的汇编器ilasm理解的形式表示)。

Partition III: CIL Instruction Set描述CIL的指令集(注意,是CIL,不是CLI哦)

Partition IV: Profiles and Libraries- 提供CLI库的简要介绍,以及将其分解为Profile和库的规范。这里有一个配套的文件CLILibraryTypes.xml,考虑过随这一部分一块儿发布,不过该文件是XML格式的,该文件提供了CLI库中每个类、值类型和接口的细节说明。“Profile”一词在这里的含义是库的集合,一块儿组合起来构成提供必定功能级别的一致性总体,换而言之,不一样的Profile对应不一样的库集合,提供的功能级别也不一样。

Partition V: Debug Interchange Format- 描述了CLI 产品的调试交互的标志方式;

Partition VI: Annexes- 提供了一些用ILAsm(CIL Assembly Language)写的例程等

什么是CTS?

CLR是彻底围绕类型展开的,经过类型,经过一种编程语言写的代码能够与另外一种语言写的代码沟通。因此Microsoft制定了一个正式的规范,“通用类型系统”(Common Type System,CTS),它描述了类型的定义和行为。上面已经提到,Microsoft已经将CTS和,NET Framework的其余组件 -- 包括(文件格式、元数字、中间语言及对底层平台的)提交给ECMA完成标准化工做,最终造成的标准称为“公共语言基础结构”(Common Language Infrastructure)。

CTS里定义了如下内容:

什么是CLS?

CLR中集成了多种语言,一种语言中能够调用另外一种语言建立的对象。为了实现这一目的,微软定义了一个公共语言规范(Common Language Specification)。它详细定义了一个最小的功能集。任何编译器若是想生成类型兼容于其余“符合CLS,面向CLR语言”生成的组件,那么必需要支持这个最小功能集。下面用一张图来讲明彼此间的关系:

image

什么是IL?

image(截自《CLR.via.C#》)

先从上图看一下.net的编译过程,源代码文件通过编译器编译后生成托管模块(managed module)。托管模块说白了就是一个32位(PE32)或64位(PE32+)的PE文件。

具体的结构以下:

PE32或PE32+文件头
CLR头
元数据
IL代码

这里咱们着重谈谈IL,IL是与CPU无关的机器语言,比大多数的CPU机器语言都要高级。能访问操做对象类型、建立及初始化对象、调用对象上的虚方法,直接操做数组元素,甚至能抛出和捕捉异常处理,能够说是一种面向对象的机器语言。

什么是JIT?它是如何工做的?

CLR执行托管模块,必需要将IL代码编译成本地CPU指令。这个事情由JIT(just in time)来执行。下面将以一个简单的例子来详细阐述JIT是如何工做的:

static void Main()
{
    Console.WriteLine("Hello");
    Console.WriteLine("Goodbye");
}

一、CLR在执行Main函数检查引用的全部类型,这里Main用到了Console类,CRL会为此分配一个内部结构。在这个结构中,Console类的全部方法都有对应的入口。

二、Mian首次调用WriteLine函数时,JITCCompiler函数会被调用。JITCCompiler知道是Console类定义了WriteLine函数,并在定义了Console类的程序集中查找WriteLine的IL代码。

三、动态分配一块内存;

四、对找到的IL代码进行验证,而后编译成本地CPU指令,将该指令放到前面动态分配的内存中;

五、修改内部结构中WriteLine函数的入口,使其指向动态分配的内存的地址;

六、JITCCompiler函数跳转到存有本地CPU指令;

七、执行完后,调回Main函数,继续执行后面的代码;

这里须要说明的是,第二次执行WriteLine函数的时候,并无JIT啥事情了,由于会直接调用内存块中的本地CPU指令。

image

 

参考:《分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发

             《CLR.via.C#》

相关文章
相关标签/搜索