如:2019年上半年第22 题
在对高级语言进行编译过程中,需要不断地收集、使用和记录源程序中相关符号的类型和特征等信息,并将其存入()中
A、哈希表
B、符号表
C、堆栈
D、队列
答:
若不了解编译原理,则此题很容易就理解成了放到特定的“堆栈”中,这种具体的逻辑结构中去了。
正确答案选 C、 符号表
什么是符号表??
先来了解了一下符号表的来龙去脉;从编译程序说起吧
-
一个编译程序是一个语言翻译程序,它将源语言程序翻译成目标语言程序。
高级语言程序的处理过程:
需预处理的源程序--(预处理程序)-->源程序--(编译程序)-->目标汇编程序--(汇编程序)-->可重定位的机器语言程序--(连接装入程序)-->可执行的机器语言程序
编译程序的6个阶段及任务:
词法分析:扫描源程序字符流,识别出有词法意义的单词,返回单词的类别和单词的值,或词法错误信息
语法分析:在词法分析的基础上将单词序列分解成各类语法短语,确定整个输入串是否构成一个与发生正确的程序。
语义分析:对语法分析后的程序进行语义分析,不符合语义规则时给出语义错误信息
中间代码生成:生成容易被翻译成目标代码的中间代码。
代码优化:对中间代码进行改造,使它生成的目标代码在时间和空间上更加高效。
目标代码生成:将中间代码变成特定机器上的绝对指令代码或可重定向的指令代码或汇编指令代码。
逻辑上可分为分析阶段和逻辑阶段,词法分析、语法分析、语义分析为前端,中间代码生成和中间代码优化为中端(有时也归于前端),目标代码生成和目标代码优化为后端。
完整的编译程序还包括表格管理程序和出错处理程序。
解释方式的特点:
不产生目标程序文件
不区别翻译阶段和执行阶段,翻译源程序的每条语句后直接执行
程序执行期间一直有解释程序守候
常用于实现虚拟机
-
解释程序与编译程序的区别:
目标代码的执行方式不同,基本原理和方法没有本质上的区别。
-
符号表的作用:
① 收集符号属性;(词法分析)
② 上下文语义的合法性检查的依据;(语法分析)
③ 作为目标代码生成阶段地址分配的依据;(语义分析)
扩展:
既然涉及到编译部分的内容,那就顺便看一下其他的吧
常见中间表示形式:
- 逆波兰式:
逆波兰式
中缀表达式转逆波兰式:按照算术表达式的计算顺序 根据操作数1、(操作数2)、运算符的顺序化成一个部分的后缀式,将这个后缀式在算术表达式中看成一个操作数继续按照上面方法分析。
逆波兰式转中缀表达式:根据逆波兰式的序列从左向右找运算符,找到后从这个运算符开始向前找出紧邻的操作数2、操作数1并化成算术表达式,将这个算术表达式看成一个操作数,继续往后寻找操作符,重复以上步骤。
注意:操作数均由一个字母表示。
2、抽象语法树AST:
抽象语法树中每一个子树的根结点都对应一种动作或运算,它的所有子结点对应该动作或运算的参数或运算数。
参数或运算数也可以是另一子树,代表另一动作或运算。
将AST中相同的子树合并,这种改进的AST叫做有向无环图DAG;
-
三地址码TAC
x=y op z
或者四元组的形式(op,y,z,x)
代码优化
-
代码优化可分为与机器有关的优化和与机器无关的优化。
与机器有关的优化一般在目标代码上进行。与机器无关的优化一般在中间代码上进行。
- 代码优化也可分为局部优化、 循环优化和全局优化:局部优化指的是在只有一个入口、 一个出口的基本程序块上进行的优化。循环优化是对循环中的代码进行的优化,在一个程序运行时,相当多的一部分时间会花在循环上,因此,基于循环的优化非常重要。全局优化是在整个程序范围内进行的优化。
- 常用的代码优化技术 :
1、删除公共子表达式(删除多余运算)
2、代码外提
代码外提是指将循环中的不变运算提到循环体前面。
3、强度削弱
强度削弱是指用执行效率较高的操作等价地替换原操作。
比如将乘法改成加法
4、变换循环控制条件(删除归纳变量)
5、合并已知变量
6、复写传播
复写传播是指尽量不引用那些在程序中仅仅只传递信息而不改变其值,也不影响其运行结果的变量。
7、删除无用赋值
**DAG 表示的代码优化分析
所作的优化合并已知量、删除多余运算、删除无用赋值