软考-软件设计师:程序设计语言-编译过程概述

编译程序 和 解释程序

编译过程

从上图可知,可以不执行的有:

  • 中间代码生成
  • 代码优化

符号表管理 和 出错处理

整个过程中,都有 符号表管理 和 出错处理 参与

词法分析

输入:源程序

过程:从左到右逐个扫描源程序中的字符,识别其中如关键字(或称保留字)、标识符、常数、运算符以及分隔符(标点符号和括号)等。

输出:记号流

错误分析:非法字符,关键字或标识符拼写错误,变量名以数字开头

语法分析

输入:单词符号(也就是上一步的输出)

过程:根据语法规则将单词符号分解成各类语法单位,并分析源程序是否存在语法上的错误

错误分析:语法结构出错,if endif 不匹配,缺分号、括号不匹配、表达式缺少操作数

分析方法

  • 自顶向下分析法
    • 递归下降分析法
    • 预测分析法
  • 自底向上分析法
    • 移进-规约分析法

语义分析

主要检查源程序是否存在 静态语义错误,并收集类型信息共后面的代码生成阶段使用。

符号表:记录源程序各个符号的必要信息,以辅助语义的正确性检查和代码生成。

分类:

  • 静态语义分析:语法制导翻译,将语言结构的语义以属性的形式赋予代表此结构的文法符号,而属性的计算以语义规则的形式赋予文法的产生式。
    错误分析:运算符和运算类型不匹配(字符串之间用 -减号);对浮点数取余

  • 动态语义分析: 程序运行时进行分析

动态错误

发生在 程序运行时,也叫 动态语义错误

错误分析:陷入死循环、变量值是零时做除数、引用数组元素下标越界等错误

静态错误总结

编译时所发现的程序错误

分为:

  • 词法错误
  • 语法错误
  • 静态语义错误

中间代码(可以不执行)

由于源程序与目标程序的逻辑结构往往差别很大,想要 一次翻译到位很困难,而用语法制导翻译往往会 生成繁琐低效 的目标代码

因此必须采用一些中间代码,将原程序先翻译成中间代码形式,以利于进行与机器无关的优化处理,有助于提高编译程序的可移植性。

共同特征是:与具体的机器无关。

(考点)常用的中间代码有:后缀式(逆波兰式)、树型表示、三元式、四元式

四元式的形式为:(运算符,运算对象1,运算对象2,运算结果)

代码优化(可以不执行)

对前阶段的中间代码变换或改造,目的是使生成的代码更高效,节省时间和空间。

注意:可以不执行

目标代码生成

编译器工作的最后阶段,把代码转换为特定机器上的绝对指令代码、可重定位指令或汇编指令代码,这个阶段与具体的机器密切相关。

题

将编译器的工作过程划分为词法分析、语义分析、中间代码生成、代码优化和目标代码生成时,语法分析阶段的输入是()。若程序中的括号不配对,则会在()阶段检查出该错误。

A、记号流
B、字符流
C、源程序
D、分析树

A、词法分析
B、语法分析
C、语义分析
D、目标代码生成

分析

第一问:上面有总结过,语法分析阶段的输入是 记号流

第二问:上面有总结过,括号不配对,则会在 语法分析 阶段检查出该错误

参考:
https://blog.csdn.net/Lzy410992/article/details/117248279
https://zhuanlan.zhihu.com/p/495842473


原文出处:/show_1GWtG30eyAr.html