【软考】【程序设计语言基础】编译与解释
- 计算机对源程序的处理有两种方式,一种是解释型,一种是编译型。解释型就是输入一行代码按回车立即分析执行该条语句;编译型是指整个代码写完后,按编译运行才可以执行。
1.编译过程
1.1 词法分析
逐字符扫描,识别出“单词”符号,如关键字、标识符等。词法分析输出的单词常常采用二元组的方式,即单词类别和单词自身的值。
- 词法错误: 非法字符,关键字或标识符拼写错误
1.2 语法分析
根据语法规则将单词符号序列分解成各类语法单位,如表达式、语句、程序等。在此过程需要分配存储空间(基本数据类型和结构化数据类型以及连接数据,如返回地址、参数等)。分配策略有静态存储分配和动态存储分配。
- 静态存储分配: 在编译时就可以安排好目标程序运行时的全部数据空间,并确定每个数据对象的存储位置。
- 动态存储分配: 如果一个程序语言允许递归过程和可变数据结构,则需用栈分配和堆分配来动态存储分配。
- 语法错误: 语法结构出错,if-endif不匹配,缺分号
1.3 语义分析
检查源程序是否存在语义错误。
- 语义错误: 死循环,零除数,其他逻辑错误(静态语义错误可被编译器发现)
1.4 中间代码生成
中间代码是一种结构简单且含义明确的记号系统,使用中间代码有利于提高编译程序的可以执行。常用的中间代码有后缀式、三元式、四元式和数等形状。
- 后缀式: 运算符写在运算对象后面,优点是根据运算对象和运算符的出现次序进行计算,不需要使用括号,也便于用栈实现求值。
- 三元式(四元式): 由运算符OP,第一运算对象ARG1、第二运算对象ARG2和运算结果RESULT(三元式没有此项)。
- 树: 利用树型结构表示
1.5 代码优化
对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更高效,即省时间省空间。代码优化可以在中间代码生成阶段或者目标代码生成阶段进行。
1.6 目标代码生成
把中间代码变换成特定机器上的绝对指令代码、可重定位的目标代码或汇编指令代码。
目标代码生成阶段应考虑直接影响到目标代码素的的三个问题:
- 如何生成较短的目标代码
- 如何充分利用计算机中的寄存器,减少目标代码访问存储单元的次数
- 如何充分利用计算机指令系统的特点
1.7 符号表管理
符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成。
符号表的建立可以在词法分析阶段或语法分析阶段,但使用有时会延续到目标代码的运行阶段。
1.8 出错处理
动态错误又称为动态语义错误,指程序中包含的逻辑错。
静态错误是编译阶段发现的程序错误,可分为语法错误和静态语义错误。
出错处理的任务包括检查错误、报告出错信息、排错、恢复编译工作。
2.解释过程
在用户运行程序时,解释程序直接执行源程序或源程序的内部形式(中间代码),所以皆是过程不产生源程序的目标程序
解释程序通常可以分为两部分:
- 分析部分: 词法分析、语法分析和语义分析。经过分析后把源程序翻译成中间代码,中间代码常采用逆波兰表示形式
- 解释部分: 对中间代码进行解释执行