在上一篇的随笔中,我们在理论层面上大致说明了.NET Framework的工作机制,内容的确比较晦涩难懂,但是还是希望大家有时候可以看看。我个人觉得,编程不是一味的敲代码,当自己遇到瓶颈的时候,可以多看下书,多归纳总结下,或许会有意想不到的收获。自从学习了.NET Framework的机制以后,结合相关视频的讲解(黑马程序员_.NET入学辅导班公开课视频[第01季]),对.NET Framework有了一定的了解。下面用通俗易懂的方式进行阐述,可能有所偏颇或是不准确,仅为个人理解,但只是为了方便理解和让初学者有一定的概念。希望各位将错误指出,有则改之无则加勉。
开始介绍之前,我们还是看下之前微软官方公布的那张.NET Framework环境说明图,如下:
开发者编程的目的就是为了操作 操作系统/硬件,让操作系统/硬件完成特定的操作,方法很多各种各样(通过不同的编程语言不同方式),其中微软给开发者提供一个方法体系。因此,如果你想用通过微软提供的方法去完成相关操作的话,就必须通过.NET这个平台来进行管理,.NET就是方法的相关规则和约束,无规矩不成方圆嘛。编程语言 Visual Basic、C#、Visual C++、JScript 或许多第三方编译器(如 Eiffel、Perl 或 COBOL 编译器)在平台中就充当使用者的角色,但是平台不仅只有使用者,最重要的是其中的管理者吧。
CLR(公共语言运行时)就是.NET平台的管理员,管理语言的运行,管理代码的性能甚至内存等一系列与运行有关的内容。也就是说,在.NET里面CLR最大,你想在.NET进行任何操作都必须向CLR申请,它会指导你如何进行下一步,按部就班,事实上CLR基本上都会帮你完成所有的操作。
CLR身为管理者,统筹全局,当然不可能事必躬亲,它还有2个得力助手,JIT和GC,这是为了让使用者(编程语言)在.NET里拥有更高安全性,易用性和高效性。
在介绍得力助手号之前,我们需要了解,NET里的通行证— —IL/MSIL(Intermediate Language/Microsoft Intermediate Language)中间语言/微软中间语言,因为.NET的使用者(编程语言)很多,五花八门,所有为了方便管理,他们最后都会由各自对应的编译器编译成.NET里面的同一身份IL,一组可以有效地转换为本机代码且独立于 CPU 的指令。
当你摇身变成IL时,就可以拜托JIT编译成本机代码,然后和操作系统/硬件一起去做你一直想做却又做不到的事情 。至此,你应该了解 JIT即时编译器(Just-In-Time)的主要职责了吧,它就是将这个IL代码,根据当前的硬件和软件环境,进行运行的编译,并缓存代码。
(1)至于如何根据当前的硬件和软件环境进行优化,这里可以说一些简单的例子。JIT会根据本机的硬件环境生成对应的代码,当然,也并非行代码都生成。因为JIT会根据代码的与运行情况,根据系统的环境对变异结果做优化,例如:
for(int i=0;i<100;i++) { }
这段代码并没有实际作用和意义,只是在浪费CPU的资源,就会忽略编译。
(2)如果代码中有很多次调用这个方法,那么CLR在JIT编译这个代码第一次以后,就会将已经编译好的缓存起来。下一次要使用的时候,不去编译了,直接从缓存中取出编译好的代码执行即可。
例如:
如当WriteLine首次被调用时,JIT将它编译成本机代码,当WriteLine再次被调用时,就不再进行编译而是直接执行内存块里面的代码。
GC 垃圾回收器(Garbage Collection),它在CLR心目中的具有举重轻重的地址。它往往将不用的或是不常用的代码直接删除掉(在计算机中内存是有限,程序的运行不断消耗内存,CLR会将不用的部分自动删除),如果再要使用,重新创建,整理内存(GC删除对象以后,在内存中会出现很多内存碎片,直接影响代码的性能,GC会将内存进行整理),使得内存连续。它不会定时定量的进行回收,也就是说往往是在神不知鬼不觉,或是当它在它认识需要进行整理时才会进行回收。正因为它默默地辛勤劳动提升了使用者(编程代码)在.NET中的性能和效率。
你们也许会好奇,难道CLR里面就只有2个助手(JIR和GC)而已,显然这是不可能的。在CLR中还有其他一些帮手。
CLI 通用语言基础结构(Common Language Infrastructure,CLI)是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。CLI是.Net和CLR的灵魂,CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上,甚至还可以自己写MSIL代码在CLI上面运行。
CTS 通用类型系统 (common type system) 一种确定公共语言运行库如何定义、使用和管理类型的规范。CLR通过CTS(通用类型系统),实现严格的类型和代码验证,来增强代码鲁棒性。
CLS 公用语言规范(Common Language Specification)和CTS通用类型系统一起确保语言的互操作性。CLS是一个最低标准集,保证C#组件与其他语言组件间的互操作性,所有面向.NET的编译器都必须支持它。
CIL通用中间语言(Common Intermediate Language)也就是我们之前所说的IL/MIIL。
BCL 基础类库(Base Class Library)包含的类对许多程序有帮助,为开发者提供丰富的类。