公共语言运行库(CLR)
.NET FrameWork的核心是其运行库执行环境,称为公共语言运行库(CLR)或.NET运行库。通常
将在CLR控制下运行的代码称为托管代码(mamaged code)。
但是,在CLR执行编写好的源代码(在C#中或其他语言中编写的代码)之前,需要编译它们。
在.NET中,编译分为两个阶段:
(1)把源代码编译为Microsoft中间语言(IL)。
(2)CLR把IL编译为平台专用的代码。
这个两阶段的编译过程非常重要,因为Microsoft中间语言是提供.NET的许多优点的关键。
Microsoft中间语言与Java字节码共享一种理念:它们都是低级语言,语法很简单(使用数字代
码,而不是文本代码),可以非常快速地转换为本地机器码。对于代码,这种精心设计的通用语法有
很重要的优点:平台无关性、提高性能和语言的互操作性。
平台无关性
首先,这意味着包含字节码指令的同一文件可以放在任一平台中,运行时编译过程的最后阶段
可以很轻松地完成,这样代码就可以运行在特定的平台上。换言之,编译为中间语言就可以获得MT
平台无关性,这与编译为Java字节码就会得到Java平台无关性是一样的。
注意.NET的平台无关性目前只是停留在理论范畴,因为在编写本书时,MT的完整实现只能
用于Wmdows平台,但是人们正在积极准备,使它可以用于其他平台。
提高性能
前面把IL和Java做了比较,实际上IL比Java字节码的作用还要大。IL总是即时编译的(称为JIT
编译),而Java字节码常常是解释性的。Java的一个缺点是,在运行应用程序时,把Java字节码
转换为内部可执行代码的过程会导致性能的损失(但在最近,Java在某些平台上能进行JIT编译)。
JIT编译器并不是把整个应用程序一次编译完(这样会有很长的启动时间),而是只编译它调用的
那部分代码(这是其名称由杓。代码编译过一次后,得到的本地可执行程序就存储起来,直到退出
该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。Mhmoa认为这个过程要
比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在
每次运行期间都执行。使用JIT编译器,从来都不会编译这种代码。
这解释了为什么托管IL代码几乎和本地机器代码的执行速度一样快,但是并没有说明为什么
Microsoft认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,JIT编译器确切
地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令
来优化最后的可执行代码。
传统的编译器会优化代码,但它们的优化过程是独立于运行代码的特定处理器的。这是因为传
统的编译器是在发布软件之前编译为本地机器可执行的代码。即编译器不知道运行代码的处理器的
类型,例如该处理器是兼容xB6的处理器还是Alpha处理器,这超出了基本操作的范围。
语言的互操作性
使用IL不仅支持平台无关性,还支持语言的互操作性。简而言之,就是能将任何一种语言编译
为中间语言,编译为中间语言的代码可以与从其他语言编译过来的代码进行交互操作。
COM和COM+
从技术上讲,COM和COM+并不是面向MT的技术,因为基于它们的组件不能编译为IT但
如果原来的COM组件是用C#编写的,那么使用托管C#在某种程度上可以这么做。但是,COM+
仍然是一个重要工具,因为其特性没有在.NET中完全实现。另外,COM组件仍可以使用--.NET
集成了COM的互操作性,从而使托管代码可以调用COM组件,COM组件也可以调用托管代码。
一般情况下,把新组件编写为,NET组件,大多是为了方便,因为这样可以利用.NET基
类和托管代码的其他优点。