言的编译器産的将 是IL代码。当然,我们也可以直接以汇编语言的 IL代码。当然,我们也可以直接以汇编语言的 方法写IL程序。微软也提供了一个IL汇编器: 方法写IL程序。微软也提供了一个IL汇编器: ILAsm.exe,另外还有一个反汇编器:ILDdsm.exe ILAsm.exe,另外还有一个反汇编器:ILDdsm.exe 。 C# 或者Visual Basic 等高级语言提供的都只是CLR 或者Visual 等高级语言提供的都只是CLR 全部功能的一个子集。 IL汇编语言允许开发人员 IL汇编语言允许
开发人员 获取CLR所有的功能。 获取CLR所有的功能。
总结IL的特点如下: 总结IL的特点如下: 1、面向对像特性,与其他汇编不同。 2、IL可以获取CLR所有的功能 IL可以获取CLR所有的功能 3、IL并不束缚于任何特定的CPU平台,也就是说 IL并不束缚于任何特定的CPU平台,也就是说 他也可以跨平台。
.net程序执行过程如下: .net程序执行过程如下: 1 一个方法执行之前,CLR首先检测Main中代码引用的所有类型,CLR会分配 一个方法执行之前,CLR首先检测Main中代码引用的所有类型,CLR会分配 一个内部的数据结构,该数据结构用于管理对所引用类型的访问。 2、当该数据结构被初始化时,CLR将把每一个条目设置 为CLR内部的一个没 、当该数据结构被初始化时,CLR将把每一个条目设置 CLR内部的一个没 有正式记录的函数,我们暂且称该函数为 JITCompiler。 JITCompiler。 3、当Main方法第一次调用引用的类型的方法成员时,JITCompiler函数将被调 、当Main方法第一次调用引用的类型的方法成员时,JITCompiler函数将被调 用,该函数负责将一个方法的IL代码编译成本地CPU指令。 用,该函数负责将一个方法的IL代码编译成本地CPU指令。 4、 JITCompiler将前面第2步的数据结构中的要调用的真实方法的地址替换成 JITCompiler将前面第2 包含刚刚编译好的CPU指令的内存块地址。 包含刚刚编译好的CPU指令的内存块地址。 5、 JITCompiler跳转到该内存块中的代码上,开始执行。 JITCompiler跳转到该内存块中的代码上,开始执行。
注意:一个类型的所有方法只会编译一次, 当这个类型的方法又被调用时,将会使用 之前已经编译过的代码,这样只有在首次 调用时,才会产生性能损失。 也就是说托管代码跟非托管代码相比,性 能上的损失是非常小的,近乎微不足道。
托管代码在性能上的优点:
1、 在新型的如奔4CPU上,JIT编译器能产生利用新型 在新型的如奔4CPU上,JIT编译器能产生利用新型 CPU提供的特殊指令的本地代码。而非托管应用程序通常 CPU提供的特殊指令的本地代码。而非托管应用程序通常 被编译为向具有最小通用功能集合的CPU平台,一般会避 被编译为向具有最小通用功能集合的CPU平台,一般会避 免使用新型CPU提供的特殊指令。而这些特殊指令往往会 免使用新型CPU提供的特殊指令。而这些特殊指令往往会 在较新的Cpu上为应用程序带来很高的性能提升中。 在较新的Cpu上为应用程序带来很高的性能提升中。
2、 JIT编译器能检测到正在运行的机器上某些总是返回错误的布尔测 JIT编译器能检测到正在运行的机器上某些总是返回错误的布尔测 试。例如: If(numberOfCPUs>1) { } 如果宿主机
器只有一个CPU,那么对于该段代码,JIT编译器将不会产 如果宿主机器只有一个CPU,那么对于该段代码,JIT编译器将不会产 生任何CPU指令。针对宿主机器的本地代码就会得到更好的调整:代 生任何CPU指令。针对宿主机器的本地代码就会得到更好的调整:代 码量将变得更小,执行速度也会更快。 当然,我们可以利用Ngen.exe工具,将IL代码转化为本地代码,并生 当然,我们可以利用Ngen.exe工具,将IL代码转化为本地代码,并生 成一个文件,这样执行程序时,CLR将自动检查是否有个预编译的版 成一个