书接上回
吃一顿饭有两种方法
1,去快餐馆买现成,服务生端上来的就是做好的菜
2,去超市买一些已经收拾好的半成品和成套的配料,买回家让老婆来烧。
这两种方式各有各的好处。
传统的非托管应用程序就象在餐馆里点菜,端上来就可以吃。我们部署的程序就是最终的二进制机器代码.
优点不必说了,缺点不少,很有可能做好的菜不适合顾客的口味,同样的一道菜,你卖给一个四川人他会觉得辣子放少了,但你卖给一个河北人就会辣死他,传统的非托管程序在部署时会遇到很多的问题,你不能保证你的程序在客户的平台上能顺利的运行,因为客户的软硬件会有着千差万别,单一的一套最终机器代码无法保证在所有的平台上运行。
另外如果一个程序是由许多模块组成的那么这些模块之间的通信必须是通过机器代码的二进制信息来进行,这会带来很大的编程难度,并会使得程序和稳定性很难得到保障。
在非托管应用程序中可执行文件(EXE)和动态链接库(DLL)中包含的是原生的机器代码。
C#程序或者说托管应用程序是如何运行的呢,C#程序运行有点象在家里自已烧菜,首先各种源料在工厂中被加工为半成品,但这些半成品是不能立即被食用的(当然你非要吃生肉,也没有人管你),回家以后让老婆把这些半成品进锅炒一下就行了。
C#源代码首先被C#编译器(CSC)编译(其实是伪编译)成一种中间语言代码(MSIL),这就是那个半成品,这也是我们部署的部分,在客户的机器上这些半成品(MSIL)将被一个叫做JIT的编译器再一次被编译并执行,在托管应用程序中的可执行文件(EXE)包含的是启动项目生成的中间语言代码(MSIL),而动态链接库(DLL)中包含的是类库项目生成的MSIL,一个启动项目可以引用其它类库项目生成的类库(有点绕口)也可以引用系统中安装的类库(现在还和using没有任何关系噢),在启动项目中有一个引用项,我们可从中看到该项目中引用的类库,并且我们可以在项目上右击鼠标-添加引用,当我们把EXE和DLL部署到客户的机器上时其实只是部署了一堆MSIL,在第一次运行时JIT(其实她就是老婆)装会把EXE和DLL中的中间代码简单的组装,并且编译,然后运行,所以EXE和DLL之间是无缝组合的,它们之间通讯是通过MSIL进行的,这样程序运行会更稳定,并且开发维护会更容易.当然效率会有一定的损失.
托管程序的执行效率主要取决于三方面,一方面就是程序员写的源代码质量,一方面就是CSC,一方面就是JIT,所以要吃上好菜就要去超市买好的半成品,并且要有一个好的老婆.
或者直接去餐馆,但餐馆里的饭菜总没有老婆烧的菜好吃,因为餐馆里的饭菜里边没有感情,而老婆烧的菜里注入了浓浓的爱(从大长今中受到的启发),即使有的时候盐放多了,那也要比在外边吃强一万倍,除非你是一个有房子的无家可归者.
http://yaotong.cnblogs.com
|
请发表评论