# 👋 软考中级系统架构师
备战 中级软件设计师
# 程序设计语言
「软件设计师」 上午题 #2 程序设计语言 (opens new window)
# 编译程序和解释程序
- 解释器:翻译源程序时不生成独立的目标程序
解释程序和源程序要参与到程序的运行过程中
- 编译器:翻译时将源程序翻译成独立保存的目标程序
机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的运行过程
# 程序设计语言基本成分
- 基本控制接口: 顺序、选择和重复(循环接口)
# 短路计算
判断遵循从左往右看
&&
有一个 false 就为 false||
有一个 true 就为 true
# 引用方式(代码简单实现)
传值调用:将实参的值传递给形参,实参可以是变量、常量和表达式。不可以实现形参和实参间双向传递数据的效果
传引用(地址)调用:将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值,
# 编译、解释程序翻译阶段
- 编译方式 (独立) :词法分析(线性字符序列)、语法分析、语义分析(发现静态语法错误)、中间代码生成、代码优化、目标代码生成(和机器体系结构相关
- 解释方式:词法分析、语法分析、语义分析、(不生成目标程序,参与程序控制、慢)
- 编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换,即词法分析、语法分析、语义分析是必须的。
- 编译器方式中中间代码生成和代码优化不是必要,可省略即编译器方式可以在词法分析、语法分析、语义分析阶段后直接生成目标代码
- 符号表:不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
# 词法分析
输入:源程序; 输出:记号流
分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定
正规表达式: (| = 或)(* 0个或多个)
有限自动机是词法分析的一个工具,它能正确地识别正规集
- 确定的有限自动机(DFA):对每一个状态来说识别字符后转移的状态是唯一的
- 不确定的有限自动机(NFA):对每一个状态来说识别字符后转移的状态是不确定的
# 语法分析
- 输入:记号流; 输出:语法树(分析树)
- 可以发现程序中所有的语法错误 (变量是否定义,括号是否匹配)
- 主要作用是:对各条语句的结构进行合法性分析分析程序中的句子结构是否正确
# 语义分析
- 输入:语法树(分析树)
- 进行类型分析和检查
- 不能发现程序中所有的语义错误,可以发现静态语义错误,不能发现动态语义错误(int i = 1 / 0),动态语义错误运行时才能发现
# 目标代码生成
- 与具体的机器密切相关
- 寄存器的分配工作处于目标代码生成阶段
# 中间代码生成
- 根据语义分析的输出生成中间代码
- 共同特征是与具体的机器无关。
常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。
# 上下文无关文法 (语法规则)
- 通常来说,小写字母是终结符号, 画图推导
# 中缀、后缀表达式转换
后缀表达式,又被称为 逆波兰式,用栈
原则: a * b = ab * ,不断的用这个规则整理