解释性的程序和编译性的程序的执行过程

计算机只能执行包含机器指令(也称为机器代码)的程序,不能直接执行我们编写的程序。用高级语言编写的程序基本上有两种执行方式,在大多数情况下,一种语言会选择其中一种执行方式。例如,用BASIC语言编写的程序通常是解释性的,也就是说另一个称为解释器的程序会检查BASIC源代码,确定该程序要做什么,再让计算机完成这些动作。
而C++是一种编译语言。在执行C++语言之前,必须用另一个程序(即编译器)把它转换为机器语言。编译器会检查C++程序,并生成机器指令,以执行源代码指定的动作
使用解释性语言,执行过程是间接的,也就是说,每次执行程序是,都需要确定源代码的意图。因此,这种语言比编译语言的对应程序的执行速度要慢的多,有事要慢100倍。

这个规则的例外是JAVA,由于JAVA主要用于不同计算机之间移植,以及用在Internet上,所以它基本上是一种解释性的语言。尽管如此,还有一种just-in-time编译器可以在执行过程中,为JAVA源代码生成对应的机器码,从而大大提高了执行速度。


从C++源代码中创建可以执行的程序模块需要两个过程。第一步是编译器把每个.cpp文件转换为对象文件,其中包含了与源文件内容对应的机器码。第二步是链接程序把编译器生成的对象文件合并到包含完整可执行程序的文件中。

 编译器把每个源文件看作一个独立的实体,为每个.cpp文件生成一个对象文件。然后在链接步骤中,把所有程序的对象文件和必要的库函数(库例程)组合起来,生成可执行文件。

源文件的编译过程包含两个阶段,而它们之间的转换是自动的。第一阶段是预处理阶段,在正式的编译阶段之前进行,预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。

这个编译前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统的限制。一个环境需要的代码和另一个环境需要的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以吧用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。

编译器为给定的文件输出的是机器代码,执行这个过程需要较长时间。在对象文件之间并没有建立任何连接。对应于某个源文件的对象文件包含有其它源文件中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。同样,也没有建立同库函数的链接。实际上,这些函数的代码并不是文件的一部分。这些工作使用链接程序(有时也称为链接编辑器)完成的。


链接程序把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的库函数的代码。这是连接程序的一种简化表示,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立的。实际上有些链接是动态的,即这些链接是在程序执行时建立的。

链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。动态建立的函数之间的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种可执行模块——动态链接库或共享库。动态链接库中的函数链接是程序调用函数时才建立的,在程序调用之前,该链接是不存在的。

动态链接库有几个重要的优点。一个主要的优点是动态链接库中的函数可以在几个并行执行的程序之间共享,这将节省相同函数占用的内存空间。另一个优点是在调用其中的函数之前是不会加载到内存中的。也就是说,如果不使用给定动态链接库中的函数,该动态链接库就不会占用内存空间。动态链接库是与操作系统紧密相关的一个系统功能。

 

 

2009-05-2520:14:45

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章