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 ⊙ )!  木有恒心!!!该打...嘿嘿...继续加油,给自己做的笔记..欢迎拍砖.

 

 

 

 

 

 

 

 

 

 

 

 

 

        

 

    

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/ry123/archive/2012/11/24/2764530.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值