CLR/C#精简知识

公共语言运行时(Common Language Runtime, CLR)是一个由多种编程语言使用的“运行时”。CLR的核心功能(如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。 

无论选择哪个编译器,结果都是托管模块(Managed Module)。它们都需要CLR才能执行

IL是与CPU无关的机器语言,IL比大多数CPU语言都高级,IL也能使用汇编语言编写,Microsoft甚至专门提供了名为ILAsm.exe的IL汇编器和名为IDLasm.exe的IL反汇编器。 

在Main方法执行之前,CLR会检测出Main的代码引用的所有类型。这导致CLR分配一个内部数据结构来管理对引用类型的访问。如图3,Main方法引用了一个Console类型,在这个内部数据结构中,Console类型定义每个方法都有一个对应的记录项(entry)。每一个记录项都有一个地址。这个地址最初指向JITCompiler,因此在Main首次调用WriteLine()方法时,JITCompiler会被调用并将该方法的IL代码编译成本机的CPU指令,随后本机CPU指令会被保存到动态分配的内存块中,然后JITCompiler回到Console结构中,修改最初对JITConpiler的引用,并使其指向刚刚开辟的内存块。 
现在,Main要第二次调用WriteLine时,就会直接调用之前由JITCompiler生成的本机CPU代码,直到进程终止释放该内存块。 

JIT将本机CPU指令保存到动态内存中,这意味着一旦应用程序终止,编译好的代码也会被丢弃,因此再次运行应用程序,或者同时启动应用程序的两个实例,JIT编译器都必须再次执行编译。 

  • IL最大的优势在于其产出的应用程序具有出色的健壮性和安全性,将IL编译成本机CPU指令时,CLR执行一个名为验证(verification)的过程,确认代码的行为是安全的,确认传给每个方法的每个参数都有正确的类型,每个方法的返回值都得到了正确的使用。
  • 不同语言创建的对象可以通过COM互相通信。CLR则集成了所有语言,用一种语言创建对象在另一种语言中也具有完全一致的行为和特征。 
posted @ 2017-12-27 19:51  燕子不呢喃  阅读(385)  评论(0编辑  收藏  举报