zoukankan      html  css  js  c++  java
  • CLR via C#:CLR的执行模型

     
    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外部的任何功能,因为其他语言可能不支持这个功能。
     
  • 相关阅读:
    How to get the IIS root path in other application.
    Web.UI.Controls与页面事件的冲突问题。
    分析在服务器上设置计时器的问题。
    首次感觉我的电脑过时了。。。。。。。。郁闷。
    Google Logos
    2005年的最后一天
    TreeView的几个使用小技
    浅淡反射问题
    The restricted headers are:
    在服务器上用Timer遇到的小问题。。。。
  • 原文地址:https://www.cnblogs.com/zouzf/p/2662830.html
Copyright © 2011-2022 走看看