ECMA-335(CLI)标准 读书笔记(第一部:概念和架构 1~6章)
为了做项目,今天开始通读一下Ecma335标准(2006年6月第四版),琢磨怎么能裁剪出一个核心框架出来。好家伙,长达556页的pdf文档。
全文共六 大部分。将前面看的大纲的条款说明部分基本翻译了一下。
www.ecma-international.org
对应术语翻译:
Metadata —— 元数据
Profile —— 特征
Class —— 类
member —— 成员
function —— 函数
property —— 属性
field —— 字段
event —— 事件
第一部:概念和架构
1. Scope 范围
该规范主要定义了CLI (Common Language Infrastructure)
第一部分:概念和架构。主要介绍了CLI的架构,CTS(Common Type System) , VES(Virtual Execution System)和CLS(Common Language Specification)的标准描述以及元数据的一点总体描述。
第二部分:Metadata定义和语法。文件格式,逻辑内容和语法。
第三部分:CIL (Common Intermediate Language) 指令集。
第四部分:特征和库。CLI库的总览,特征和库的分解规范。
第五部分:调试交换格式。
第六部分:附件。
- 一些ILAsm编写 的示例程序
- 汇编程序的详细实现信息
- 一套计算机可处理的CIL指令集的描述,该指令集可以用来产生部分语法以用于汇编程序和操作CIL的其它工具
- 第四部分中库的设计准则
- 便携性的考虑。
2. Conformance 一致性
符合该标准的系统应该能实现该标准所规定的所有的标准要求。至少能执行核心特征。在不妨碍本标准规定的功能实现的情况下可以增加功能。可以对标准类库中的类增加成员函数,但不得在接口上增加。
.Net 语言编译器应该产生符合该标准的可验证代码的CIL。
3. 引用文献
4. 标准文本中的一些约定
5. 术语和定义
6. CLI总览
CLI提供了一个可执行代码及其运行环境的规范。CLI的核心是一个统一类型系统,被编译器、工具和CLI自身所共享的CTS。
CTS (Common Type System) 建立了一个跨平台、类型 安全和高性能代码执行的框架。该章通过描述CTS描述了CLI的架构。
该章描述了以下四部分:
- CTS——支持各种语言的类型和操作。CTS倾向于支持更广范围的编程语言的完整实现。见第8章。
- Metadata——描述和介绍CTS定 义的类型;元数据提供了一种在工具间(编译器、调试器)及工具 与VES间的通用交互机制。见第9章.
- CLS——CLS是一份语言设计者和类库设计者之间的一份协议。指定了CTS的一个子集和一套用法约定。见第10章。
- VES——负责调用和运行为CLI写的程序,提供执行托管代码和数据的服务,在运行时,用元数据连接起分散的模块。见第12章。
这样,CLI形成了一个设计、开发、配置和执行分布式组件和应用的统一基础框架。基于CLI的每种编程语言有共通的一套CTS子集,基于语言的工具能够互相间也能与VES交互。当需要为别的基础框架部分提供数据类型信息时,VES使用元数据创 建类型的实例(诸如远程服务,程序集下载和安全)
6.1 与类型安全的关系
类型安全经常在以下这些情况时讨论:做什么(譬如保证不同对象间的封装)、阻止什么(譬如阻止写内存 越界)。然而,从CTS的角度看,类型安全保证了:
- 引用了什么就是什么——每个引用都有类型,引用的对象或者值也有类型,这些类型的定义是一致的。(见8.7)
- 标识了什么就是什么——没有办法误用或者编造一个对象、用户或者安全域。访问对象只能通过可访问的函数和字段。对象仍然能被设计成安全妥协的。然而,不需要对一个类的所有使用进行全局分析,而只对该类的方法和它用到的方法的局部分析就足以评估其脆弱性。
- 只有合适的操作能被调用——引用类型定义了可访问的函数和字段。这限制了一些可见性(譬如保护字段只有在派生类中可见)。
CTS提供了类型安全,一切皆有类型。问题在于决定一个实现是否符合类型安全的声明。因为声明是在元数据中以被编译的形式出现的,所以基于CIL的编译器能够对实现做类型检查。
6.2 与托管的元数据驱动执行的关系
元数据包括通过代码自定义的类型和引用外部的类型。当程序代码生成时,编译器生成元数据代码。
足够多的信息被存于元数据中:
- 托管代码执行——不只是调用和执行,还有内存管理和执行状态检查。
- 管理代码——安装、 解决和其它服务。
- 代码中的引用类型——既导入到其他语言和工具中,也具有脚本和自动支持功能。
- 多执行模式——元数据允许执行环境混合处理解释、JIT编译、原有的和继承来的代 码,并仍旧像调试器和分析器那样展现统一的服务、统一的异常处理、展开的可靠的访问安全代码以及有效的内存管理。
- 对服务的自动支持——因为元数据在执行时有效,所以执行环境和基本库能够自动提供对反射、自动化、序列化、远程对象的支持。而对于非托管的本地代码,由于其可操作部分被隐藏,所以对程序编写人员而言只有一点或根本没有作用。
- 更好的优化——用代 替物理偏移、布局和大小的元数据引用来允许CLI优化成员和下发表的物理布局。
- 简化绑定关联性——用元数据引用,通过加载时规划替代编译时规划和名字绑定来减少版本到版本的关联性。
- 灵活的配置方案——因为我们能用元数据来既做引用又做定义类型,所以使更强的鲁棒性和灵活配置以及解决机制成为可能。方案就是通过查看一些适当的程序后,可能找出用于该情况下最满足需求的实现方案。前面讲的有五个要素:要通过元数据满足需求和上下文关系,去哪里查看,怎样找到一种实现方案以及怎样决定如何才能最优匹配所有应用程 序包和配置。
6.2.1 托管代码
托管代码是提供了足够的信息以允许CLI提供一套核心服务的代 码,包括:
- 指定方法、定位描述方法的元数据的地址
- 遍历栈
- 处理异常
- 存储和恢复异常信息
这个标准为存储和传达托管代码提供了详细的指令集、CIL(第三部分)和一种文件格式(第二部分)
6.2.2 托管数据
托管数据是被CLI通过垃圾回收进程自动分配和释放的数据。
6.2.3 摘要
CTS就是关于语言间的集成:用别的 语言对象就好像是用自己的。
CLI的目标是用任何一种 语言写组件和程序更容易。它通过定义一套标准类型,所有组件自描述,提供高性能的通用执行环境来做到这点。这确保了所有CLI兼容的系统服务和组件可以访问所有CLI可理解的语言和工具。另外,这简化了使用组件和应用程序时的配置,所有这一切允许编译器和其他工具支 持高性能的执行环境。CTS高层次地包含了这些概念和相互作用,使这一切 成为可能。
讨论分为四部分:
- 类型系统——类型是什么及如何定义他们
- 元数据——类型如何被描述及那些描述如何被存储
- CLS——对语言互通性的限制性要求
- VES——代码如何被执行及类型如何被初始化、相互作用及消亡