zoukankan      html  css  js  c++  java
  • CLR读书笔记第一章 CLR的执行模型

    参考了Jianqiang Bao的笔记: http://www.cnblogs.com/Jax/archive/2008/04/05/1047032.html

    1.1 将源代码编译成托管模块

    1. 生成什么类型的应用程序或者组建(文件);

      (1)CLR(Common Language Runtime): 公共语言运行时;可由多种语言使用的运行时;---就是一个运行时环境

           什么是CLR...参考: http://baike.baidu.com/view/605055.htm

           (在CLR监视下运行的程序属于"托管的"代码,不在CLR之下运行,直接在裸机上运行的应用或组件属于"非托管的"代码)

      (2)CLR的核心功能可由面向CLR的所有语言使用.例如: 异常报告,创建线程...

      (3)CLR不关心使用的语言;

      (4) 编译器: 可将编译器视为语法检查器...

          使用编译器生成的都是一个托管模块,--是一个标准的32/64位可移植执行文件,他们都需要CLR才能执行

         托管模块的组成部分:

              @1 PE32/PE32+头: 标准Windows PE头;

              @2 CLR头: 包涵使这个模块成为一个托管模块的信息;

              @3 元数据: 每个托管模块都包含元数据表;  (什么是元数据?:http://baike.baidu.com/view/107838.htm)

                              元数据--简单的说就是一组数据表,一些表描述了模块中定义的内容,一些表描述了托管模块引用的内容.元数据是一些老技术的超集.

             元数据总是与IL文件关联,事实上,元数据总是嵌入和代码相同的exe/dll中

         @4 IL(中间语言代码)代码: 即编译器编译源代码生成的代码,在运行时,CLR将IL编译成本地CPU指令; IL代码有时称为 托管代码,因为CLR要管理它的执行

       (5) 元数据的作用:

        @1 消除对本地C/C++头和库文件的需求,编译器可以直接从托管模块中读取元数据;

        @2 智能提示...;

        @3 确保只执行"类型安全"的操作;

        @4 正反序列化;

        @5 允许垃圾回收器跟踪对象的生存期;....

    1.2 将托管模块合并成程序集

      CLR实际上是和程序集一起工作的,在CLR世界里,程序集相当于一个"组件";

      1. 程序集(assembly): @1 是一个或者多个模块/资源文件的分组;@2 是重用,安全性以及版本控制的最小单元;

      2. 一些托管堆和资源文件交由一个工具(EX:C#编译器)生成单独一个PE32(+)文件来表示文件的逻辑性分组;这个PE32(+)文件包含一个名为"清单"的

             数据块.清单表述程序集中的文件集..

           3. 默认情况下: 编译器会把生成的托管模块转换为程序集;C#编译器生成含有清单的一个托管模块,清单指出程序集只由一个文件构成;

    1.3 加载公共语言运行时

      1.CLRVer命令,查看机器上所有的CLR版本;

      2.csc的/plattform开关,决定生成什么样子的程序集: AnyCPU,x86,x64,Itanium;

    1.4 执行程序集的代码

      高级语言(C#)只是CLR的一个子集,IL则允许访问CLR的所有功能;

          1. 托管程序集同时包含元数据和IL(IL是与CPU无关的语言),可将IL视为一种面向对象的机器语言;

      2. 为了执行一个方法,首先必须把它的IL转换成本地CPU指令.-->这是CLR的JIT(Just-In-Time,"即时")编译器的职责;

      3. 一个方法首次调用时发生的事情:

        

       @1 在Main()方法执行之前,由于Main()引用了一个Console类型,CLR会分配一个内部结构,对这个结构进行初始化时,CLR将每个记录项都设置成指向包含

               在CLR内部的JITCompiler函数;

                 Main()方法执行之前: CLR会检测出Main()的代码引用的所有类型,这导致CLR分配一个内部数据结构用于管理对所引用类型的访问;

                 每个记录项: 在这个内部数据结构中,Console类型定义的每个方法都有一个对应的记录项,每个记录项都容纳了一个地址,根据此地址即可找到方法的实现;

           @2 Main()方法首次调用WriteLine时,JITCompiler函数会被调用.JITCompiler函数负责把一个方法的IL编译成本地CPU指令.JITCompiler被调用时,它知道要

                 调用哪个方法以及具体是什么类型定义了该方法

      @3 JITCompiler会在定义该类型的程序集中查找到被调用的方法的IL;

          @4 JITCompiler验证IL代码,并将IL代码编译成本地CPU指令.(本地CPU指令被保存到一个动态分配的内存块中)

          @5 JIPCompiler返回CLR为类型创建的内部数据结构,找到与被调用的方法对应的那一条记录,修改最初对JITCompiler的引用,让它指向内存块的地址 ,

          @6 JITCompiler跳转到内存块中的代码.这些代码正是WriteLine方法的实现.这些代码执行完毕之后,会再次返回Main中.

          当第二次调用 WriteLine时,由于已经对WriteLine进行了验证和编译,所以会直接执行内存块中的代码,完全跳过JITCompiler函数,WriteLine执行完后再次返回

          Main方法;

          4. 一个方法只有在首次调用时才会造成一些性能损失

          5. 有两个开关会影响代码的优化: /optimize和/debug.  默认时: /optimize-/debug-  ,/optimize-在C#编译时生成未优化的代码,将包含许多NOP指令,还有

               许多分支指令,这些东东就让我可以调试代码时可以设置断点,...单步调试...

      6. 代码的编译时分两个阶段编译的: @1编译器将源代码生成IL; @2CLR中的JIT再将IL生成本地CPU指令...

          7. 托管应用程序的性能实际上超过了非托管应用程序,...N多理由...

    1.4.1 IL和验证

      1. IL是基于栈的,IL也没有提供操作操作寄存器的指令;

      2. IL的最大优势: 应用程序的健壮性和安全性...将IL编译成本地CPU指令时:CLR会执行一个验证的过程这个过程会检查高级IL是否安全;

          3. 在windows中每个进程都有一个虚拟地址空间,将每个进程放到独立的地址空间中,可获得健壮性和安全性.一个进程无法干扰另一个进程;

        在windows中进程需要大量操作系统资源,进程数量太多会损害性能并制约可用资源;

        @1 通过验证托管代码可确保代码访问正确的内存 @2 在一个进程中运行多个应用程序

       CLR提供在一个进程中珍惜你哥多个托管应用程序的能力,每个托管应用程序都在自己得AppDomain中执行.默认情况下,每个托管的exe文件都在它的独立

       地址空间中运行这个地址只有一个AppDomain(应用程序域);

    1.4.2 不安全的代码

      1. C#编译器默认生成的代码时安全的(safe)代码.但是编译器也允许写不安全(unsafe)的代码--不安全的代码允许直接操作内存地址,并操作这些地址处的字节.

       通常只在与非托管的代码进行互操作时使用,或者提升对效率要求极高的算法时用;

      2. 重大风险: @1 破坏数据结构,危害安全; @2 甚至造成新的安全漏洞;

      3. 要求所有的不安全代C码都要使用unsafe关键字JIT编译器编译时: 会检查@1 权限;@2 标志是否设定;

    1.6 Framework类库

      1. .NET Framework中包涵了Framework类库(Framework Class Library  FCL). FCL就是一组DLL文件的统称;

    1.7 通用类型系统

         1. CLR完全是按照类型展开的.通过类型,不同的编程语言之间可以沟通.类型是CLR的根本,因此微软制定了这个正式规范: 通用类型系统--CTS 

             common type system,描述了类型的定义和行为;

      2. CTS的规则:

         @1 一个类型可以包含0个或者多个成员;

         @2 指定了类型的可视性规则和成员的访问规则;

         @3 为类型继承,虚方法,对象生存期等定义了相应的规则;

         @4 所有类型都是从预定义的system.object继承.

    1.8 公共语言规范

      1. 公共语言规范 CLS(Common Language Specification)详细定义了所有语言都必须支持的一个最小功能集,

      2. 在CLR中: 一个类型的每个成员要么是一个字段要么是一个方法...源代码最后都会被编译为字段或者方法.

    1.9 与非托管代码的互操作性

          1. 托管代码能调用dll中的非托管代码;

      2. 托管代码可以使用现有的COM组件;

      3. 非托管代码可以使用托管类型;

      ---本人菜鸟一枚....呵呵...有点抄书的感觉,第一次写读书笔记.差不多两个星期才看完这一章,主要是每天都没怎么看,下班回来就上网干别的了...( ⊙ o ⊙ )!  木有恒心!!!该打...嘿嘿...继续加油,给自己做的笔记..欢迎拍砖.

            

        

      

  • 相关阅读:
    iOS中图片与视频一次性多选
    UIImagePickerController Class
    1月16日
    10月20日
    1月14日
    1月13日
    1月12日
    1月11日
    课程评价与建议
    加分总结
  • 原文地址:https://www.cnblogs.com/ry123/p/2764530.html
Copyright © 2011-2022 走看看