分类目录

链接

2011 年 12 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
深入.net实质讨论系列(三)
.NET 暂无评论 阅读(1,641)

1.2 公共语言运行库

.NET Framework 的核心是其运行库的执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR的控制下运行的代码称为托管代码(managed code)。

但是,在CLR执行编写好的源代码之前,需要编译它们(在C#中或其他语言中)。在.NET中,编译分为两个阶段:

(1) 把源代码编译为Microsoft中间语言(IL)。

(2) CLR把IL编译为平台专用的代码。

这个两阶段的编译过程非常重要,因为Microsoft中间语言(托管代码)是提供.NET的许多优点的关键。

托管代码的优点

Microsoft中间语言与Java字节代码共享一种理念:它们都是低级语言,语法很简单(使用数字代码,而不是文本代码),可以非常快速地转换为内部机器码。对于代码来说,这种精心设计的通用语法,有很重要的优点。

1. 平台无关性

首先,这意味着包含字节代码指令的同一文件可以放在任一平台中,运行时编译过程的最后阶段可以很容易完成,这样代码就可以运行在特定的平台上。换言之,编译为中间语言就可以获得.NET平台无关性,这与编译为Java字节代码就会得到Java平台无关性是一样的。

注意.NET 的平台无关性目前只是一种可能,因为在编写本书时,.NET 只能用于Windows平台,但人们正在积极准备,使它可以用于其他平台(参见Mono项目,它用于实现.NET的开放源代码,参见http://www.go-mono.com/)。

2. 提高性能

前面把IL和Java做了比较,实际上,IL比Java字节代码的作用还要大。IL总是即时编译的(称为JIT编译),而Java字节代码常常是解释性的,Java的一个缺点是,在运行应用程序时,把Java 字节代码转换为内部可执行代码的过程会导致性能的损失(但在最近,Java在某些平台上能进行JIT编译)。

JIT编译器并不是把整个应用程序一次编译完(这样会有很长的启动时间),而是只编译它调用的那部分代码(这是其名称由来)。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样在下次运行这部分代码时,就不需要重新编译了。4

第1章 .NET体系结构Microsoft认为这个过程要比一开始就编译整个应用程序代码的效率高得多,因为任何应用程序的大部分代码实际上并不是在每次运行过程中都执行。使用JIT编译器,从来都不会编译这种代码。

这解释了为什么托管IL代码的执行几乎和内部机器代码的执行速度一样快,但是并没有说明为什么Microsoft认为这会提高性能。其原因是编译过程的最后一部分是在运行时进行的,JIT 编译器确切地知道程序运行在什么类型的处理器上,可以利用该处理器提供的任何特性或特定的机器代码指令来优化最后的可执行代码。

传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。这是因为传统的编译器是在发布软件之前编译为内部机器可执行的代码。即编译器不知道代码所运行的处理器类型,例如该处理器是x86兼容处理器还是Alpha处理器,这超出了基本操作的范围。例如Visual Studio 6为一般的奔腾机器进行了优化,所以它生成的代码就不能利用奔腾 III处理器的硬件特性。相反,JIT编译器不仅可以进行Visual Studio 6所能完成的优化工作,还可以优化代码所运行的特定处理器。

3. 语言的互操作性

使用IL不仅支持平台无关性,还支持语言的互操作性。简而言之,就是能将任何一种语言编译为中间代码,编译好的代码可以与从其他语言编译过来的代码进行交互操作。

那么除了C#之外,还有什么语言可以通过.NET进行交互操作呢?下面就简要讨论其他常见语言如何与.NET交互操作。

(1) Visual Basic 2005

Visual Basic 6在升级到Visual Basic .NET 2002时,经历了一番脱胎换骨的变化,才集成到.NET Framework的第一版中。Visual Basic 语言对Visual Basic 6进行了很大的演化,也就是说,Visual Basic 6并不适合运行.NET程序。例如,它与COM的高度集成,且只把事件处理程序作为源代码显示给开发人员,大多数后台代码不能用作源代码。另外,它不支持继承,Visual Basic使用的标准数据类型也与.NET不兼容。

Visual Basic 6在2002年升级为Visual Basic .NET,对Visual Basic进行的改变非常大,完全可以把Visual Basic当作是一种新语言。现有的Visual Basic 6代码不能编译为VisualBasic 2005代码(或Visual Basic .NET 2002和2003代码),把Visual Basic 6程序转换为VisualBasic 2005 时,需要对代码进行大量的改动,但大多数修改工作都可以由 Visual Studio2005(Visual Studio的升级版本,用于与.NET一起使用)自动完成。如果把Visual Basic 6项目读到Visual Studio 2005中,Visual Studio 2005就会升级该项目,也就是说把Visual Basic6源代码重写为Visual Basic 2005源代码。虽然这意味着其中的工作已大大减轻,但用户仍需要检查新的Visual Basic 2005代码,以确保项目仍可正确工作,因为这种转换并不十分完美。

这种语言升级的一个副作用是不能再把Visual Basic 2005编译为内部可执行代码了。Visual Basic 2005只编译为中间语言,就像C#一样。如果需要继续使用Visual Basic 6编写程序,就可以这么做,但生成的可执行代码会完全忽略.NET Framework,如果继续把VisualStudio作为开发环境,就需要安装Visual Studio 6。

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:深入.net实质讨论系列(三) | Bruce's Blog

发表评论

留言无头像?