编译原理:编译过程和编译程序的结构

编译过程概述:
编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的,典型的划分方法主要分为6个阶段、如下:
源程序 -> 词法分析 -> 语法分析 -> 语义分析 -> 中间代码生成 -> 代码优化 -> 目标代码生成 -> 目标程序


下面分别简单介绍一下6个阶段的任务

1、词法分析:
词法分析是编译过程的第一个阶段,这个阶段的任务是从左到右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(一些场合下也称单词符号或符号)。这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。
在这个阶段,会将程序变成由标识符、保留字、算符、界符等组成的单词序列。并且自动把空格过滤掉。其中标识符会以id1、id2、id3……这样的内部形式存在。

2、语法分析:
语法分析是编译过程的第二个阶段。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”等。这种语法短语也称为语法单位,可以表示成语法树
编译原理:编译过程和编译程序的结构_第1张图片
语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。程序的结构通常是由递归规则表示的。

词法分析和语法分析本质上都是对源程序的结构进行分析。但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输入流,遇到既不是字母又不是数字的字符时,将前面所发现的所有字母和数字组合在一起构成标识符单词即可。但这种线性扫描不能用于递归定义的语法成分,比如不能用此办法去匹配表达式中的括号。

3、语义分析:
语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。例如,语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。

4、中间代码生成:
在进行了上述的语法分析和语义分析阶段的工作后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点:
(1)容易生成
(2)容易将它翻译成目标代码
很多编译程序采用了一种近似“三地址指令”的“四元式”中间代码,这种四元式形式为:
(运算符,运算对象1,运算对象2,结果)

5、代码优化:
这一阶段的任务是对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。一系列的优化工作诸如公共子表达式的删除、强度削弱、循环优化等优化工作将会在后面的博客里详细介绍。

6、目标代码生成:
这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,这个阶段的工作很复杂,涉及硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。


上述就是编译程序的几个工作阶段。但事实上并非所有的编译程序都分成这样几个阶段,有些编译程序并不需要生成中间代码,有些编译程序不进行优化,即优化阶段可省去,有些最简单的编译程序在语法分析的同时产生目标指令代码,如 PL/0 语言编译程序。不过多数实用的编译程序都包含上述几个阶段的工作。

你可能感兴趣的:(编译原理)