程序设计语言
# 一、编译程序和解释程序
解释器
- 翻译源程序时不生成独立的目标程序。
- 解释程序和源程序要参与到程序的运行过程中。
编译器
- 翻译时将源程序翻译成独立保存的目标程序。
- 机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与到程序的运行过程中。
# 二、基本控制结构
程序的三种基本控制结果
- 顺序
- 选择
- 重复(循环)
数据类型的作用
- 便于为数据合理分配存储单元
- 便于对参与表达式计算的数据对象进行检查
- 便于规定数据对象的取值范围及能够进行的运算
程序设计语言的基本成分包括数据、运算、控制和传输等
逻辑与 &&
逻辑或 ||
逻辑非 !
# 三、传值调用与传引用调用
传值调用
将实参的值传递给形参,实参可以是变量、常量和表达式
不可以实现形参和实参间双向传递数据的效果
传引用调用
将实参的地址传递给形参,形参必须有地址,不能是常量,表达式。
可以实现形参和实参间双向传递数据的效果,改变形参的值,同时也是改变了实参的值
例题
函数 t、f 的定义如下所示,其中,a 是整型全局变量。设调用函数 t 前 a 的值为 5,则在函数 t 中以传值调用(call by value) 方式调用函数 f 时,输出为 (49) 在函数 t 中以引用调用(call by reference) 方式调用函数 f 时,输出为 (50) 。(2011 年下半年)
t() {
int x = f(a);
printf a+x;
}
f(int r){
a = r+1;
r = r * 2;
return r;
}
2
3
4
5
6
7
8
9
10
(49) A. 12 B. 16 C. 20 D. 24
(50) A. 12 B. 16 C. 20 D. 24
提示
值传递:进入 f () 后全局变量 a 变成了 6,r 变成了 10,最后是 10+6=16
引用传递:进入 f () 后,r 指向了 a 的地址,r+1 后 a 变成了 6,而 r 指向了 a 所以 r 也是 6,返回的 r 就是 12,那么 a 也是 12,最后结果就是 12+12=24
# 四、编译、解释程序翻译阶段
解释方式
- 词法分析、语法分析、语义分析。
编译方式
- 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。
编译器和解释器都不可以省略词法分析、语法分析、语义分析并且顺序不能交换。
编译器方式中间代码生成和代码优化是不必需的,即编译器方式可以在词法分析、语法分析、语义分析阶段后直接生成目标代码
解释器
- 翻译源程序时不生成独立的目标程序。
- 解释程序和源程序要参与到程序的运行过程中。
- 翻译成机器代码并加以执行
编译器
- 翻译时将源程序翻译成独立保存的目标程序。
- 翻译成中间代码或目标代码
- 机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与到程序的运行过程中。
# 五、符号表
不断收集、记录和使用源程序中的一些相关符号的类型和特征信息,并将其存入到符号表中。
记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
# 六、词法、语法、语义分析与目标代码生成
词法分析
- 输入:源程序
- 输出:记号流
- 作用:
- 分析构成程序的字符
- 检查由字符构成并按照特定规则构造的内容是否符合程序语言的规定
语法分析
- 输入:记号流
- 输出:语法树(分析树)
- 作用:
- 对各条语句的结构进行合法性分析
- 分析程序中的句子结构是否正确
语义分析
- 输入:语法树
- 作用:进行类型分析和检查
目标代码生成
- 作用:与具体的机器密切相关
- 寄存器的分配工作处于目标代码生成阶段
总结
- 语法分析阶段可以发现程序中的所有语法错误
- 语义分析阶段不能发现程序中的所有语义错误
- 语义分析可以发现静态语义错误,不能发现动态语义错误
- 动态语义错误在运行时才能发现
# 七、程序异常和错误
这里主要就是动态的语义错误是在运行的时候才能检测出来
在 C 语言中,变量在声明后不赋值,系统会默认赋一个值给它,所以编译时不会报错。但是这个默认赋值的值是随机的,可能会使程序的运行结果不符合预期。
编译正确的程序必然不包含语法错误
编译正确的程序可能包含语义错误:编译器主要的任务是确保程序遵循语言的语法规则,例如括号是否正确配对,标识符是否已声明等等。然而,编译器不能确定程序的逻辑是否正确,也就是所谓的语义错误。比如:int a = 1 / 0; 这个在语法上是完全正确的,但是语义是不正确的
# 八、中间代码
常见的中间代码有:后缀式、三地址码、三元式、四元式、树(图)等形式
中间代码与具体的机器无关(不依赖具体机器),可以将不同的高级程序语言翻译成同一种中间代码。中间代码可以跨平台。
因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性
# 九、正则表达式
# 十、有限自动机
初态:一个箭头 + 一个单圈
终态:双圈或者有些题上会表明
一定是初态到终态!!!
有时候也会见到
这种说明是初态和终态是一个,按照正常逻辑走就行
确定性有限自动机(DFA):对于 DFA 的每个状态和每个可能的输入符号,都只有一个特定的状态转换。即,对于同一个状态和同一个输入,DFA 只能转移到一个特定的状态,不会有多个可能的结果。如下图:
非确定性有限自动机(NFA):NFA 则允许多个可能的状态转换。对于 NFA 的某个状态和某个输入符号,可能有多个状态转换。也就是说,对于同一个状态和同一个输入,NFA 可以转移到多个不同的状态。如下图
空字符串:表示的符号是 ε。在这种情况下,这意味着自动机可以在没有输入的情况下改变状态。如下图所示,这种的可以直接越过空到下一步
# 十一、上下文无关文法
大多数程序设计语言地语法规则用上下文无关文法描述
用树形方式画推导,比较容易理解。
# 十二、中缀、后缀表达式
中缀式:a + b
后缀式(逆波兰式):ab+
后缀式利用栈进行求值
优先级:
- () 括号
- *、/
- +、-
如果优先级相同的,符号从左到右排序
逻辑与运算” 的优先级高于 “逻辑或运算
语法树的后缀式为后序遍历(左右根)、中缀式为中序遍历(左根右)
# 十三、杂题
自顶向下语法分析方法:递归下降分析法、预测分析法。
自底向上语法分析方法:移进 — 归约分析法、LR 分析法
已知某高级语言源程序 A 经编译后得到机器 C 上的目标程序 B,则对 B 进行反编译,不能还原出源程序 A。
指针变量可以是全局变量也可以是局部变量
在对高级语言源程序进行编译的过程中,为源程序中变量所分配的存储单元的地址属于逻辑地址
语法指导翻译是一种动态语义分析方法。
计算机执行程序时,内存分为静态数据区、代码区、栈区和堆区。其中栈区一般在进行函数调用和返回时由系统进行控制和管理, 堆区由用户在程序中根据需要申请和释放。
用 C/C++ 语言为某个应用编写的程序,经过预处理、编译、汇编、链接后形成可执行程序。
在 Python 语言的模块中,Matplotlib 不支持深度学习模型。