软考中级_【软件设计师】知识点之【程序设计语言】
一、低级语言和高级语言
- 计算机只能识别0或1(机器语言)
- 汇编语言
- 例:ADD X1 2
- 低级语言分类:
- 机器语言
- 汇编语言
- 高级语言分类:
- java
- js
- python
二、编译程序和解释程序
解释程序
- 解释程序对应脚本语言
- 例如:PHP、js、python
- 解释程序
- 会直接解释源程序执行
- 或者
- 翻译成某种中间代码再加以执行
- 解释器:
- 翻译源程序不会生成独立的目标程序
- 解释程序和源程序要参与到程序的运行过程中
编译程序
- 编译程序:
- 是用编译器将源程序翻译为目标语言程序,在执行
- 例如:java
- 编译器:
- 翻译时将源程序翻译成独立保存的目标程序
- 机器上运行的是源程序等价的目标程序
- 源程序和编译程序都不再参与目标程序的运行过程
三、程序设计语言的结果成本
- 顺序结构
- 逻辑结构
- 循环结构(重复)
四、数据类型
- 许多程序中规定,程序中的数据必须具有类型,作用是:
- 便于为数据合理分配存储单元
- 便于对参与表达式计算的数据对象进行检查
- 便于规定数据对象的取值范围及能够进行运算
- 隐式转换:容量小的的数据类型相容量大的数据类型转换
- 显式转换:容量大的的数据类型相容量小的数据类型转换
- 变量具有对应的存储单位,常量则没有,常量是存储在常量池中
- 与或非
- 优先级(高到低):not>and>
- and or 为左结合
- not为右结合
- 例:not 2>3 (先算2>3)
五、函数
- 传值调用:
- 将实参的值传递给形参,实参可以是变量,常量和表达式。
- 不可以实现形参和实参间双向传递数据的效果
- 引用调用:
- 将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式
- 可以实现形参和实参之间双向传递数据的效果,即改变形参的值的同时也改变了实参的值。
六、编译、解释程序翻译阶段
- 编译方式(六种):
- 词法分析、语法分析、语义分析、中间代码分析、代码优化、目标代码生成
- 编译器方式中中间代码生成、和代码优化不是必要的,可以省略
- 解释方式:
- 词法分析、语法分析、语义分析
- 编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换
符号表管理
- 符号表是不断收集,记录和使用源程序中的一些相关符号的类型和特征等信息,并将其存储到符号表中。
- 记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
- 做题技巧:
- 选项中出现数据结构名词,排除即可。
词法分析
- 输入:源程序
- 输出:记号流
- 作用作用:是分析程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定。
- 例:inn a=10; (错误:inn应该为:int)
语法分析
- 输如:记号流
- 输出:语法数(分析数)
- 主要作用:
- 对各条语句的结构进行合法性分析
- 分析程序中的语句结构是否正确,
- 可以发现程序中的所有语法错误
- 例题:
- inta =1 (错误:没有分号)
语义分析
- 输入:语法数(分析数)
- 主要作用:
- 进行类型分析和检查
- 注意点:
- 语义分析不能发现程序中所有的语义错误
- 可以发现静态语义错误
- 不可以发现动态语义错误(动态语义错误只能在程序运行时发现)
- 例子:
- Boolean a=1; (类型错误)
目标代码生成
- 目标代码生成的工作与具体的机器密切相关
- 寄存器的分配工作是处于目标代码生成
动态语义错误
- 动态语义错误只能在程序运行时发现
- 例子:
- 死循环
- 除数为0
- 例子:
中间代码生成
- 常见的中间代码生成
- 后缀式:
- 三地址式
- 三元式
- 四元式
- 树(图)
- 中间代码生成与具体的机器无关(不依赖具有的机器)
- 可以将不同的高级程序语言翻译成同一种中间代码
- 中间代码可以跨平台
- 使用中间代码生成有利于与机器无关的优化处理和提高编译程序的可移植性。
七、正规式
- 词法分析的工具
- |表示或
- *表示具有0个或多个
- 例子:
- 由a,b构成且包含偶数个a的集合:
- 解:(b*(aba))*
- 由a,b构成且包含偶数个a的集合:
八、有限自动化
- 词法分析工具
- 能够正确的识别正规集
- 图形解释
- 两种状态,
- 初态
- 终态(两种表现形式)
- 两种状态,
- 符号解释:
- 图形出现a,b表示为a或b
- ε表示为空,可以直接跳转
- 例图:
- 分类:
- 确定有限自动化(DFA):对每一个状态来说识别字符后转移的状态是唯一的
- 例:a只能转移到终态
- 确定有限自动化(DFA):对每一个状态来说识别字符后转移的状态是唯一的
2. 不确定有限制动化(NFA):对每一个状态来说识别字符后转移的状态不是唯一的。
1. 例:a既可以到终态也可以是本身
九、上下文无关文法
- 上下文无关文法:广泛的用于表示各种程序设计语言的语法规则
- 题目形式:(给一个相关的表达式,可以用E、T、F文法推到出来)
或
- 例题:
- 以S为开始符号,通过中间的字符推到终结到T
- 产生式意思:表示S可以推出某一个P的某个形式
- 以S为开始符号,通过中间的字符推到终结到T
- 例题:
- 例题:
- 分析:先分析结果需要的数学符号,再选在需要推产生式
- 例题:
- 技巧:
- 括号根本推不出来,B排除
- 产生式中没有除好,D排除
- 终结式中的id表示为a~z,没有数字,C排除
- 技巧:
- 例题:
- 中缀表达式(符号往上提了)
十、中缀、后缀表达式转换
- 中缀表达式语法
语法格式: a?b
a和b表示数字,?表示运算符号
例如:2+3
- 后缀表达式(逆波兰式)语法
语法格式: ab?
a和b表示数字,?表示运算符号
例如:23+
- 符号优先级
优先级(高到低):
() >> * >> / >> + >> -
> >> and >> or
注意点:优先级相同,从右向左算
- 中缀转后缀
1.
中缀表达式:1-(2+3)*4/9
第一步:23+
第二步:23+9/
第三步:23+9/4*
第四步:123+9/4*-
- 后缀转中缀
- 可以用栈进行转换
- 利用栈存取和弹出的思想,从第一个数字开始入栈,遇到符号后,将前两个弹出计算
中缀表达式:123+9/4*-
第一步:2+3
第二步:(2+3)/9
第三步:(2+3)/9*4
第四步:1-(2+3)/9*4
十一、语法树中、后序遍历
- 语法树中序遍历可推出====>>中缀表达式
中序遍历读法:左根右
- 语法树后序遍历可推出====>>后续表达式
后序遍历读法:左右根
十二、杂题总结
- 编译是将高级语言源程序翻译成机器语言程序(汇编形式或机器代码形式),反编译是编译的逆过程。
- 反编译通常不能还原成高级语言源代码,只能转换成功能上等价的汇编程序。
- 脚本语言都是动态语言,动态语言都是解释型语言
- 如:js、php
- 在C和C++中,指针变量可以是全局变量也可以是局部变量
- 链表中的结点空间需要程序员根据需要申请和释放,因此,数据空间应采用堆存储分配策略
- 标记语言:
- html
- xml
- wml
- 可视化程序设计是开发应用程序不用编写或只需编写很少的程序代码,就能完成程序设计。
- 编译过程中为变量分配存储单位所用的地址为逻辑地址,程序运行时再映射为物理地址。
- C语言中全局变量存储在静态代码区,
- C语言程序运行时,
- 递归下降分析方法和预测分析法是一种自上而下的语法分析方法
- 算符优先分析法和LR分析法属于自底向上的语法分析方法
- 在源程序中,程序员可以对变量,数据类型,函数进行命名
- Lisp是一种函数式编程语言,Prolog是逻辑式程序语言
- 语法制导翻译是一种静态语义分析方法
- 栈是函数调用时所需保存的存储区域。
- 堆是一块动态存储区域,由程序员在程序中进行分配和释放。
- C/C++编译过程:预处理》》编译》》汇编》》链接
- Java语言特征;
- 采用及时编译
- 对象在堆空间分配
- 自动垃圾回收机制
- Python:
- 元组(tuptle):不可变
- 字符串(str):不可变
- 集合(set):不可重复
- 列表(List):可变的、有序的、可重复的
- Python机器学习库:
- TensorFlow
- PyTorch
- Keras
- Python可视化库:
- Matplotlib