本文由中国C#技术学习中心整理 如果你对本文有不明之处请到技术论坛讨论!
通用语言规范( CLS )——CLS定义了VOS中类型的子集,也定义了常规的用法.如果一个类库遵守CLS的规则,它确保类库可以在其它所有能实现CLS的编程语言上使用. 虚拟执行系统( VES )——这是VOS实时的实现.VES负责装入和执行为NGWS运得时编写的程序.
这四个部分一起组成了NGWS runtime架构.每一部分在下面小节中描述.
2.2.1 VOS类型系统
VOS类型系统提供丰富的类型系统,它打算支持多种编程语言的完全实施.所以,VOS必须都支持面向对象的语言和过程编程语言.
现在,存在着很多种近似但有点不兼容的类型.就拿整型当例子,在VB中,它是16位长,而在C++中,它是32位.还有更多的例子,特别是用在日期和时间以及数据库方面的数据类型.这种不兼容使应用程序的创建和维护不必要地复杂化,尤其当程序使用了多种编程语言时.
另一个<A href=http://cs.mimi163.net/cs/question.php>问题</A>是,因为编程语言之间存在着一些差别,你不能在一种语言中重用另一种语言创建的类型.( COM用二进制标准接口部分地解决了这个<A href=http://cs.mimi163.net/cs/question.php>问题</A> ). 当今代码重用肯定是有限的.
发布应用程序的最大障碍是各种编程语言的对象模型不统一.几乎每一方面都存在着差异:事件、属性、永久保存( persistence )等等.
VOS这里将改变 这种现象 .VOS定义了描述值的类型,并规定了类型的所有值所必须支持的一条合约.由于前面提到的支持面向对象和过程编程语言,就存在着两种值和对象.
对于值,类型存储于表述( representation )中,同样操作也在其中实行.对象更强大因为它显式地存于表述中.每一个对象都有一个区别于其它对象的识别号.支持不同的VOS类型在第四章 "C#类型"中提出.
2.2.2元数据
尽管元数据用于描述和引用由VOS类型系统定义的类型,但它还不能锁定到这个单个目标.当你写一个程序时,通过利用类型声明,你所声明的类型( 假定它们是数值类型或引用类型 )被介绍给NGWS runtime类型系统.类型声明在存于PE可执行文件内部的元数据中得到描述.
基本上,元数据用于各项任务:用于表示NGWS runtime用途的信息,如定位和装载类、 内存中这些类的事例、解决调用 、翻译IL为原始码、加强安全并设置运行时上下文边界.
你不必关心元数据的生成.元数据是由C#的"代码转IL编译器"( code-to-IL compiler,不是JIT编译器 )生成的.代码转IL编译器发送二进制元数据信息给PE文件,是以标准的方式发送的,不象C++编译器那样,为出口函数创建它们自己的修饰名字.
你从元数据和可执行代码并存所获得的主要优势为,有关类型的信息同类型自身固定在一起,不会遍布很多地方.同样有助于解决存在于COM中的版本<A href=http://cs.mimi163.net/cs/question.php>问题</A>.进一步地,你可以在相同的上下文中使用不同的版本库,因为库不仅被注册表引用,也被包含在可执行代码中的元数据引用.
2.2.3通用语言规范
通用语言规范( CLS )并不是虚拟对象系统( VOS )真正的一部分,它是特殊的.CLS定义了VOS中的一个类型子集,也定义了必须符合CLS的常规用法.
那么,对此有什么迷惑呢?如果一个类库遵守CLS规则,其它编程语言同样也遵守CLS规则,那么其它编程语言的客户也可以使用类库.CLS是关于语言的交互可操作性( interoperability ).因此,常规用法必须仅遵循外部可访问项目 ( externally visible items )如方法、属性和事件等等.
我所描述的优点是你可以做以下工作.用C#写一个组件,在VB中派生它,因加在VB中的功能是如此之强大,在C#中再次从VB类派生它.只要所有的外部可访问项遵守CLS规则,这样是可行的. 我在这本书中出示的代码不关心CLS协定.但在构建你的类库时要注意到CLS协定.我提供了表2.1,用以给类型和外部可访问项定义协定规则.
这个清单不完整.它仅包含一些很重要的项目.我不指出出现在本书中每一种类型的CLS协定,所以有个好主意:当你寻找CLS协定时,至少应该用浏览该表,以了解哪种功能有效.不要担心你不熟悉这章表中的每一个含义,在这本书中你会学到它们.
表2.1 通能语言规范中的类型和功能
bool char byte short int long float double string object( 所有对象之母 ) Arrays( 数组 )
数组的维数必须是已知的( >=1 ),而且最小下标数必须为0. 要素类型必须是一个CLS类型.
类型( Types )
可以被抽象或隐藏. 零或更多的接口可以被实现.不同的接口允许拥有具有相同名字和签名的方法. 一个类型可以准确地从一个类型派生.允许成员被覆盖和被隐藏. 可以有零或更多的成员,它们是字段( fields )、方法、事件或者类型. 类型可以拥有零或更多个构造函数. 一种类型的可访问性可以是公共的或者对NGWS组件来说是局部的;但是,仅公共成员可以认为是类型接口的一部分. 所有的值型必须从系统值型继承.异常是一个枚举——它必须从系统枚举( System Enum )继承.
类型成员
类型成员允许隐藏或者覆盖另一种类型中的其它成员. 参数和返回值的类型都必须是 CLS 协定 类型. 构造函数、方法和属性可以被重载. 一个类型可以有抽象成员,但仅当类型不被封装时.
方法
一种方法可以是静态、虚拟或者实例. 虚拟和实例方法可以是抽象的,或者是一个实现.静态方法必须总拥有一个实现. 虚拟方法可能是最后的( 或者不是 ).
字段( Fields )
可以是静态或者是非静态. 静态字段可以被描述或只初始化.
属性
当获取和设置方法而不是使用属性语法时,属性可以公开. 获取的返回类型和设置方法的第一个参数必须是相同的CLS类型——属性的类型. 属性名字必须不同,不同的属性类型用于区分是不充分的. 由于使用方法实现属性访问,如果 PropertyName 是同一个类中定义的一个属性,你不能实现命名为 get_PropertyName 和 set_PropertyName 的方法. 属性可以被索引. 属性访问必须遵循这种命名格式:get_ProName,set_PropName.
枚举( Enumerations )
强调类型必须是byte、short、int 或long. 每一个成员是一个枚举类型的静态描述字段. 一个枚举不能实现任何接口. 你允许给多字段设定相同的值. 一个枚举必须继承系统枚举( 隐含在C#中 )
异常
可以被引发和被捕获. 自定义异常必须继承系统异常.
接口
可需要实现其它接口. 一个接口可以定义属性、事件和虚拟方法.实现取决于派生类.
事件
增加和取消方法必须是都提供或者都没有 ,每一种方法采用一个参数,它是一个从系统代表元( System Delegate )派生下来的类.
自定义属性
可以仅使用下更类型:Type( 类型 ),char, char, bool, byte, short, int, long, float, double, enum ( 一种CLS 类型 ), and object.
代表元( Delegates )
可以被创建和被激活
标识符( Identifiers )
一个标识符的第一个字母必须来自一限制集. 通过大小写在单一范围内,不可能唯一地区别两个或更多个标识符( 大小写不敏感 ).
2.2.4虚拟执行系统( VES )
虚拟执行系统实现了虚拟对象系统.通过实现一个负责NGWS runtime的执行引擎( execution engine,缩写EE )创建VES.这个执行引擎执行你用C#编写和编译的应用程序.
下列组件为VES的一部分. 1、中间语言( IL )——被设计为很容易受各种各样的编译器所兼容 .在该框架之外,C++、VB和C#编译器都能够生成IL. 2、装入受管代码——这包括解决内存中的名字、 表层类( laying out classes),并且创建JIT编译所必需的存根.通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性. 3、用JIT转换IL成原始代码——IL代码并不是设计成为一种传统的解释字节代码或树型代码,IL转换是真正的编译. 4、装入元数据、校验类型安全和方法的完整性 5、垃圾收集( GC )和异常处理——两者都是基于堆栈格式的服务.受管代码允许你动态地跟踪堆栈.要动态地识别各个堆栈框架,JITter或其它编译器必须提供一个代码管理器. 6、描绘和查错服务——两者都取决于由源语言编译器所生成的信息.必须发出两个映射:一个映射从源语言结构发到指令流中的地址,一个映射从地址发到堆栈框架中的位置.当执行从IL到原始代码的转换时,这些映射被重新计算. 7、管理线程和上下文,还有远程管理——VES为受管代码提供这些服务. 虽然这个清单并不完整,但它足以让你理解运行时基于的由VES提供的低层架构.肯定将会有专门讨论运行时的书,而这本书将稍为深入地挖掘各种话题.
2.3 小结
这一章,我带你逛了一回运行时的世界.我描述了当创建、编译和配置C#程序时它是如何工作的.你学会了中间语言( IL ),还有元数据是如何用于描述被编译为IL的类型.元数据和IL都用于JITter检测和执行你的代码.你甚至可以选择用哪一种JITter来执行应用程序. 在这一章的第二部分,涉及到了运行时为何按这种方式工作的理论.你学了虚拟对象系统( VOS )和组成它的那部分.对于类库设计者最为感兴趣的就是通用语言规范( CLS ),它为基于VOS的语言交互操作设定规则.最后,你看到了虚拟执行系统( VES )如何通过NGWS runtime实现VOS
本文由中国C#技术学习中心整理 如果你对本文有不明之处请到技术论坛讨论!
|