汪道之

有人的地方就有江湖

0%

编译原理第三章

控制结构

定义:规定程序语句和程序单元的执行流程

分类:语句级控制结构、单元级控制结构

语句级控制结构

定义:用来构造语句执行流程的机制

分类:顺序、选择(分支)、重复(循环)

  1. 顺序

    语句结束标记 ;

    复合语句:begin……end、{……}

  2. 选择

    单选if then

    二选一if then else

    多选一 嵌套if then else

  3. 重复

    计数器制导

    条件制导

单元级控制结构

定义:规定程序单元之间控制流程的机制

显式调用从属单元

eg:

FORTRAN语言的子程序和函数

PASCAL语言的函数和过程

C语言的函数

image-20210413150345535

隐式调用单元——异常处理

异常定义:导致程序正常执行中止的事件

异常处理的主要问题:

  1. 异常如何说明,它的作用域是什么?
  2. 异常如何发生?(如何捕获异常)
  3. 发生异常时,流程如何转移?
  4. 发生异常时,如何绑定相应的异常处理程序?
  5. 处理异常之后,控制流程转向何处?

问题(5)的解决方法:

  1. 允许控制返回发生异常事件的执行点

    这种情况下,异常处理程序可对执行的程序进行“修补”,终止相应的异常事件,以便程序继续正常地执行。

    解决了程序继续执行的问题,但并未真正消除发生异常的因素。

  2. 由异常处理程序进行控制的转移

    意味着引起异常的单元不能恢复执行;从实现的观点来看,这意味着删除异常单元的活动记录。

C++语言的异常处理:

设置陷阱 try

抛出异常 throw

捕获异常 catch

C++的异常处理语句的格式如下:
try { … }
catch (异常类型1) { 异常1处理程序 }
catch (异常类型2) {异常2处理程序}
……
catch (异常类型n) {异常n处理程序}

协同程序间的控制转移关系:

image-20210413151632600

并发单元

eg:“生产者-消费者”问题

image-20210413151822744

并行与并发的区别

并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。
而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。
从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。

同步问题

正确访问存储区

  • 不会向已满的缓冲区写数据
  • 不会向空缓冲区读数据
动作的“不可分”

append是生产者向缓冲区存数的操作

remove是消费者从缓冲区取数的操作

设t表示所存项目总数

这两个操作都要修改t的值,相应执行操作(1)t:=t+1和(2)t:=t-1来实现。

假定(1)和(2)是这样实现的:
读t到一个专用寄存器;
更新专用寄存器的值;
将专用寄存器的值写到t;

则:

执行(1)时不能执行(2),反之亦然。
即,(1)和(2)必须以互斥的方式执行,(1)或(2)是不可分的操作。