一、程序设计语言基本概念
1.1.低级语言和高级语言
-
低级语言:机器语言和汇编语言称为低级语言
- 机器语言指0、1组成的机器指令序列
- 汇编语言指用符号表示指令的语言
- MOV AX,2
- MOV BX,3
- ADD AX,BX
-
高级语言:从人类的逻辑思维角度出发,面向各类应用的程序语言,抽象程度大大提高,需要编译称特定机器上的目标代码才能执行。这类语言和人类使用的自然语言比较接近,大大提高了程序设计的效率
1.2.编译程序和解释程序
-
高级语言或汇编语言编写的程序称为源程序,源程序不能直接在计算机上执行
-
如果源程序是汇编语言编写的,则需要一个称为汇编程序的翻译程序将其翻译成目标程序,然后才能执行
-
如果源程序是高级语言时,这个翻译程序称为编译程序
-
按源程序中语句的执行顺序,逐条翻译并立即执行相关功能的处理程序、称为解释程序
-
程序的执行方式:
-
编译执行:按编译方式在计算机上执行用高级语言编写的程序,需经过两个阶段
-
编译阶段,把源程序翻译为目标程序
-
运行阶段:真正执行此目标程序
-
优点:执行效率高,占用资源小
-
缺点:兼容性差
-
-
解释执行:源程序的每个语句一经解释就立即执行
- 优点:可移植性较好,开发速度较快,与用户通信方便
- 缺点:效率低
-
二、编译系统基本原理
2.1.编译程序的工作过程:
-
词法分析
-
输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词,删掉无用信息,报告分析时的错误
-
基本语法符号:关键字、标识符、常量、运算符、界符
-
词法分析器所输出单词符号常常表示成如下二元式:
- (单词种别, 单词符号的属性值)
-
描述词法规则通常用:正规式 和 有限自动机
-
-
语法分析
- 语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,按语法规则分析检查每条语句是否有正确的逻辑结构
- 语法分析的方法:
- 自上而下分析法
- 自下而上分析法
-
语义分析
- 语义分析阶段主要时检查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码
- 语义分析的主要工作时进行各类型分析和检查,比如赋值语句的右端和左端的类型不匹配,表达式的除数是否为零等
-
中间代码生成
- 中间代码生成阶段的工作时根据语义分析的输出生成中间代码
- 中间代码是一种简单且含义明确的记号系统,可以有若干种形式,常见的有逆波兰记号、四元式、三元式和树
- 他们的共同特征是代码的方式与具体的机器无关
- 中间代码生成阶段的工作时根据语义分析的输出生成中间代码
-
代码优化
- 代码优化阶段是对前阶段产生的中间代码进行交换或进行改造,目的是使生成的目标代码更为高级,即省时间和省空间
-
目标代码生成
- 是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统的结构和指令的含义有关
2.2.状态转换图
-
状态转换图是状态有限的有向图,用圆圈表示结点状态,结点之间有向边代表状态转换,有向边上可标记字符,表示前一状态接受某一状态之后的状态转移
-
状态状态图的功能:用于识别一定字符串
-
状态转换图的要求
- 状态(即结点)个数有限
- 至少一个初始状态,若干个终止状态
- 每条边上标有字符(也可以是空字符)
-
状态转换图的表示习惯
- 初始状态用“○”表示
- 非终止状态用“○”表示
- 状态之间的跳转用“→”(有向边)表示
- 终止状态用“◎”表示
- 多读进一个字符用“*”表示
2.3.正规表达式与正规集(定义和运算)
-
状态转换图可以构造词法分析程序,但是属于非形式化描述。
-
正规表达式是词法分析的形式化表示方法。所谓形式化的方法,是指用一整套带有严格规定的符号体系来描述问题的方法
-
优点:更加清晰和准确
-
正规式和正规集的递归定义
-
ε和Φ都是字母表∑上的正规式,它们所表示的正规集分别为{ε}和Φ
-
任何a∈∑,a是∑上的一个正规式,它所表示的正规集为{a}
-
正规式 正规集 正规式 正规集
U L(U) (U|V) L(U)∪L(V)
V L(V) (U•V) L(U)L(V)
(U)* L(U)*(闭包)
仅由有限次使用上述三步骤而得到的表达式才是∑上的正规式。仅由这些正规式所表示的子集才是∑上的正规集
-
2.4.有限自动机
- 初始状态
- 终止状态(接收状态)
- 后继状态:有限状态机在读入一个字符时,其状态改变为另一状态,则改变后的状态称为后继状态
- 如果有限状态机每次转换后的状态时唯一的则称之为确定有限状态自动机(DFA);如果转换后的后继状态不是唯一的则称之为不确定有限自动机(NFA)
2.5.确定有限状态机(DFA)
- 一个确定有限状态机(DFA),M是一个五元式:M=(s, ∑, δ, s0, F)
- S是一个有限集,它的每个元素称为一个状态
- ∑是一个有穷字母表,它的每个元素称为一个输入字符
- δ是一个从S x ∑至S的单值部分映射。δ(s,a) = s'意味着:当现行状态为S,输入a时,将转换到下一状态s',我们称s'为S的一个后继状态
- s0∈S时唯一的初态
- F属于S是一个状态集(可空)
三、程序语言的控制结构
3.1.表达式
-
前缀表达式:也被称为波兰表示法,其特点是将操作符置于操作数之前, - x + 3 4 5 6
-
中缀表达式:即我们常用的表示方法, (3 + 4) x 5 -6
-
后缀表达式:又被称为逆波兰法,其特点是将操作符置于操作数之后,3 4 + 5 x 6 -
3.2.前缀表达式
- 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果
3.3.中缀表达式(中缀记法)
- 一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间
3.4.后缀表达式
- 与前缀表达式类似,只是顺序是从左至右。遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
四、操作符的优先级
4.1.优先级排序
- 指针最优,单目运算优于双目运算,如正负号
- 先乘除(模),后加减
- 先算术运算,后移位运算,最后位运算
- 逻辑运算最后运算
五、语句间的结构
5.1.分类
- 顺序语句
- 选择语句
- 循环语句
六、过程控制
6.1.定义
-
int Function1(int x, int y){ ... }
-
参数传递的方式
- 传值调用 -- 数据传递是单向的
- 引用调用(地址调用) -- 数据传送时双向的