要想弄明白.NET程序是怎样运行的,不得不扯得远些,从机器指令讲起。

1.5.1 理解机器指令

在日常生活中,开灯关灯再常见不过了。电灯只有两种状态,不是开,就是关,如图1-44所示。

1-44 开关的状态直接影响电灯的开关

如果用0代表关的动作,1代表开的动作,那么,想想以下这个字符串的含义是什么?

0101

这个字符串翻译成人类的语言就是:

关灯(0)→开灯(1)→关灯(0)→开灯(1)

这个由0和1构成的字符串被看成了一个动作序列,给定另一个字符串,比如“1001”,则代表了另一个动作序列。当然,就开关灯而言,不可能有两个关灯(开灯)的动作连续发生(因为没有人能“关”上一个已关上的灯),因此在动作序列字符串中不应出现前后相邻的两个字符所代表的数字完全一样的情况。但这不是我们关心的,我们关注的是:这一串由0和1构成的数字序列,实际上代表了一串动作,可以称之为指令

文本框: 
图1-45 计算机的大脑——CPU
类似地,计算机中的核心是CPU(Center Processing Unit,中央处理器),如图1-45所示,它也能接收由0和1构成的指令。由于每种CPU都有自己独特的内部结构,所以,每种CPU接收的指令也不一样,这种指令称为机器指令。CPU只能执行由0和1组成的机器指令。

1.5.2 程序与编译器

由于CPU只能执行机器指令,所以,如果要编写一个程序在CPU上运行,最直接的方法就是用0和1来写。最早的计算机程序就是这么写的,那时采用穿孔纸带的方式写程序,纸带上打了许多孔,有孔的地方是“1”,没打孔的地方是“0”。

显然,如果使用这种方式编程,那么程序员一定非常辛苦。

后来,人们发明了汇编语言、高级语言(如C语言),以及现在的面向对象的语言(如Java与VB.NET),采用与英语类似的语法(当然要比一般的英语语法格式严格得多)和单词,用一种便于人类理解的方式来编程。

CPU并不懂得英语,它只认得由0和1组成的机器指令,所以,需要一种工具,由它负责把人类编写的程序翻译成CPU能懂的机器指令。这个工具,就是“编译器”。

1.5.3 .NET程序运行原理

CPU虽然是计算机的核心,但光有CPU还是不能干活的,至少还需要有地方来存放机器指令代码。这就用到了存储器,有两种存储器:外存和内存。

内存(参见图1-46)通常容量较小,存取数据的速度非常快,但一旦停电后,其中的信息会完全丢失。

外存有许多种,如光盘、U盘和硬盘(参见图1-47)等,其特点是容量大,存取速度较慢,但停电之后信息仍然存在。

人类写的程序,经过编译器转为机器指令后,一般以文件的方式保存在外存储器中,当CPU执行程序时,要先把外存储器中的指令读入到内存中。内存被分成很多块,每块都有一个惟一的地址,指令就存放在以某个特定的地址(称为入口地址)开始的内存区域中。CPU从入口地址处取出第一条机器指令,开始执行,然后再取第二条,依次类推。

图1-46 内存 图1-47 硬盘

把一个程序从硬盘上装入内存执行是一个复杂的过程,这个功能由操作系统实现,开发具体应用程序的软件工程师不需要自己动手去写这部分代码,其过程可参见图1-48。

从图1-48可以看到,程序的运行必须依赖于操作系统(如Windows和Linux),而且编译器生成的程序文件包含的是特定CPU的机器指令。由于不同CPU的机器指令不同,所以,生成的程序不能不加修改地在具有不同种类CPU的计算机上运行。

以这种方式生成的机器指令代码称为非托管代码(UnManaged Code)。非托管代码不仅不能在不同种类的计算机上执行,而且,在不同的操作系统下也不能执行。比如一个Windows应用程序就无法在Linux下运行,反之亦然。

图1-49很好地说明了非托管代码的运行原理。

1-48 程序执行过程 图1-49 非托管代码运行原理

显然,如果需要在不同的计算机和操作系统上实现同一功能,就不得不为每种操作系统和计算机各写一种代码。这显然是一种重复且低效的劳动。

程序能不能只写一次,处处运行?

完全可以,这就是目前非常红火的Java语言的设计思想。.NET也采用了这种设计思想,而且走得更远。.NET在架构设计上不仅允许.NET程序在各种操作系统和计算机上运行,而且允许在同一个程序中使用由不同的计算机语言开发出来的软件组件。

要支持跨平台和跨语言这一特性,软件工程师写的程序经过编译器生成的结果就不能是依赖于操作系统和计算机硬件的机器指令了,而必须是一种中间的、在所有操作系统和计算机硬件平台上都能执行的代码,这种代码Java称之为ByteCode(字节码),.NET称之为MSIL(微软中间语言)。

程序最终还是要靠CPU执行,所以,Java的ByteCode和.NET的MSIL仍然需要最终被翻译成CPU能执行的机器指令,这部分功能由一个运行在特定操作系统之上的软件系统来完成,这个软件系统称为VM(Virtual Machine,虚拟机)。

只需要为每种操作系统和特定的硬件平台提供一个虚拟机,就可以让同样一个程序不加修改地在不同的操作系统和硬件结构的计算机上运行。

这种运行在虚拟机之上的代码称为托管代码(Managed Code),其运行原理如图1-50所示。

文本框: 
图1-50 托管代码运行原理

绕了这么大的一个圈子,现在终于可以讲明白了,前面章节所介绍的.NET Framework,其实就是一个运行在操作系统Windows之上的软件虚拟机。使用VS .NET开发出来的程序经过编译之后,生成的可执行程序实际上包含的只是MSIL指令代码,这是一种托管代码,只能运行在.NET虚拟机之上。所以,如果某台计算机上没有安装.NET Framework,就意味着图1-50中的“虚拟机”一层不存在,.NET应用程序就无法执行。对于非Windows的操作系统,只要上面有.NET虚拟机,就可以运行.NET程序,不需要重新修改源程序并重新编译。

 

提示

在Linux下运行的.NET Framework称为MONO。这是一个开源的软件项目。可以到因特网上搜集它的信息。

1.5.4 发布.NET程序

发布程序是指将编写好的程序安装到软件最终用户的计算机上。

所有的.NET程序都是一种托管代码的程序,必须在.NET虚拟机的支持下运行,所以当需要在不同的计算机上运行NET程序时,必须确定目标计算机上安装有.NET Framework。

由于.NET程序采用了新的设计思想,.NET程序的运行不依赖于注册表,所以,只要安装好了.NET Framework,就可以把程序文件直接复制到目标计算机上运行。这是.NET给我们带来的软件部署的方便性。

扩充阅读

如何获取更多的.NET资料

在安装VS .NET时,建议同时安装完整版的MSDN随机文档(参见图1-51),VS .NET 2003版包括三张光盘,包含了.NET Framework所提供的所有技术文档,这是在开发中最常用到的信息源。

图1-51 VS .NET随机文档——MSDN

也可以直接访问MSDN网站(参见图1-52)获取最新的开发资源。MSDN网站由微软公司直接维护,是最全、最权威的微软技术信息源。其网址为http://msdn.microsoft.com。

微软中国公司提供了中文版MSDN站点(参见图1-53),网址为http://www.microsoft.com/ china/msdn。

除了MSDN,一些专业的.NET技术网站和论坛也提供了许多有价值的信息,图1-54是著名的开源技术网站CodeProject(http://www.CodeProject.com),其上有众多的技术专家和软件开发爱好者撰写的技术文章,完全开放源代码。

.NET还有一个网上社区(http://www.GotDotNet.com),可以在这里与全世界的.NET开发者讨论许多问题(参见图1-55)。

许多技术论坛往往是解决开发中实际问题的好去处,图1-56是国内最大的程序员论坛——CSDN(http://www.csdn.net),当有什么疑难问题时,去论坛看看,往往有意想不到的收获。

图1-52 英文MSDN网站 图1-53 中文MSDN网站

1-54 开源技术网站CodeProject 图1-55 .NET Framework网上社区

国内MVP(微软最有价值专家)集中的网站——博客堂(http://blog.joycode.com),其中经常可以看到微软最新的技术动向,以及MVP们的各种心得和体会(参见图1-57)。

1-56 国内最大的技术论坛——CSDN 图1-57 博客堂

除了上述这些专业信息源,还可以使用目前世界上使用最多的搜索引擎Google(参见图1-58)去查找.NET资源(http://www.google.com)。

国内也有一个较好的搜索引擎——百度(http://www.baidu.com),参见图1-59。

图1-58 全世界最著名的搜索引擎——Google 图1-59 国内搜索引擎——百度

因特网是个无穷无尽的资源,只要肯花时间,几乎可以找到任何您所需要的信息,而掌握搜索信息的技巧,已成为信息时代必备的基本技能之一。

posted on 2009-03-30 15:10  一天进步一点  阅读(2188)  评论(2编辑  收藏  举报