软考-软件设计师:程序设计语言-编译过程概述 作者:马育民 • 2025-04-05 15:07 • 阅读:10004 # 编译程序 和 解释程序 [](https://www.malaoshi.top/upload/0/0/1GWtFo9Cior.png) # 编译过程 [](https://www.malaoshi.top/upload/0/0/1GWtFz08w1Y.png) 从上图可知,可以不执行的有: - 中间代码生成 - 代码优化 ### 符号表管理 和 出错处理 整个过程中,都有 **符号表管理** 和 **出错处理** 参与 [](https://www.malaoshi.top/upload/0/0/1GWtUnkSs1U.png) # 词法分析 **输入:**源程序 **过程:**从左到右逐个扫描源程序中的字符,识别其中如关键字(或称保留字)、标识符、常数、运算符以及分隔符(标点符号和括号)等。 **输出:**记号流 **错误分析:**非法字符,关键字或标识符拼写错误,变量名以数字开头 # 语法分析 **输入:**单词符号(也就是上一步的输出) **过程:**根据语法规则将单词符号分解成各类语法单位,并分析源程序是否存在语法上的错误 **错误分析:**语法结构出错,`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 原文出处:http://malaoshi.top/show_1GWtG30eyAr.html