26 C# 第二十一章 CLI

来源:互联网 发布:boot repair ubuntu 17 编辑:程序博客网 时间:2024/05/19 05:38

CLI (Common Language Infrastructure)  公共语言基础结构


C#生成的不是处理器能直接解释的指令,它生成的是一种中间语言指令,CIL (Common Intermediate Language)公共中间语言。CIL会被转换为处理器能理解的机器码。然而光有机器码还是不够的,C#还需要在一个代理的上下文中执行。负责管理C#程序执行的这个代理就是虚拟执行系统(Virtual Execution System  VES),它更常见的称呼 "运行时"。


"运行时" 负责加载和运行程序,并在程序执行时提供额外的服务(安全保障,垃圾回收等)。


CIL 和 "运行时" 规范包含在一项国际性的标准中,即公共语言基础结构 CLI (Common Language Infrastructure)。


CLI 标准包含的规范:



  •   虚拟执行系统 (VES "运行时")
  •   公共中间语言 (CIL)
  •   公共类型系统 (Common Type System CTS)
  •   公共语言规范 (Common Language Specification, CLS)
  •   元数据 (Metadata)
  •   框架 (Framework)




C# 编译成机器代码

C#编译需要两个步骤:
1)  由 C#编译器从C#转换为 CIL。
2)  将 CIL 转换为处理器能够执行的指令。


C# HelloWorld
using System;namespace HelloWorld{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("Hello World!!");        }    }}





CIL HelloWorld
.method private hidebysig static void  Main(string[] args) cil managed{  .entrypoint  // Code size       13 (0xd)  .maxstack  8  IL_0000:  nop  IL_0001:  ldstr      "Hello World!!"  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)  IL_000b:  nop  IL_000c:  ret} // end of method Program::Main



机器码
00000000  push        ebp 00000001  mov         ebp,esp 00000003  push        edi 00000004  push        esi 00000005  push        ebx 00000006  sub         esp,30h 00000009  xor         eax,eax 0000000b  mov         dword ptr [ebp-10h],eax 0000000e  xor         eax,eax 00000010  mov         dword ptr [ebp-1Ch],eax 00000013  mov         dword ptr [ebp-3Ch],ecx 00000016  cmp         dword ptr ds:[042E14B0h],0 0000001d  je          00000024 0000001f  call        76584EB3 00000024  nop             Console.WriteLine("Hello World!!");00000025  mov         ecx,dword ptr ds:[01B72088h] 0000002b  call        76C6D420 00000030  nop 





运行时

即使运行时将CIL代码转换为机器码,并开始执行之后它也在继续管理着代码的执行。在这样的环境下运行的代码叫托管代码,"运行时"控制程序执行的过程叫托管执行



1)  垃圾回收 和 .Net的垃圾回收

垃圾回收是根据程序的需要自动分配或回收内存的过程。.Net的垃圾回收机制使用的是一个分代的(generational),支持压缩的(compacting)和标记并清除(mark-and-sweep)的算法。

分代:只存活过短暂时间的对象与已经在垃圾回收时存活下来的对象相比,前者会被更早的清理掉。


记并清除和压缩:在每次垃圾回收期间,它都会标记出将要回收的对象,并将剩余的对象压缩到一起,保证他们中间没有"脏"数据。采用压缩机制填充由回收腾出来的对象空间,通常会使新对象能更快的实例化,因为减少了寻找内存位置的时间。同时降低了执行分页处理的概率。




2)  性能

托管程序为应用程序带来了额外的开销。这就是个取舍的过程。提升开发效率还是保持程序运行时的性能。



公共中间语言

公共语言基础结构的个重要的特点:支持多种语言在同一个系统内交互。比如VB.Net, J#, C++等等。



元数据

除了执行指令,CIL代码还包含与类型和程序中包含的文件有关的元数据。
  •   程序或类库中每个类型的描述
  •   清单信息,包括与程序本身有关的数据,及它依赖的库
  •   嵌入代码中的自定义的特性




原创粉丝点击