CLR 的突出特色

来源:互联网 发布:ext4分区 windows 编辑:程序博客网 时间:2024/04/29 11:51

CLR 的突出特色


     跨语言集成的能力

     CLR 包含了一个丰富的语言特性集 保证了它与各种程序设计语言的兼容性 这
一特性集即公用语言规范 稍后将对其进行详细说明

     内存管理自动化

     在执行过程中管理应用程序的资源是一项单调而困难的工作 它会将你的注意力
从你本应解决的问题中引开 而垃圾收集机制完全解决了程序员在编程过程中头痛的
问题 跟踪内存的使用 并知道何时将它们释放
     在面向对象的环境中 每种类型都标识了对你的应用有用的某种资源 为了使用
这些资源 你需要为类型分配内存 在应用中 访问一种资源要通过以下步骤
       1 为类型分配内存
       2 初始化内存 设置资源的初始状态并使其可用
       3 通过访问该类型的实例成员来访问资源
       4 卸下将被清除的资源状态
       5 释放内存
     这一看似简单的过程在实际的编程中是产生程序错误的主要来源之一 更可怕的
是 内存中的错误往往导致不可预见的结果 如果你有过编程的经验 想想看 有多
少次你的程序因为内存访问错误而崩溃
     CLR 要求所有的资源从可操控的堆 注 在此指一种内存结构 中分配 当一个

进程被初始化后 CLR 保留了一个未被分配的地址空间 这一区域叫做可操控堆 在
堆中保持了指向下一个将被分配给对象的堆地址的指针 NEXT 初始状态下 该指
针是保留地址空间的基地址 一个应用使用新的操作产生对象 此操作首先检查新对
象需要字节的大小是否会超出保留空间 如果对象大小合适 指向下一个地址的指针
将指向堆中的这个对象 该对象的构造器被调用 新的操作返回对象的地址
    当一个应用请求建立一个对象时 地址空间可能不够大 堆将发现这一点 通过
将新对象的大小与 NEXT 指针相加 并与堆的大小进行比较 这时垃圾收集器就将被
调用 在这里 CLR 引入了 代 的概念 代 指堆中对象产生的先后 这样 垃圾
收集器在将发生溢出时回收属于特定的 代 的对象 而不是回收堆中的所有对象
      6 即时编译
    在各种语言的编译器对源代码进行编译之后 在 CLR 环境中产生的是中间代码 出
于兼容性与跨语言集成的考虑 其内容虽然有效 但在转化为本地代码之前它本身是
不可执行的 这就是 JIT 编译器需要完成的工作
    这里需要说明一个问题 为什么要即时编译 而不是一次性的将中间代码文件进
行编译 答案很简单 原因在于效率 在大型的应用中 你很少会用到程序的全部功
能 这种边执行边编译的措施比一次性的完全编译效率更高
    在 Windows 平台中 CLR 带有三个不同的 JIT 编译器
      7 缺省的编译器 主编译器 由它进行数据流分析并输出经过优化的本地代
码 所有的中间代码指令均可被它处理
      8 PREJIT 它建立在主 JIT 编译器之上 其运行方式更像一个传统的编译器
每当一个.NET 组件被安装时它就运行
      9 ECONOJIT 在并不充分优化的前提下 它能够快速完成 IL 代码到本地码的
转换 编译速度与运行速度都很快
    为了配合编译器的工作 在.NET SDK 的安装路径下的/bin 目录中有一个负责管理
JIT 的应用程序 jitman.exe 具体的使用参见联机帮助
      10 解决版本与发布问题
    在当前以组件为基础的系统中 开发人员和用户对于软件版本和发布中存在的问
题已经十分熟悉了 当我们安装一个新的应用之后 我们很可能发现原本正常的某个
应用程序奇怪地停止了工作 绝大多数开发人员将时间花在了确保所有注册表入口的
一致性 以便激活 COM 类上 这就是所谓的 DLL 地狱
    .NET 平台通过使用集合来解决这一问题 在这里 集合 是一个专有名词 指
类型与资源的发布单元 在很大程度上它等同于今天的 DLL 正像.NET 用元数据描述
类型一样 它也用元数据描述包含类型的集合 通常说来 集合由四个部分组成 集
合的元数据 集合的内部清单 元数据描述的类型 实现类型的中间语言代码和一组
资源 在一个集合中 以上四个部分并不是都必须存在 但是 集合中必须包含类型
或资源 这样集合才有意义
    在.NET 中一个基本的设计方针是使用孤立的组件 一个孤立的集合的含义是指一
个集合只能被一个应用所访问 在一台机器上 它不被多个应用共享 也不会受其它
应用程序对系统的更改的影响 孤立 赋予了开发人员在自己的程序中对代码的完全

控制权 任何共享代码都需要被明确地标识 同时 .NET 框架也支持共享集合的概念
一个共享集合指在一台机器上被多个应用共享的集合 共享集合需要严格地命名规定
有了.NET 应用程序间的共享代码是明确定义的 共享集合需要一些额外的规则来避
免我们今天遇到的共享冲突问题 共享代码必须有一个全局唯一的名称 系统必须提
供名称保护 并在每当引用共享集合时 CLR 将对版本信息进行检查 此外.NET 框架
允许应用或管理员在明确说明的版本政策下重写集合的版本信息

0 0
原创粉丝点击