您的位置:首页 > 编程语言 > C#

CLR via C#:CLR的执行模型

2012-08-29 22:31 218 查看
1、CLR:公共语言运行时,是一个可以由多种编程语言使用的“运行时”

CLR的核心功能(如内存管理、程序集加载、安全性、异常处理和线程同步等)可由面向CLR的所有语言使用。

在这个基础上,不同语言的编译器可以看成语法检查器和“正确代码”的分析器。

无论选择哪一种编译器,结果都是一个托管模块(一个标准的可移植执行体文件,32位的或者64位的,即PE文件,如exe,dll,com,sys等)

2、托管模块的组成

PE头:32位就可以32位和64位系统上运行,64位就只能在64位系统上运行,还标识了文件类型(包括GUI、CUI、或者DLL)等

CLR头:包含了使这个模块成为一个托管模块的信息

元数据:包含引用表、定义表、清单表等

IL代码:编译器编译源代码时生成的代码。运行时,CLR将IL编译成本地CPU代码(面向特定CPU的代码)

3、程序集:一个或者多个模块/资源文件的逻辑性分组,是重用、安全性以及版本控制的最小单元。

程序集也是一个PE文件,程序集既可以是一个可执行应用程序,也可以是一个DLL(其中含有一组由可执行程序使用的类型)

每个程序集都都包含一个名为“清单”的数据块,清单是由元数据表构成的另一种集合

程序集和托管模块的关系可以理解成分子和原子的关系:分子由一个或者多个原子组成,分子是构成细胞的最小单位;

默认情况下,编译器实际上会把生成的托管模块转换成程序集

4、其他

IL是与CPU无关的

高级语言只是公开了CLR所有功能的一个子集,然而,IL汇编语言允许开发人员访问CLR的所有功能

执行一个方法时,首先必须把它的IL转成本地的CPU指令。这是CLR的JIT编译器的职责。

CLR的JIT编译器会对本地代码进行优化,这类似于非托管C++编译器后端所做的工作。JIT对执行环境的认识比非托管编译器更加深刻,可以生成充分利用本地CPU支持的任何特殊指令,这有利于于提高本地代码的性能。想反,非托管应用程序通常是针对具有最小功能集合的CPU编译的,不会使用到一些能提高应用程序性能的特殊指令。

将IL编译成本地CPU指令时,CLR会执行一个名为 验证 的过程,确定代码所做的一切都是安全的。

5、CTS:通用类型系统,用于不同语言之间的沟通,不同的语言编译成IL语言之后都有共同的一套类型系统,所以可以相互沟通。
CTS规范规定:一个类型可以包含零个或者多个成员,成员如下:

字段:一个数据变量,对象状态的一部分。根据名称和类型来区分

方法:一个函数,能针对对象执行一个操作,通常会改变对象的状态

属性:对于调用者,看起来像个字段;对于类型的实现者,看起来更像一个方法

事件:在对象以及其他相关对象之间实现了一个通知机制。

CTS还为类型的可访问性(private、protected(family)、public、assembly(internal)等)、类型继承、虚方法、对象生存期等定义了相应的规则。
使用的语言不同,用于定义类型的语法也不同,但是,无论使用哪一种语言,类型的行为都是完全一致的,因为最最终都是由CLR和CTS来定义类型的行为的。

6、CLS:公共语言规范,定义了一个最小功能集。任何编译器生成的类型要想兼容由其他“符合CLS、面向CLR的语言”所生成的组件,就必须支持这个最小功能集。CLS的规则:在CLR中,一个类型的每个成员要么是一个字段(数据),要么是一个方法(行为)。编译器在源代码遇到什么属性、索引、委托、事件、构造器、操作符重载、数组等(这些都是为了方便编程,由语言自己提供的额外的抽象),最终在IL层面都必须转换为字段和方法。



7、CTS和CLS:

如果开发人员使用IL汇编语言写程序,那么就可以使用CTS提供的全部功能

大多数语言(如C#、VB等)都只是提供了CTS的一个功能子集

CLS定义了一个所有面向CLR语言都必须支持的一个最小功能集

用一种语言定义一个类型时,如果希望在另一种语言中使用该类型,就不要再该类型的public和protected成员中使用位于CLS外部的任何功能,因为其他语言可能不支持这个功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: