Wrox的C#高级编程第三版第一部分第一章(1~9页)

** 第一章 ** ** .NET ** ** 架构 ** ** **

** ** 阅读本书你会发现,本书通篇都强调, C# 语言决不该被孤立的看待,它必须与 .NET Framework 一起考虑。 C# 编译器是以 .NET 为特定目标的,所以这就意味着用 C# 写出来的代码必须运行在 .NET Framework. 的支持上。这样,对 C# 就有两个重要的推论:

? C# 的体系结构和方法论反映了 .NET 的根本方法论。

? 在许多情况下, C# 的许多专用语言特性依赖于 .NET 的特性或者 .NET 基础类。

由于这种依赖关系,在开始 C# 编程之前,理解 .NET 的体系结构和方法论是重要的。这也正是本章的目的。

我们首先会了解一下当所有以 .NET 为目标架构的语言(包括 C# )被编译和运行时都发生了什么。一旦我们有了大致的了解,我们将更加详细地了解一下 _ Microsoft Intermediate Language _ (MSIL or simply IL) , .NET 上面所有的语言最终都会被编译为这种汇编语言。特别的,我们将了解一下 IL 、 _ Common Type System _ (CTS) 和 _ Common Language Specification _ (CLS) 是怎样共同作用使得 .NET 下面的语言可以协同工作的。我们也要讨论各种语言( Visual Basic 和 C++ )怎样适合 .NET 的。

了解完这些后,我们将要继续了解一下 .NET 的其他特性,包括程序集、命名空间和 .NET 基础类。最后结束这一章之前我们要像 C# 开发人员一样对可以创建的应用程序的种类做一个大致的了解。

** 1.1 ** ** C# ** ** 与 ** ** .NET ** ** 的关系 ** ** **

相比较其他语言来说, C# 是一种新的编程语言,并且以下两个方面体现了他的重要性:

? 它是专门为微软 .NET 框架(一个为了开发、部署和执行分布式应用软件而设计的功能丰富的平台)设计的。

? 它是一种基于现代面向对象设计方法的语言,在他设计时,面向对象原则已经得到显著应用 20 年之久,而且微软吸收了所有这些面向对象语言的经验。

一个重要的问题是要弄明白 C# 本身就是一种语言。尽管它是设计来产生 .NET 环境下的代码的,但是它不是 .NET 的一部分。还有一些特性 .NET 支持,但是 C# 并不支持,而且可能更令你惊奇的是,还有一些 C# 语言的特性 .NET 竟然不支持!(例如,一些运算符重载)

但是,因为 C# 语言是用于 .NET 的,所以对我们来说如果我们想要用 C# 开发出高效的软件,了解 .NET Framework 就是重要的。因此,在这一章,我们将要花些时间迅速透过表层来观察一下 .NET 。好,我们开始吧!

** 1.2 ** ** 公共语言运行时 ** ** **

** ** .NET Framework 的核心是运行时执行环境,其被大家称为公共语言运行时 (CLR) 或者 .NET 运行时。在 CLR 的控制下运行的代码常常本称作托管代码。

** ** 但是,在被 CLR 执行之前,所有我们开发的源代码(用 C# 或者其他的语言)都需要被编译。这样的编译需要两个步骤:

1. 将源代码编译为中间语言( IL ) 代码

2. 由 CLR 将中间语言代码编译为特定平台上面的代码

这两步编译过程是非常重要的,因为中间语言( IL ) 的存在正是 .NET 众多优点的关键。好,让我们来看看为什么。

** 1.2.1 ** ** 托管代码的优点 ** ** **

** ** Microsoft 中间语言与 Java 字节码共享一种思路,他们都是一种语法简单的低级语言(建立在数字代码基础上,而不是文本代码),可以被快速的翻译为本地机器码。代码有这样设计良好并且通用的语法是意义重大的优点。

** 1.2.1.1 ** ** 平台无关性 **

** ** 首先,这就意味着包含字节代码指令的相同的文件可以被部署在任何的平台,在运行时编译过程的最后一个阶段可以很容易的完成,所以代码可以运行在特定的平台上。换句话说,源代码被编译成中间语言使得我们可以获得 .NET 的平台无关性,这和在 Java 平台上源代码被编译为 Java 字节码以获得平台无关性的道理是一样的。

你应该注意到 .NET 的 这种平台无关性目前还是理论上的,因为在本书写作的时候,还只有在 Windows 平台上才完全实现了 .NET 。但是,已经有一个部分实现的 .NET (参见 Mono 项目,一个正在致力于建立于开源平台之上的 .NET ,具体请访问 www.go-mono.com/

** 1.2.1.2 ** ** 性能改进 **

** ** 尽管前面和 Java 作了比较,但是实际上中间语言( IL )比 Java 字节码更有野心。 IL 总是即时编译(被称为 JIT 编译),然而 Java 字节码常常是解释性的。像 Java 那样解释编译的一个缺点是,在运行时,将 Java 字节码翻译为本地可执行的代码这个过程导致了性能的损失(这里不包括最近新加入的 Java 平台,有些特定的 Java 平台已经实现了 JIT 编译)。

并不是一次就将整个应用程序编译(那样的话导致应用程序在启动的时候变得很慢), JIT 仅仅是简单的将需要用到的一部分代码编译(就像他的名字, 即时 编译)。当代码一旦被编译完成后,这些代码就会被作为本地可执行的结果保存下来直到应用程序退出。所以,当这一部分代码再次被调用的时候不需要再次编译。 Microsoft 认为这个过程的效率比一开始就编译整个应用程序的代码要高得多。因为实际上每次运行大多数部分的应用程序代码都被执行的可能性是不大的。采用这种 JIT 编译器,这样的代码将永远不会被编译。

这就解释了我们为什么认为托管 IL 代码执行起来就像是执行本机代码一样快。但是,这并没有说明为什么 Microsoft 认为我们将会获得性能的提高。性能获得提高的一个原因是,当最后一个编译阶段在运行时发生时, JIT 编译器已经确切的知道了程序将要运行于的处理器类型。这就意味着编译器可以优化最后的可执行代码以便利用特定处理器所带来的任何特性和特定的机器代码指令。

传统的编译器也会优化代码,但是它仅仅是完成了与程序将要运行于的特定的处理器无关的优化。这是因为传统的编译器是在软件装载之前将源代码编译为本地执行代码的。这就意味着在编译之时编译器并不知道软件将要运行于的处理器类型,例如究竟是会运行在 x86 兼容处理器上还是 Alpha 处理器上。比如, Visual Studio 6 就是针对普通的奔腾处理器作了优化,所以这也意味着它所产生的代码无法利用 Pentium III 处理器的硬件特性。相反, JIT 除了可以完成 Visual Studio 6 所完成的优化工作之外,还可以针对软件将要运行于的特定处理器做优化。

** 1.2.1.3 ** ** 语言互操作性 ** ** **

** ** IL 的作用不仅仅是赋予了平台无关性,它还促进了语言互操作性。简单的说,你可以将任何一种语言的代码编译为 IL ,而且这个编译好了的代码可以和任何其他的语言编译成的 IL 进行交互。

** ** 现在你或许想要知道除了 C# 之外还有什么语言可以跟 .NET 进行交互,是吗?好,那么就让我们简要的讨论一下究竟其他的语言是怎么使自己适合 .NET. 的。

** Visual Basic .NET **

从 Visual Basic 6 升级到最新的 Visual Basic.NET , Visual Basic 经历了一番彻底的改造。从最近几年 Visual Basic 6 的发展情况来看,它并不是一个适合运行于 .NET <SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-family: Palatino-Roman; mso-ascii-font-family: Palatino-Roman; mso-hansi-font-family: P

Published At
Categories with Web编程
Tagged with
comments powered by Disqus