前段时间从网上看到ASP和ASP.NET之间的区别中有这样一句话“asp是解释运行,.net是编译执行”,从网上有深入查了查觉得有些收获,整理了一下就发上来了。
计算机并不能直接地接受和执行用高级语言编写的源程序,源程序在输入计算机时,通过"翻译程序"翻译成机器语言形式的目标程序,计算机才能识别和执行。这种"翻译"通 常有两种方式,即编译方式和解释方式。
编译方式是指利用事先编好的一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户将高级语言编写的 源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得 结果。编译程序是将所有的内容一次性全部翻译,再交由计算机执行。如编译程序一般会生成一个如*.exe,与低级语言等价的可执行程序(低级语言的目标程序,汇编程序),这个可执行程序就是编译好的目标程序,计算机再执行这个程序,将其整个翻译成机器语言。
解释方式是指源程序进入计算机后,一般是读一句源程序,翻译一句,执行一句,不产生目标代码。如PASCAL、FORTRAN、COBOL等高级语言执行编译方式;BASIC语言则以执行解释方式为主;而PASCAL、C语言是能书写编译程序的高级程序设计语言。
编译程序与解释程序最大的区别之一在于前者生成目标代码,而后者不生成;此外,前者产生的目标代码的执行速度比解释程序的执行速度要快;后者人机交互好,适于初学者使用。用COBOL、FORTRAN等语言编写的程序考虑到执行速度一般都是编译执行。
一般来说,解释的速度比编译慢,编译是一次性开销,解释每次运行都引起额外开销。
.NET的编译勉强算是编译,但不是传统意义上的编译。应该说是个更高级的解释过程。
编译:编好程序选择生成时,从 源码编译到中间语言(IL),这个中间语言是.NET自已的一种语言格式,虽然它也是 EXE,但它并非直接可以执行的二进制代码,而是一种比源码更为紧凑的程序代码。
解释:软件执行的时候,系统会自动加载 .NET Framework 对中间语言形式的 EXE 进行解释运行。
它的过程分两步,首先是源代码到中间代码的“编译”,这一步严格说不是编译,只是将源代码翻译成了中间代码,但是形式上像是传统的编译-生成了可执行文 件。但是这个可执行文件并不是真正的可执行文件,需要.NET框架在你运行它的时候再及时翻译为CPU机指令,它的改进在于这个及时编译比传统的解释方式性能更好,因为程序中的指令不是每次运行都解释,而是在 程序首次运行时一次性编译(解释),只要程序没有退出,解释的过程就不再发生。
以下是对公共语言运行时(CLR)的一些解释。
1.2 .NET Framework的架构
现在的计算机编程语言的执行方式分为两种,一种是编译执行,一种是解释执行。编译执行是指源程序代码先由编译器编译成可执行的机器码,然后再执行; 解释执行是指源代码程序被解释器直接读取执行。编译执行的编程语言我们常见的有C、C++、VB等,解释执行的有Python、Java Script、HTML等编程语言。编译执行和解释执行各有优缺点,比如我们说编译执行的语言通常执行效率高,而解释执行的语言通常可以灵活的跨平台,下 图(图1.3)展现了编译执行和解释执行的原理:
![]() |
图1.3 程序执行原理图 |
对于计算机来讲它只是一台机器,它只能认识0101011这样的二进制机器指令。编译执行一次性将高级语言源程序编译成二进制的可执行指令。而解释 执行是由该语言(如HTML)运行环境(如浏览器)读取一条该语言的源程序,然后转变成二进制指令交给计算机执行。如果把高级语言源代码比作一本外文书 籍,那么编译执行就是一次性翻译成中文,然后你再看;而解释执行就是你拿着个翻译机,读一行翻译一行的看。这里要注意的是,我们说编译执行的程序,源代码 需要一个叫编译器的装置编译成操作系统可执行的机器码,形式比较统一,而解释执行就不一样了,它的形式和方法各异,我们说网页HTML代码它是靠浏览器解 释执行的,而可以在Office中使用的脚本语言VBScript却是由Office来负责运行的。
1.2.1 什么是公共语言运行时(CLR)
当然,上面这些都是比较传统的程序代码执行方式,从Java语言开始,一种新的程序语言执行方式产生了,这就是“中间码+虚拟机”执行机制。这种执 行方式,程序语言源代码需要被编译成一种特殊的中间码,这种中间码是不能直接执行的,它需要一个叫“虚拟机”的装置来管理和执行,可以是解释执行也可以是 编译执行。因为“虚拟机”可以参与和管理程序代码的执行,因此解决了很多传统编译语言一些致命的缺点,如垃圾内存回收、安全性检查等。也是因为如 此,.NET框架也采用了此种语言执行方式,这里管理和执行中间码“虚拟机”在.NET框架中就是公共语言运行时(CLR),它负责管理和执行由.NET 编译器编译产生的中间语言代码。右图(图1.4)展示了.NET程序的执行原理:
![]() |
整个执行过程是这样的,首先我们在开发环境Visual Studio .NET中编写C#代码,然后这些源代码被Visual Studio .NET中内置的C#编译器编译成中间语言代码(中间语言是一种类似于汇编的程序语言,还不是机器码,我们后面会专门介绍),最后中间语言代码由操作系统 中.NET Framework的组件CLR管理和执行。另外,从上图你也可以看出,公共语言运行时的另外一个作用是可以轻松地实现跨平台。当然,条件是要在操作系统 上安装.NET Framework,这个跨语言的原理是和Java一样的,安装了语言运行时的操作系统就可以识别和运行中间语言代码。值得一提的是,虽然微软自己并不提 倡跨平台(跨平台会影响Windows操作系统的市场垄断),但现在已经出现了在Linux操作系统中运行和编辑.NET程序的平台,就是Mono平台。 该平台包括有C#编译器、公共语言运行时以及相关的一套.NET类库。Mono平台可使开发者开发的.NET应用程序不仅能在Windows上运行,也能 在任何支持Mono的操作系统上运行,包括现有的Linux和UNIX操作系统。
关于公共语言运行时还要注意,. NET里面的CLR和Java里面的虚拟机JVM是不同的,我们说Java的虚拟机一般是解释执行的,而CLR是编译执行,是在应用程序第一次被调用时一 次性编译成机器码再执行,这样做的好处一个是尽可能的避免了解释执行所带来的效率降低的问题;另外可以做到充分利用本机资源,CLR可以针对本地的资源进 行优化编译,这个特性人们考虑可能在将来会使.NET代码的执行效率甚至超过C++,因为C++编译器是通用的,并没有照顾到不同计算机本地资源的不同。