程序设计语言
# 1. 编译程序和解释程序
# 1.1. 解释器
- 翻译源程序时不生成独立的目标程序。
- 解释程序和源程序要参与到程序的运行过程中。
# 1.2. 编译器
- 翻译时将源程序翻译成独立保存的目标程序。
- 机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与到程序的运行过程中。
# 2.1. 基本控制结构
程序的三种基本控制结果
- 顺序
- 选择
- 重复(循环)
数据类型的作用
- 便于为数据合理分配存储单元
- 便于对参与表达式计算的数据对象进行检查
- 便于规定数据对象的取值范围及能够进行的运算
程序设计语言的基本成分包括数据、运算、控制和传输等
逻辑与 &&
逻辑或 ||
逻辑非 !
# 2.2. 传值调用与传引用调用
# 2.2.1. 传值调用
将实参的值传递给形参,实参可以是变量、常量和表达式
不可以实现形参和实参间双向传递数据的效果
# 2.2.2. 传引用调用
将实参的地址传递给形参,形参必须有地址,不能是常量,表达式。
可以实现形参和实参间双向传递数据的效果,改变形参的值,同时也是改变了实参的值
例题
函数 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
# 2.3. 编译方式与解释方式
编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。
解释方式:词法分析、语法分析、语义分析。
编译器和解释器都不可省略词法分析、语法分析、语义分析且顺序不可交换。
编译方式中中间代码生成和代码优化不是必要的,可省略。
- 词法分析:
- 输入:源程序
- 输出:记号流
- 词法分析阶段的主要作用是分析构成程序的字符及由字符串按照构造规则构成的符号是否符合程序语言的规定
- 语法分析:
- 输入:记号流
- 输出:语法树 (分析树)
- 语法分析阶段的主要作用是对各条语句的结构进行合法性分析分析程序中的句子结构是否正确
- 语法分析阶段可以发现程序中所有的语法错误
- 语义分析:
- 输入:语法树 (分析树)
- 语义分析阶段的主要作用是进行类型分析和检查语义分析阶段不能发现程序中所有的语义错误
- 语义分析阶段可以发现静态语义错误
- 不能发现动态语义错误,动态语义错误运行时才能发现
- 有语义错误是可以编译成功的,例如 a/0;这是符合语法的,也符合静态语义,编译器检验不出来这个是错误的,只有运行才会报错,也就是动态语义,动态语义错误常见的有死循环
目标代码生成阶段的工作与具体的机器密切相关寄存器的分配处于目标代码生成阶段。
# 2.3.1. 符号表
不断收集、记录和使用源程序中的一些相关符号的类型和特征信息,并将其存入到符号表中。记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
# 2.3.2. 中间代码
常见的中间代码有:后缀式、三地址码、三元式、四元式、树(图)等形式。
中间代码与具体的机器无关(不依赖具体机器),可以将不同的高级程序语言翻译成同一种中间代码。中间代码可以跨平台。
因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性。
# 3. 正则表达式
正 则 式 | 正 规 集 |
---|---|
字符串 ab 构成的集合 | |
字符串 a、b 构成的集合 | |
由 0 个或多个 a 构成的字符串集合 | |
所有字符 a 和 b 构成的串的集合 | |
以 a 为首字符的 a、b 字符串的集合 | |
以 abb 结尾的 a、b 字符串的集合 |
# 4. 有限自动机
初态:一个箭头 + 一个单圈
终态:双圈或者有些题上会表明
一定是初态到终态!!!
有时候也会见到
这种说明是初态和终态是一个,按照正常逻辑走就行
# 4.1. 确定性有限自动机(DFA)
对于 DFA 的每个状态和每个可能的输入符号,都只有一个特定的状态转换。即,对于同一个状态和同一个输入,DFA 只能转移到一个特定的状态,不会有多个可能的结果。如下图:
# 4.2. 非确定性有限自动机(NFA)
NFA 则允许多个可能的状态转换。对于 NFA 的某个状态和某个输入符号,可能有多个状态转换。也就是说,对于同一个状态和同一个输入,NFA 可以转移到多个不同的状态。如下图
# 4.3. 空字符串
表示的符号是 ε。在这种情况下,这意味着自动机可以在没有输入的情况下改变状态。如下图所示,这种的可以直接越过空到下一步
# 5. 中缀、后缀表达式
+
/ \
a b
2
3
前缀表达式:+ab
中缀表达式:a+b
后缀表达式(逆波兰式):ab+
后缀式利用栈进行求值
优先级:
- () 括号
- *、/
- +、-
如果优先级相同的,符号从左到右排序
逻辑与运算” 的优先级高于 “逻辑或运算
语法树的后缀式为后序遍历(左右根)、中缀式为中序遍历(左根右)
# 6. 上下文无关文法
大多数程序设计语言地语法规则用上下文无关文法描述
用树形方式画推导,比较容易理解。
# 7. 语法分析方法
- 自上而下语法分析:最左推导,从左至右。给定文法 G 和源程序串 r。从 G 的开始符号 s 出发,通过反复使用产
生式对句型中的非终结符进行替换 (推导),逐步推导出 r。- 递归下降思想:原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,是一种自上而下的语法分析方法
- 自下而上语法分析:最右推导,从右至左。从给定的输入串 r 开始,不断寻找子串与文法 G 中某个产生式 P 的候
选式进行匹配,并用 P 的左部代替 (归约) 之,逐步归约到开始符号 S- 移进 - 规约思想:设置一个栈,将输入符号逐个移进栈中,栈顶形成某产生式的右部时,就用左部去代替,称为归约。很明显,这个思想是通过右部来推导出左部,因此是自下而上语法分析的核心思想
# 十三、杂题
自顶向下语法分析方法:递归下降分析法、预测分析法。
自底向上语法分析方法:移进 — 归约分析法、LR 分析法
已知某高级语言源程序 A 经编译后得到机器 C 上的目标程序 B,则对 B 进行反编译,不能还原出源程序 A。
指针变量可以是全局变量也可以是局部变量
在对高级语言源程序进行编译的过程中,为源程序中变量所分配的存储单元的地址属于逻辑地址
语法指导翻译是一种动态语义分析方法。
计算机执行程序时,内存分为静态数据区、代码区、栈区和堆区。其中栈区一般在进行函数调用和返回时由系统进行控制和管理, 堆区由用户在程序中根据需要申请和释放。
用 C/C++ 语言为某个应用编写的程序,经过预处理、编译、汇编、链接后形成可执行程序。
在 Python 语言的模块中,Matplotlib 不支持深度学习模型。