编译原理第九章

第九章复习题
单选
FORTRAN这样的语言,不允许过程递归,不含可变体积的数据对象或待定性质的名称,能在编译时完全确定其程序的每个数据对象在运行时存储空间的位置,可采用(A)。
A 静态分配策略
B 栈式分配策略
C 堆式分配策略
D 以上都有

C语言,允许递归过程,还允许用户动态地申请和释放存储空间,应采用以下哪种存储分配策略(B)。
A 静态分配策略
B 栈式分配策略
C 堆式分配策略
D 以上都有

嵌套过程语言的程序,内层过程引用非局部量可通过(B)跟踪外层过程最新活动记录的位置。
A 老SP
B 静态链
C Previous链
D 全局display

关于全局display正确的是(C)。
A 记录全局变量在存储器中的位置
B 记录直接外层过程活动记录的基地址
C 记录主调过程display表的基地址
D 记录外层过程display表的基地址

关于嵌套层次表display表描述正确的是(D)。
A 过程的层数为i,则display表有i个单元
B display表只有一个单元
C display表存放主调过程display表的位置
D display表存放各个外层过程最新活动记录的基地址

判断
过程活动的生存期可以重叠。错误

过程活动的生存期可以嵌套。正确

用一个连续的存储块存放管理过程的活动所需要的信息,称这样的连续存储块为活动记录。正确

栈式存储分配中,SP指针指向栈顶。错误

活动记录中的“老SP”是指向外层过程最新活动记录基地址的指针。错误

嵌套过程语言的程序,主程序的嵌套层次(简称为层数)定义为1。错误

过程的层数为i,则display表有i+1个单元。正确

过程嵌套层次显示表的生成与主调过程没有任何关系。错误

可以通过主调过程的display表来生成被调过程的display表。正确
利用display表来实现对非局部量的访问比利用静态链更高效。正确

作者:jsx_SEVEN
来源:优快云
原文:https://blog.youkuaiyun.com/jsx_SEVEN/article/details/92806251
版权声明:本文为博主原创文章,转载请附上博文链接!

### 关于编译原理第九章课后题解析 #### 背景概述 编译原理第九章主要涉及 **运行时存储空间组织** 的相关内容,包括活动的概念、参数传递方式、活动记录定义及包含内容、静态链、动态链以及非局部名字访问的方式等内容[^3]。这些知识点通常会通过具体的例子和练习来加深理解。 --- #### 主要知识点回顾 1. **活动 (Activation)** 活动是指程序执行过程中函数调用的一个实例。每次函数被调用都会创建一个新的活动记录。活动记录包含了该次调用所需的信息,如返回地址、形参值、局部变量等。 2. **参数传递方式** 参数传递主要包括按值传递(Call by Value)、按引用传递(Call by Reference)、按名称传递(Call by Name)等方式。不同的传递方式会影响程序的行为和性能。 3. **活动记录的内容** 活动记录一般包括以下几个部分: - 返回地址 - 上一帧指针(用于支持嵌套调用) - 局部变量区 - 形参区 - 临时变量区 4. **静态链与动态链** - 静态链:用于解决嵌套作用域中的非局部变量访问问题。 - 动态链:用于跟踪当前活跃的活动记录栈。 5. **非局部名字访问** 访问非局部名字有两种常见方法:一种是通过静态链逐层查找;另一种是利用显示声明机制提前绑定非局部名字到具体位置。 --- #### 可能的课后题目类型及解答思路 以下是基于第九章核心知识点可能设计的一些典型课后题及其解题思路: ##### 类型 1: 设计活动记录并解释其组成部分 **题目示例**: 给定一段伪代码,要求为其设计一个完整的活动记录,并说明各字段的作用。 **解答思路**: - 明确给定代码中有哪些需要保存的数据项(如返回地址、局部变量、形参等)。 - 结合教材中关于活动记录的标准结构,逐一列出各个字段及其用途。 - 使用格或图形示活动记录的具体布局。 ```plaintext | 字段名 | 描述 | |--------------|--------------------------| | 返回地址 | 存储调用者下一条指令的位置 | | 上一帧指针 | 指向父活动记录 | | 局部变量区 | 存放本函数内的局部变量 | | 形参区 | 存放实际传入的参数 | | 临时变量区 | 存放计算过程中的中间结果 | ``` ##### 类型 2: 分析不同参数传递方式的影响 **题目示例**: 对同一段代码分别采用按值传递和按引用传递两种方式进行模拟执行,并比较两者的差异。 **解答思路**: - 构造测试数据,逐步模拟每种参数传递方式下的执行流程。 - 利用图展示内存变化情况,突出两者的主要区别。 ```python def modify(x, y): x += 10 y = y * 2 return x, y a = 5 b = 3 result_call_by_value = modify(a, b) # 修改不影响原始变量 print(f"Call by value: a={a}, b={b}") # 输出原值不变 c = [5] d = [3] modify(c[0], d[0]) # 修改影响原始列内容 print(f"Call by reference: c={c}, d={d}") ``` ##### 类型 3: 实现静态链或动态链的功能 **题目示例**: 编写一小段代码实现静态链功能,能够正确访问嵌套作用域中的非局部变量。 **解答思路**: - 定义一个简单的嵌套函数场景。 - 在内部函数中引入外部变量,并通过显式的静态链指向完成访问操作。 ```python class StaticLinkRecord: def __init__(self, static_link=None, local_vars={}): self.static_link = static_link self.local_vars = local_vars def outer(): record_outer = StaticLinkRecord(local_vars={'x': 10}) def inner(): nonlocal record_outer record_inner = StaticLinkRecord(static_link=record_outer, local_vars={'y': 20}) # Accessing the non-local variable 'x' via static link print(record_inner.static_link.local_vars['x']) inner() outer() ``` --- #### 总结 以上是对编译原理第九章课后题相关资料及答案的部分探讨。由于具体题目未提供,仅列举了几类常见的习题形式及其解决方案供参考。如果需要更详细的解析或者特定类型的题目讲解,请进一步明确需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值