1.2 编译过程概述
编译程序,是从输入源程序开始到输出目标程序为止的整个过程。
一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式。
整个过程可以划分成5个阶段:词法分析、语法分析、中间代码生成、代码优化、目标代码生成。
另外还有两项重要的工作:表格管理和出错处理,这两项工作与上述5个阶段都有联系。
表格管理:保存源程序的各种信息,编译过程中各个阶段工作涉及到的构造、查找或更新有关的信息。
出错处理:编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的剩余部分能继续被编译下去。
现在从源程序在不同阶段所被转换成的表示形式的不同来介绍各个阶段的任务:
词法分析
词法分析的任务是从左到右将一个个字符读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有具体含义:比如标识符是由字母字符开头,后跟字母、数据字符的字符序列组成的一种单词,此外还有算符、界符等。
例:begin var sum,first,count:real;
词法分析阶段将构成这段程序的字符组成了如下单词序列:
1.保留字 begin 2.保留字 var 3.标识符 sum
4.逗号 , 5.标识符 first 6.逗号 , 7.标识符 count
8.冒号 : 9.保留字 real 10.分号 ;
这些单词间的空格在词法分析阶段都被过滤掉了。
单词符号是语言的基本组成成分,是人们理解和编写程序的基本要素,识别和理解这些要素无疑也是翻译的基础。
如同英文翻译成中文,如果你对英语单词不理解或对构词法不熟悉,那就谈不上进行正确的翻译。
在词法分析阶段工作中所依循的是语言的构词规则。
语法分析
语法分析的任务是在词法分析的基础上根据语言的语法规则把单词符号串分解成各类语法单位。
通过语法分解,确定整个输入串是否构成一个语法上的正确的“程序”,语法分析遵循的是语言的语法规则。
例:a+0.1/b代表一个“算术表达式”,因而语法分析的任务就是识别这个符号串属于“算数表达式”这个范畴。
中间代码生成
在进行了语法分析工作之后,有的编译程序按语言的语义将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。
所谓“中间代码”是一种结构简单,含义明确的记号系统,这种记号系统可以设计为多种多样的形式。
重要的设计原则:
1.容易生成。
2.容易将它翻译成目标代码。
很多编译程序采用了一种近似“三地址指令”的“四元式”中间代码。
<自考学习记录> 课程代码06370《编译技术》<2>_第1张图片
四元式、三元式介绍:https://baike.baidu.com/item/%E5%9B%9B%E5%85%83%E5%BC%8F
代码优化
对中间代码进行变化或进行改造,目的是使生成的目标代码更为高效,节省时间和空间。
目标代码生成
把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码和汇编指令代码的一种,这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,这个阶段的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
代码生成:https://baike.baidu.com/item/%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90
总结
事实上并非所有的编译程序都分成这样几个阶段,有些编译程序对优化没有什么要求,优化阶段就可以省去,在某些情况下为了加快编译速度,中间代码产生阶段也可以省去,有些最简单的编译程序在语法分析的同时产生目标指令代码,但是多数实用的编译程序都采用了上述几个阶段的工作过程。