【软考】【程序设计语言基础】编译与解释

  • 计算机对源程序的处理有两种方式,一种是解释型,一种是编译型。解释型就是输入一行代码按回车立即分析执行该条语句;编译型是指整个代码写完后,按编译运行才可以执行。

1.编译过程

【软考】【程序设计语言基础】编译与解释

【软考】【程序设计语言基础】编译与解释

1.1 词法分析

逐字符扫描,识别出“单词”符号,如关键字、标识符等。词法分析输出的单词常常采用二元组的方式,即单词类别和单词自身的值。

  • 词法错误: 非法字符,关键字或标识符拼写错误

1.2 语法分析

根据语法规则将单词符号序列分解成各类语法单位,如表达式、语句、程序等。在此过程需要分配存储空间(基本数据类型和结构化数据类型以及连接数据,如返回地址、参数等)。分配策略有静态存储分配和动态存储分配。

  • 静态存储分配: 在编译时就可以安排好目标程序运行时的全部数据空间,并确定每个数据对象的存储位置。
  • 动态存储分配: 如果一个程序语言允许递归过程和可变数据结构,则需用栈分配和堆分配来动态存储分配。
  • 语法错误: 语法结构出错,if-endif不匹配,缺分号

1.3 语义分析

检查源程序是否存在语义错误。

  • 语义错误: 死循环,零除数,其他逻辑错误(静态语义错误可被编译器发现)

1.4 中间代码生成

中间代码是一种结构简单且含义明确的记号系统,使用中间代码有利于提高编译程序的可以执行。常用的中间代码有后缀式、三元式、四元式和数等形状。

  • 后缀式: 运算符写在运算对象后面,优点是根据运算对象和运算符的出现次序进行计算,不需要使用括号,也便于用栈实现求值。
  • 三元式(四元式): 由运算符OP,第一运算对象ARG1、第二运算对象ARG2和运算结果RESULT(三元式没有此项)。
  • 树: 利用树型结构表示

1.5 代码优化

对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更高效,即省时间省空间。代码优化可以在中间代码生成阶段或者目标代码生成阶段进行。

1.6 目标代码生成

把中间代码变换成特定机器上的绝对指令代码、可重定位的目标代码或汇编指令代码。
目标代码生成阶段应考虑直接影响到目标代码素的的三个问题:

  • 如何生成较短的目标代码
  • 如何充分利用计算机中的寄存器,减少目标代码访问存储单元的次数
  • 如何充分利用计算机指令系统的特点

1.7 符号表管理

符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成。
符号表的建立可以在词法分析阶段或语法分析阶段,但使用有时会延续到目标代码的运行阶段。

1.8 出错处理

动态错误又称为动态语义错误,指程序中包含的逻辑错。
静态错误是编译阶段发现的程序错误,可分为语法错误和静态语义错误。
出错处理的任务包括检查错误、报告出错信息、排错、恢复编译工作。

2.解释过程

在用户运行程序时,解释程序直接执行源程序或源程序的内部形式(中间代码),所以皆是过程不产生源程序的目标程序
【软考】【程序设计语言基础】编译与解释
解释程序通常可以分为两部分:

  • 分析部分: 词法分析、语法分析和语义分析。经过分析后把源程序翻译成中间代码,中间代码常采用逆波兰表示形式
  • 解释部分: 对中间代码进行解释执行