.NET框架程序设计读书笔记(三)--执行程序集代码

原创 2004年06月14日 10:41:00

1.4执行程序集代码<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

托管模块中包含着元数据和IL代码。IL是由微软在咨询了一些商业和学术上的语言编译器作者之后开发的一种独立于CPU的机器语言。IL要比大多数CPU机器语言高级得多,它可以理解对象类型,并且拥有很多高级的指令,这些指令可以创建和初始化对象,调用对像上的虚方法以直接操作数组元素。它甚至还有抛出和捕获异常的指令。我们可以把IL 作一种面向对像的机器语言。

通常情况上,开发人员会使用一门高级语言,比如:C#Visual Basic)。这些语言的编译器産的将是IL代码。当然,我们也可以直接以汇编语言的方法写IL程序。微软也提供了一个IL汇编器:ILAsm.exe,另外还有一个反汇编器:ILDdsm.exe

C# 或者Visual Basic 等高级语言提供的都只是CLR全部功能的一个子集。 IL汇编语言允许开发人员获取CLR所有的功能。

总结IL的特点如下:

  1、面向对像特性,与其他汇编不同。

  2IL可以获取CLR所有的功能

  3IL并不束缚于任何特定的CPU平台,也就是说他也可以夸平台。

 

.net程序执行过程如下:

1 一个方法执行之前,CLR首先检测Main中代码引用的所有类型,CLR会分配一个内部的数据结构,该数据结构用于管理对所引用类型的访问。

2、当该数据结构被初始化时,CLR将把每一个条目设置 CLR内部的一个没有正式记录的函数,我们暂且称该函数为 JITCompiler

3、当Main方法第一次调用引用的类型的方法成员时,JITCompiler函数将被调用,该函数负责将一个方法的IL代码编译成本地CPU指令。

1、   JITCompiler将前面第2步的数据结构中的要调用的真实方法的地址替换成包含刚刚编译好的CPU指令的内存块地址。

2、   JITCompiler跳转到该内存块中的代码上,开始执行。

 

注意:一个类型的所有方法只会编译一次,当这个类型的方法又被调用时,将会使用之前已经编译过的代码,这样只有在首次调用时,才会产生性能损失。

也就是说托管代码跟非托管代码相比,性能上的损失是非常小的,近乎微不足道。

 

托管代码在性能上的优点:

 

1、   在新型的如奔4CPU上,JIT编译器能产生利用新型CPU提供的特殊指令的本地代码。而非托管应用程序通常被编译为向具有最小通用功能集合的CPU平台,一般会避免使用新型CPU提供的特殊指令。而这些特殊指令往往会在较新的Cpu上为应用程序带来很高的性能提升中。

2、   JIT编译器能检测到正在运行的机器上某些总是返回错误的布尔测试。例如:

 

If(numberOfCPUs>1)

{

 

}

 

如果宿主机器只有一个CPU,那么对于该段代码,JIT编译器将不会产生任何CPU指令。针对宿主机器的本地代码鶁会得到更好的调整:代码量将变得更小,执行速度也会更快。

 

   当然,我们可以利用Ngen.exe工具,将IL代码转化为本地代码,并生成一个文件,这样执行程序时,CLR将自动检查是否有个预编译的版本存在,如果存在,CLR将加载预编译的代码,不需要额外的运行时编译。

 

1.4.1  IL与代码验证

 

1、   IL是一种基于堆栈的语言

2、   IL没有提供操作寄 存器的指令,开发人员可以很容易地产生IL代码。

3、   IL需要的指令也比较少。

4、   IL指令是无类型的。

5、   ILCPU实现了抽象。

 

IL的最大优点是:提高了应用程序的健壮性,当IL代码被编译为本地Cpu指令时,CLR将执行一个称作验证的过程。

 

验证过程检查高级IL代码,确保它做的每件事情都是“安全”的。以下是检验的一些条目:

1、   不能从未初始化的内存中读取数据。

2、   每个方法都必须传入正确的参数个数,且各个参数的类型要正确匹配。

3、   每个方法的返回值都必须被正确地使用。

4、   每个方法都必须有一个返回语句

。。。。

         如果验证不通过,将有一个System.Security.VerificationException异常被抛出,阻止方法继续执行。

 

验证的优点:

   通过验证的代码,我们可以确保它们不会访问它们不应该访问的的内存,因此也就不会干扰另一个应用程序的代码。这意味着我们可以在一个单独的windows虚拟地址空间内运行多个托管应用程序。

《JavaScript高级程序设计 第三版》学习笔记 (十一)事件详解

一、事件流 1.事件冒泡:事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。最早使用事件冒泡的是IE,现在绝大多数浏览器都使用冒泡。IE9、F...
  • lbxx1984
  • lbxx1984
  • 2014年09月01日 21:55
  • 1373

JavaScript高级程序设计(读书笔记)(七)

本笔记汇总了作者认为“JavaScript高级程序设计”这本书的前七章知识重点,仅供参考。 第七章 函数表达式 小结: 在JavaScript编程中,函数表达式是一种非常有用的技术...
  • hc1025808587
  • hc1025808587
  • 2016年06月13日 16:06
  • 6622

Linux设备驱动程序(第三版)读书笔记1,hello world

1.构建一个内核树 说是要2.6内核的
  • zmnqazqaz
  • zmnqazqaz
  • 2014年07月23日 10:09
  • 1627

Microsoft .NET框架程序设计读书笔记(一)

1.什么是DLL hell?由什么引起的? DLL hell DLL灾难是由COM组件升级引起程序不能运行的情况。COM对象常常编译为dll文件。由于COM对象可以重用,这样多个程序可能使用同一...
  • shadowyelling
  • shadowyelling
  • 2012年04月12日 11:20
  • 710

.net框架程序设计读书笔记二(Microsoft .net 框架开发平台体系架构)

马云曾调侃说,“人算不如天算,天算不如云计算”。虽说是一句玩笑话,但也确实有一定的道理,自2006年开始,云计算发展至今已有11年,在技术和应用领域方面都取得了巨大的进展,它也逐渐成为了许多企业转型发...
  • benxiaohai529
  • benxiaohai529
  • 2017年12月24日 21:34
  • 50

《.NET框架程序设计(修订版)》--第三章 共享程序集 (1) 转载

学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (1)2004-12-27第二章里讲到对程序集的私有部署方式。这章里探讨创建可以被多个应用程序共同访问的程序集,即全局部署程序集(gl...
  • qq631145382
  • qq631145382
  • 2011年01月01日 23:40
  • 232

《CLR via C#:框架设计》读书笔记 - 程序集加载和反射

23.1 程序集加载 返回 我们知道,JIT编译器将方法的IL代码编译成本地代码时,会查看IL代码中引用了哪些类型。在运行时,会利用程序集的TypeRef和AssemblyRef元数据...
  • a2324268086
  • a2324268086
  • 2016年04月22日 00:50
  • 501

学习《.net框架 程序设计》学习笔记---委托(一)

一.认识委托      在.net框架中,回调函数任然像在非托管windows编程中一样有用和普遍。但是,.net框架为回调函数提供了一种称为委托(delegate)的类型安全的机制。      例如...
  • pandeveloper
  • pandeveloper
  • 2011年06月22日 13:13
  • 354

.NET框架程序设计——体系结构

谈到.NET,相信对于大多数初学者而言,都会感觉比较乱、比较迷茫,什么ASP.NET、VB.NET、VC.NET、ADO.NET、.NETFramework 等等概念,搞的我们晕头转向的,他们之间到底...
  • dongyue786
  • dongyue786
  • 2014年10月15日 15:47
  • 1922

C语言程序设计读书笔记汇总

  • 2014年07月01日 14:47
  • 1.3MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.NET框架程序设计读书笔记(三)--执行程序集代码
举报原因:
原因补充:

(最多只允许输入30个字)