编译程序有哪些主要构成成分?它们各自的主要功能是什么?
编译过程分为分析和综合两个部分,并进一步划分为词法分析、语法分析、语义分析、代码优化、存储分配和代码生成等六个相继的逻辑步骤。这六个步骤只表示编译程序各部分之间的逻辑联系,而不是时间关系。
编译过程既可以按照这六个逻辑步骤顺序地执行,也可以按照平行互锁方式去执行。在确定编译程序的具体结构时,常常分若干遍实现。对于源程序或中间语言程序,从头到尾扫视一次并实现所规定的工作称作一遍。每一遍可以完成一个或相连几个逻辑步骤的工作。
例如,可以把词法分析作为第一遍;语法分析和语义分析作为第二遍;代码优化和存储分配作为第三遍;代码生成作为第四遍。
反之,为了适应较小的存储空间或提高目标程序质量,也可以把一个逻辑步骤的工作分为几遍去执行。例如,代码优化可划分为代码优化准备工作和实际代码优化两遍进行。
扩展资料
从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。
源程序中的单词符号经扫描器分析,一般产生二元式:单词种别;单词自身的值。单词种别通常用整数编码,如果一个种别只含一个单词符号,那么对这个单词符号,种别编码就完全代表它自身的值了。若一个种别含有许多个单词符号,那么,对于它的每个单词符号,除了给出种别编码以外,还应给出自身的值。
词法分析器一般来说有两种方法构造:手工构造和自动生成。手工构造可使用状态图进行工作,自动生成使用确定的有限自动机来实现。
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。编译程序的语法规则可用上下文无关文法来刻画。
参考资料来源:百度百科-编译程序
分析和综合时所用的主要数据结构,包括符号表、
常数表和中间语言程序。
符号表由源程序中所用的标识符连同它
们的属性组成,
其中属性包括种类
(如变量、
数组、
结构、
函数、
过程等)、类型(如整型、实型、字符串、复型、标号等),以
及目标程序所需的其他信息。常数表由源程序中用的常数组成,
其中包括常数的机内表示,
以及分配给它们的目标程序地址。
中
间语言程序是将源程序翻译为目标程序前引入的一种中间形式
的程序,
其表示形式的选择取决于编译程序以后如何使用和加工
它。
常用的中间语言形式有波兰表示、
三元组、
四元组以及间接
三元组等。
分析部分
源程序的分析是经过词法分析、语法分析和语
义分析三个步骤实现的。
词法分析由词法分析程序
(又称为扫描
程序)完成,其任务是识别单词(即标识符、常数、保留字,以
及各种运算符、标点符号等)、造符号表和常数表,以及将源程
序换码为编译程序易于分析和加工的内部形式。
语法分析程序是
编译程序的核心部分,
其主要任务是根据语言的语法规则,
检查
源程序是否合乎语法。
如不合乎语法,
则输出语法出错信息;
如
合乎语法,
则分解源程序的语法结构,
构造中间语言形式的内部
程序。
语法分析的目的是掌握单词是怎样组成语句的,
以及语句
又是如何组成程序的。
语义分析程序是进一步检查合法程序结构
的语义正确性,
其目的是保证标识符和常数的正确使用,
把必要
的信息收集和保存到符号表或中间语言程序中,
并进行相应的语
义处理。
综合部分
综合阶段必须根据符号表和中间语言程序产生
出目标程序,其主要工作包括代码优化、存储分配和代码生成。
代码优化是通过重排和改变程序中的某些操作,
以产生更加有效
的目标程序。
存储分配的任务是为程序和数据分配运行时的存储
单元。
代码生成的主要任务是产生与中间语言程序符等价的目标
程序,
顺序加工中间语言程序,
并利用符号表和常数表中的信息
生成一系列的汇编语言或机器语言指令。
结构
编译过程分为分析和综合两个部分,
并进一步划分为
词法分析、语法分析、
语义分析、
代码优化、存储分配和代码
生成等六个相继的逻辑步骤。
这六个步骤只表示编译程序各部分
之间的逻辑联系,
而不是时间关系。
编译过程既可以按照这六个
逻辑步骤顺序地执行,
也可以按照平行互锁方式去执行。
在确定
编译程序的具体结构时,
常常分若干遍实现。
对于源程序或中间
语言程序,
从头到尾扫视一次并实现所规定的工作称作一遍。
每
一遍可以完成一个或相连几个逻辑步骤的工作。
例如,
可以把词
法分析作为第一遍;
语法分析和语义分析作为第二遍;
代码优化
和存储分配作为第三遍;
代码生成作为第四遍。
反之,
为了适应
较小的存储空间或提高目标程序质量,
也可以把一个逻辑步骤的
工作分为几遍去执行。
例如,
代码优化可划分为代码优化准备工
作和实际代码优化两遍进行。
一个编译程序是否分遍
,
以及如何分遍
,
根据具体情况而定。
其判别标准可以是存储容量的大小、
源语言的繁简、
解题范围的
宽窄,
以及设计、
编制人员的多少等。
分遍的好处是各遍功能独
立单纯、相互联系简单、逻辑结构清晰、优化准备工作充分。缺
点是各遍之中不可避免地要有些重复的部分,
而且遍和遍之间要
有交接工作,因之增加了编译程序的长度和编译时间。
一遍编译程序是一种极端情况,
整个编译程序同时驻留在内
存
,
彼此之间采用调用转接方式连接在一起
(
图
2)
。当语法分析
程序需要新符号时,
它就调用词法分析程序;
当它识别出某一语
法结构时,
它就调用语义分析程序。
语义分析程序对识别出的结
构进行语义检查,
并调用“存储分配”和“代码生成”程序生成
相应的目标语言指令。
随着程序设计语言在形式化、
结构化、
直观化和智能化等方
面的发展,
作为实现相应语言功能的编译程序,
也正向自动程序
设计的目标发展,以便提供理想的程序设计工具。