编译系统

文章来源:  |  发布时间:2009-09-02  |  【打印】 【关闭

  

为了能在计算机上运行高级语言编写的程序,就必须将高级语言书写的程序翻译成等价的机器语言程序或汇编语言程序,这种处理系统称为编译系统。

编译系统以高级语言书写的程序作为输入,称之为源程序(source program);而以机器语言或汇编语言表示的程序作为输出,称为目标程序(target program)。其最终任务是产生一个可在具体计算机上执行的目标程序。执行目标程序将是按照用户在源程序中所规定的意图,加工初始数据,算出所需结果或完成所希望的加工处理任务。源程序中的每个语句与目标程序中的指令通常是一对多的对应关系,所以编译系统的实现算法较为复杂。

编译系统的工作过程是先分析,后综合。必须先分析源程序。源程序分析是经过词法分析、语法分析和语义分析三个步骤完成的,目的是检查源程序的语法和语义的正确性,把源程序分解成一系列的基本组成成分。为此,编译系统要在分析阶段建立符号表、常数表和中间语言程序等数据结构,以便在分析和综合时引用和加工。综合过程通常包括存储分配、代码优化和代码生成等几个步骤,目的是为源程序的常数、变量、数组、函数等数据结构分配存储空间,重新组织分析阶段产生的基本组成成分,将其综合成高效的可执行的目标程序。

编译系统在逻辑上由分析和综合两大部分组成,并可进一步细分为词法分析、语法分析、语义分析、存储分配、代码优化和代码生成六个相继的逻辑步骤。具体设计和实现编译系统时,通常是按照从头到尾扫视源程序(或其等价的中间语言程序)的遍数来规划编译系统的结构,安排相关逻辑步骤的工作。

编译系统的一般结构如图所示。

 

  例如,可以把词法分析作为第一遍;语法分析和语义分析作为第二遍;存储分配和代码优化作为第三遍;代码生成作为第四遍。为了适应较小的内存加工空间或提高目标程序质量,也可以把一个逻辑步骤的工作分为几遍去完成。例如,代码优化可划分为代码优化准备和实际代码优化两遍来完成,也有分为源代码优化和目标代码优化的。究竟采用多少遍的编译结构,应根据计算机的规模大小、程序设计语言的繁简和特点、目标程序的质量要求,以及设计任务时间长短和人员的多少等具体情况而定。

  对于跨平台网络语言Java编写的程序,先创建一个以java为后缀的文件,编译后得到一个以class为后缀的字节码文件,该文件是由Java虚拟机指令所组成,然后由Java虚拟机解释执行或编译。

  源程序可以交叉编译,即在一台计算机上编译出用于另一台计算机的目标程序,这在研制新计算机时常采用。源程序的不同部分还可分离编译。

  编译阶段所输出的代码除了需引用外部数据和子程序的地方,其余的可执行程序几乎都以最终形式出现。这些代码中的不完全处都被详细列入由编译系统所生成的附加装载表中。然后由连接装入程序(或连接编辑程序)将各种已编译的代码段放入内存之中,亦在需要的时候运用附加装载表,通过将数据和子程序地址填入代码中,将它们正确地连接,从而产生最终可执行程序。

   软件人员进行程序开发时通常还需要一些其它工具,如:编辑程序,连接程序,调试程序等等。编译系统与这些程序设计工具一起构成所谓的程序设计环境。其中,编译系统起着核心的作用,连接程序、调试程序、程序分析工具直接依赖于编译系统新产生的结果,而其它工具的构造也常常要用到编译的原理、方法和技术。