编译原理笔记【第三章 控制结构】
控制结构
规定程序语句和程序单元的执行流程的控制机制
分为:
语句级控制结构
单元级控制结构
第一节 语句级控制结构
-
语句级控制结构
规定语句执行流程的控制 -
三种 语句级控制结构
顺序
选择(分支)
重复(循环)
1. 顺序
-
语言可用的、最简单的控制结构
A;
B; -
复合语句
若干个语句可以组合在一起。逻辑上作为一条语句对待
如{…}
2. 选择
选择控制结构允许在某些可选择的语句中选择其中一条来执行
单选: if then
二选一: if then else
多选一:嵌套 if then else
3. 重复
-
两种情况
计数器制导
条件制导 -
计数器制导
当预先知道重复次数时,在循环计数器值的有限集合上重复
(for循环) -
条件制导
不知道次数,只知道条件
(while, do-while)
4. 语句级控制结构讨论
-
顺序、选择、重复是一定意义的抽象
顺序、选择、重复可以帮助程序员组织语句的控制流程
顺序、选择、重复是基本的语句级控制结构理论证明,使用顺序、选择和重复就可对计算机所有可能的算法进行编码
-
抽象控制结构,控制既简单又有效
抽象控制结构是对程序计数器(PC)的值进行修改的抽象
顺序:PC(自动)+1
的抽象
选择和重复:显式修改PC值的抽象
通过无条件转移和条件转移指令实现 -
显式控制结构:通过无条件转移和条件转移指令修改PC的低级控制机制
抽象控制结构比显式控制结构更好
程序员通过使用顺序、选择和重复就能表达控制语句执行的意图 -
采用抽象控制结构有利于程序设计
高级语言控制结构最终要由条件转移和无条件转移的低级代码实现
由编译器生成有效的低级代码(程序员不可见)
第二节 单元级控制结构
-
规定程序单元之间控制流程的机制
最简单的机制是ALGOL60的分程序
在程序执行的过程中,遇到一个分程序,就建立
在程序顺序执行的过程中,遇到一个分程序,就建立一个新的引用环境,并执行这个分程序。
更强的机制允许程序员通过显式调用单元(例如函数和过程),把控制从一个单元转移到另一个单元 -
四种单元级控制结构
显式调用
异常处理
协同程序
并发单元
1. 显式调用
-
每个子程序(函数、过程)都有一个名字,通过名字进行程序单元的调用。
调用语句将控制转向被调用单元
被调用单元执行完后,又将控制返回主调用单元,并继续执行紧跟在调用语句后面的语句(返回地址) -
例如:
C
语言的函数 -
当控制从调用单元转向被调用单元时,还可进行参数传递
参数传递可实现单元之间的通信
单元之间的通信也可以通过全局变量或非局部变量来进行(副作用) -
参数传递
每次调用允许传递不同的数据(实际参数),为单元间的通信提供了灵活性
也提高了程序的可读性和可修改性
2. 异常处理
-
异常:导致程序正常执行中止的事件
要靠发信号来引发
用异常条件来表示 -
异常处理机制不包括在程序的主流程中,以保证程序的逻辑按基本算法进行
-
异常处理基本有两种
基本的是处理完异常返回原程序,另一种是由异常处理决定去向 -
异常处理是C++的一个主要特征
它提出了出错处理更加完美的方法
设置陷阱 抛出异常 捕获异常try
throw
catch
3. 协同程序
多个程序单元交错的执行——协同程序
协同程序是通过协版作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
伪并行
4. 并发单元
多个进程的执行概念上是可重叠的,即正在执行的进程尚未中止,另一个进程可能开始执行,多个程序单元“并行”活动。例如“生产者-消费者”问题正确访问缓冲区:同步与互斥问题