什么是.NET架构

 

什么是.NET架构

.NET架构主要分为3部分

FCL – Framework Class Library

CTS – Common Type System (其中包括Common Language Specification

CLR – Common Language Runtime

这三层从高到底,越高代表越接近应用程序,越低代表越接近内核。

.NET最主要的思想是从JVM Java Virtual Machine)得来的,换句话说,就是使用一种“中间层”来代替原本的PE可执行文件格式。CILCommon Intermediate Language)一般来说都是已经编译好的,是用JITJust-In-Time)动态执行。

CTS层提供一般常用的数据类型,而其中的CLS模块包含所有的.NET应用程序都需要共享的数据类型。

具体来说,从最底层的CLR来看,CLR是所有.NET应用程序的引擎。主要包括由jitterJust-In-Time Compiler)生成的CIL代码,垃圾回收器(Garbage Collector,不知道中文名是什么)CTS与异常处理机制。

CLR中最重要的一点就是受控代码(Managed Code),在受控代码的控制下,程序中永远不会出现失去胡乱引用的指针。

但受控代码绝对不等于解释语言,受控代码只是为了保证在运行程序是内存与类型的安全。

所有的.NET应用程序都会被编译成CIL(原先CIL被命名为MSIL – MicroSoft Intermediate Language)。实际上,在.NET编译后同样会生成PE可执行代码,不同的是这种PE格式在某一个位做了标示,用来代表这个文件包含了CIL.NET metadata。这些PE文件的所有对象的入口处都会有一段代码用来呼叫JIT模块,从而在代码执行前动态编译当前执行的方法(Method,对应Class),生成对象代码后执行编译后的代码。

这样看来,我们很显然就能够看出这种方法的优缺点。

缺点:由于第一次执行需要编译,所以会需要消耗时间。

但是这种被消耗的时间相当短,并且只有在第一次执行时才会消耗时间。

优点:由于是在CIL之上动态编译执行,因此在不同的平台上(比如XP2003)会根据需要做相应的优化,从而提高执行效率

同时,对于不经常用到的模块在编译之前并不会占用内存。在大型的项目中这点可以节约不少的资源。

内存与垃圾回收机制:

对于一个C或者C++的程序,最令人头疼的就是当调试完成后调试程序汇报存在内存泄路。而.NET的垃圾回收机制可以有效地克服这个问题。同时在保证内存安全释放的前提下,.NET的垃圾回收机制的效率也是相当优化的。

首先我们来看内存回收机制的效率,这也是所有希望使用.NET开发系统的人们最为关心的事情。

.NET的内存回收机制实际上是建立在一个法则之上的。对于一个应用程序,大部分内存都会在被分配后很短的时间内释放,剩下的那部分中绝大部分可能会保持到几秒钟至分钟级别,在其次的一部分则看起来会被终身保留在内存中。

因此,.NET的内存回收机制也采用三段式。

当系统分配了足够多的内存(一般是由CPU的二级缓存的大小决定的),当.NET决定对内存进行整理的时候,.NET会对最近分配的块进行检查,也就是第0级。实际上,.NET只需要注意依然被使用的内存。从而将这些内存物理地移动到分区的最下方,同时标注这些内存为第一级。这样,当下次再作清理的时候,这些被标注为第一级的内存不会被检查到。而此时,由于所有正在被使用的内存被移到了分区的下方,剩下的则是可以使用的剩余内存了。

只有当检查完第0级后发现内存依然不够,这时系统会对第一级做内存回收。

同理,回收后依然被使用的内存移动到分区最下方,标注为第二级,剩下的也就是可以被使用的内存了。

当第一级回收完毕后系统发现依然需要更多的内存,这时才会对第二级进行清理。不过第二级不会再继续提高到第三级,这也就是我们为什么说它是“三段式”。

现在我们再来详细地介绍一下CTS。我们知道当一个应用程序运行在.NET平台上时,不管它是使用什么语言编写的,他们都有相同的特性:能够被JIT动态编译执行。

这样就存在一个问题。有一些类可能是由一种语言编写的,却在另一种语言中得到应用。怎么能够让不同的类跨越语言,比如一个类原本是由C#写的,然后在VB中得到了进一步的封装与应用,最后这个被封装的类用于Delphi的一个组件中。

因此,保证不同语言编写出的类不会被错误地强制转换是CTS最主要的职责之一。

就好像Delphi一样,.NET中所有的类都是从一个基本类System.Object派生出来的。因此,不同的语言需要提供的只是对一个个类的引用与继承。

对于接口的提供,.NET由于使用内存回收机制而不是用引用计数。所谓的引用计数就是指由平台对每一个所引用到的接口保存一个计数器。计数器的数值表示了当前有多少对象在使用它。当计数器为0时,这个接口或者对象所使用的内存会被回收。

取消了计数器可以为应用程序带来更快的速度与更简洁的架构,但是同时会减弱程序对非法引用的保护性。但是如今.NET只提供这一种方法,也许将来可能会提供两种接口的编写方式吧。

框架:框架是.NET架构中最上方的一层,也是直接面向程序员编写程序的这一层。比如C#提供了上千个类型用于程序的开发(实际上我们能够接触到的远没有这么多,这里的上千个包括了微软内部使用的类)

你可能感兴趣的:(。net,.net,cil,delphi,语言,microsoft,compiler)