1 解释下列名词术语:源程序、目标程序、翻译程序、汇编程序、编译程序、解释程序、遍。
【解答】
- 源程序:符合某特定语言(称为源语言)的规则的程序文本,一般由高级语言或汇编语言书写,需要翻译成目标程序后才能被计算机执行;
- 目标程序:符合某特定语言(称为目标语言)的规则的程序文本,一般由汇编语言或机器语言表示,由源程序翻译来以被计算机执行;
- 翻译程序:将源程序等价转换(即翻译)为目标程序的程序;
- 汇编程序:源语言为汇编语言、目标语言为机器语言的程序翻译;
- 编译程序:源语言为高级语言的翻译程序;
- 解释程序:直接对源语言进行解释执行的程序;
- 遍:遍历源程序或中间代码,以产生新的中间代码或目标程序的一次过程。
【笔记】
- 通常人们使用简洁的高级语言编写程序,并翻译为机器语言程序以执行,故翻译的源语言通常为高级语言。但也不总如此,在反编译时机器语言也作为了源语言。
- 汇编语言与机器语言基本一一对应,翻译较为简单;高级语言抽象度高,翻译较为复杂。可能因此特别地创造了汇编程序与编译程序两词以示区别。
2 典型的编译程序可划分为哪几个主要的逻辑部分?各部分的主要功能是什么?
【解答】
- 词法分析:识别程序中的单词(保留字、标识符、直接数与运算符等);
- 语法分析:根据语法规则,分析各单词充当的语法成分(表达式、函数、语句),同时进行正确性检查;
- 语义分析、中间代码生成:对各语法成分进行语义分析,从而生成中间代码(如四元式、三元式、逆波兰式等);
- 代码优化:调整优化中间代码(在等价转换的原则下优化效率),从而生成更好的目标代码;
- 目标程序生成:由中间代码生成目标程序,此过程中可进行一定优化(如充分利用累加器);
- 符号表管理:管理源程序中的各种标识符等;
- 出错处理:识别并定位源程序中的错误;
【笔记】
- 编译的代码优化过程在两处出现:对中间代码的优化主要是针对程序逻辑的优化(如去掉无效的语句与循环);而生成目标程序时的优化主要是针对目标机器体系结构进行的。由此可知分开讨论的原因。
3 什么是编译的前端和后端?为什么要把编译程序分成前端和后端?
【解答】
- 编译的前端指编译过程中依赖于源语言且相对独立于目标机器的部分,包括词法分析、语法分析、符号表建立、语义分析、中间代码生成、代码优化以及相关的错误处理。
- 编译的后端指编译过程中依赖于目标机器的部分,一般与源语言无关而依赖中间语言。包括代码优化、代码生成以及相关的错误处理和符号表操作。
- 如此可以对前端进行复用,为不同的机器仅改写后端是相对容易的。
【笔记】
- 后端的复用正处于研究阶段:由于高级语言的差异较大,找到一种通用的中间语言来表示不同高级语言难度较大。