第6章 活动记录
把栈帧、逃逸、静态链、调用约定和Tiger过程入口/出口编码为活动记录;用C编译流水线、状态轨迹和端到端验证门交付逃逸集合、帧布局、静态链、调用序列与地址轨迹
学习目标
- 能说明“第6章 活动记录”如何把栈帧、逃逸、静态链、调用约定和Tiger过程入口/出口编码为活动记录,并区分作者C/Java/ML轨道、中文C版与本站重写
- 能先预测“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”会改变哪一个C接口、树/图状态、AST/IR、汇编或运行结果,再操作三类交互证据
- 能只注入“逃逸分析漏标闭包捕获变量,使返回后仍引用失效栈槽”,定位首个偏离“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”的状态,并从同一快照完成恢复
为什么从这个问题开始
“第6章 活动记录”围绕“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”建立贯穿任务:在Tiger C实现轨道中复现“第6章 活动记录”的输入、状态、变换与验证。先写下哪个C接口、树/图状态、AST/IR、汇编或运行结果会最先变化,再运行参考、故障和恢复路径;运行后补理由不算预测。只有守住“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”并交付逃逸集合、帧布局、静态链、调用序列与地址轨迹,单模块测试、编译成功或性能变化才构成机制证据。
原版书目、296个正式坐标与C轨道边界
“第6章 活动记录”以Andrew W. Appel作者官方目录核对 Modern Compiler Implementation 的C、Java、ML三种实现轨道、2部分、21章和Tiger语言附录;以作者C版页面核对Andrew·W·Appel与Maia Ginsburg、Cambridge University Press、C实现轨道、平装ISBN 0-521-60765-5、软件/练习模块与勘误入口,再以Cambridge C版页面核对原版身份。
“第6章 活动记录”以中文版修订版完整目录核对赵克佳、黄春、沈志宇译《现代编译原理:C语言描述(修订版)》,人民邮电出版社,2018年,385页,ISBN 9787115476883。“第6章 活动记录”的正式分母为2个部分标题、21个章标题、1个附录标题、251个编号节/小节、附录4节和17个正式“程序设计”项目,合计296个核心层级;每章重复的推荐阅读与习题不另计。
作者页面可访问不等于允许复制书稿,“第6章 活动记录”不复制、翻译或改写原文、图表、伪码与习题;所有中文讲解、C接口示意、状态轨迹、反例、交互、练习和答案均为独立教学重写。本页独立核对 1只用于核对本页C实现或现代IR边界,不能混入Java/ML轨道或反向证明原书采用本站表述。
原版目录层级与C项目机制
第6章 活动记录
↡活动记录对应正式目录坐标“第6章 活动记录”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 1/17。 原版目录键 第6章 活动记录。在“第6章 活动记录”的第1个正式坐标中,「第6章 活动记录」通过决定变量逃逸、帧布局、静态链和过程调用/返回序列推进活动记录、逃逸与调用约定;复核者保存逃逸集合、帧布局、调用序列、地址与寄存器轨迹,出现捕获变量生命周期、参数位置或调用约定不一致就撤回结论。
6·1 栈帧
↡栈帧对应正式目录坐标“6.1 栈帧”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 2/17。 原版目录键 6.1 栈帧。围绕“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”,“第6章 活动记录”在坐标2把「6·1 栈帧」落实为决定变量逃逸、帧布局、静态链和过程调用/返回序列;只有逃逸集合、帧布局、调用序列、地址与寄存器轨迹可重放且反例排除捕获变量生命周期、参数位置或调用约定不一致,本节点才算掌握。
6·1·1 帧指针
↡帧指针对应正式目录坐标“6.1.1 帧指针”,在“第6章 活动记录”中用于把“帧指针”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 3/17。 原版目录键 6.1.1 帧指针。“第6章 活动记录”的目录节点3「6·1·1 帧指针」不能停在术语或伪码:它要把“帧指针”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,交付第6章 活动记录的输入角色、中间状态、输出、反例与整合证据,并把只复述“帧指针”名称而没有可观察状态、项目实现和恢复验证设为单一反事实。
6·1·2 寄存器
↡寄存器对应正式目录坐标“6.1.2 寄存器”,在“第6章 活动记录”中用于从树覆盖、活跃固定点和干涉图生成已分配目标指令,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 4/17。 原版目录键 6.1.2 寄存器。对“第6章 活动记录”而言,「6·1·2 寄存器」在第4次检查中改变可观察状态,因为它负责从树覆盖、活跃固定点和干涉图生成已分配目标指令;树模式、use/def、in/out、干涉图、着色、溢出与汇编必须与“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受目标语义、活跃边、合并或溢出重写错误。
6·1·3 参数传递
↡参数传递对应正式目录坐标“6.1.3 参数传递”,在“第6章 活动记录”中用于把“参数传递”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 5/17。 原版目录键 6.1.3 参数传递。在“第6章 活动记录”的第5个正式坐标中,「6·1·3 参数传递」通过把“参数传递”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链推进活动记录、逃逸与调用约定;复核者保存第6章 活动记录的输入角色、中间状态、输出、反例与整合证据,出现只复述“参数传递”名称而没有可观察状态、项目实现和恢复验证就撤回结论。
6·1·4 返回地址
↡返回地址对应正式目录坐标“6.1.4 返回地址”,在“第6章 活动记录”中用于把“返回地址”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 6/17。 原版目录键 6.1.4 返回地址。围绕“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”,“第6章 活动记录”在坐标6把「6·1·4 返回地址」落实为把“返回地址”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链;只有第6章 活动记录的输入角色、中间状态、输出、反例与整合证据可重放且反例排除只复述“返回地址”名称而没有可观察状态、项目实现和恢复验证,本节点才算掌握。
6·1·5 栈帧内的变量
↡栈帧内的变量对应正式目录坐标“6.1.5 栈帧内的变量”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 7/17。 原版目录键 6.1.5 栈帧内的变量。“第6章 活动记录”的目录节点7「6·1·5 栈帧内的变量」不能停在术语或伪码:它要决定变量逃逸、帧布局、静态链和过程调用/返回序列,交付逃逸集合、帧布局、调用序列、地址与寄存器轨迹,并把捕获变量生命周期、参数位置或调用约定不一致设为单一反事实。
6·1·6 静态链
↡静态链对应正式目录坐标“6.1.6 静态链”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 8/17。 原版目录键 6.1.6 静态链。对“第6章 活动记录”而言,「6·1·6 静态链」在第8次检查中改变可观察状态,因为它负责决定变量逃逸、帧布局、静态链和过程调用/返回序列;逃逸集合、帧布局、调用序列、地址与寄存器轨迹必须与“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受捕获变量生命周期、参数位置或调用约定不一致。
6·2 Tiger编译器的栈帧
↡Tiger编译器的栈帧对应正式目录坐标“6.2 Tiger编译器的栈帧”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 9/17。 原版目录键 6.2 Tiger编译器的栈帧。在“第6章 活动记录”的第9个正式坐标中,「6·2 Tiger编译器的栈帧」通过决定变量逃逸、帧布局、静态链和过程调用/返回序列推进活动记录、逃逸与调用约定;复核者保存逃逸集合、帧布局、调用序列、地址与寄存器轨迹,出现捕获变量生命周期、参数位置或调用约定不一致就撤回结论。
6·2·1 栈帧描述的表示
↡栈帧描述的表示对应正式目录坐标“6.2.1 栈帧描述的表示”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 10/17。 原版目录键 6.2.1 栈帧描述的表示。围绕“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”,“第6章 活动记录”在坐标10把「6·2·1 栈帧描述的表示」落实为决定变量逃逸、帧布局、静态链和过程调用/返回序列;只有逃逸集合、帧布局、调用序列、地址与寄存器轨迹可重放且反例排除捕获变量生命周期、参数位置或调用约定不一致,本节点才算掌握。
6·2·2 局部变量
↡局部变量对应正式目录坐标“6.2.2 局部变量”,在“第6章 活动记录”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 11/17。 原版目录键 6.2.2 局部变量。“第6章 活动记录”的目录节点11「6·2·2 局部变量」不能停在术语或伪码:它要把语言规则映射到测试、AST、类型、IR、运行时和诊断,交付规则—测试矩阵、AST/类型/IR快照、运行结果与诊断,并把语言规范、内建签名与编译器实现不一致设为单一反事实。
6·2·3 计算逃逸变量
↡计算逃逸变量对应正式目录坐标“6.2.3 计算逃逸变量”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 12/17。 原版目录键 6.2.3 计算逃逸变量。对“第6章 活动记录”而言,「6·2·3 计算逃逸变量」在第12次检查中改变可观察状态,因为它负责决定变量逃逸、帧布局、静态链和过程调用/返回序列;逃逸集合、帧布局、调用序列、地址与寄存器轨迹必须与“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受捕获变量生命周期、参数位置或调用约定不一致。
6·2·4 临时变量和标号
↡临时变量和标号对应正式目录坐标“6.2.4 临时变量和标号”,在“第6章 活动记录”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 13/17。 原版目录键 6.2.4 临时变量和标号。在“第6章 活动记录”的第13个正式坐标中,「6·2·4 临时变量和标号」通过把语言规则映射到测试、AST、类型、IR、运行时和诊断推进活动记录、逃逸与调用约定;复核者保存规则—测试矩阵、AST/类型/IR快照、运行结果与诊断,出现语言规范、内建签名与编译器实现不一致就撤回结论。
6·2·5 两层抽象
↡两层抽象对应正式目录坐标“6.2.5 两层抽象”,在“第6章 活动记录”中用于把“两层抽象”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 14/17。 原版目录键 6.2.5 两层抽象。围绕“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”,“第6章 活动记录”在坐标14把「6·2·5 两层抽象」落实为把“两层抽象”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链;只有第6章 活动记录的输入角色、中间状态、输出、反例与整合证据可重放且反例排除只复述“两层抽象”名称而没有可观察状态、项目实现和恢复验证,本节点才算掌握。
6·2·6 管理静态链
↡管理静态链对应正式目录坐标“6.2.6 管理静态链”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 15/17。 原版目录键 6.2.6 管理静态链。“第6章 活动记录”的目录节点15「6·2·6 管理静态链」不能停在术语或伪码:它要决定变量逃逸、帧布局、静态链和过程调用/返回序列,交付逃逸集合、帧布局、调用序列、地址与寄存器轨迹,并把捕获变量生命周期、参数位置或调用约定不一致设为单一反事实。
6·2·7 追踪层次信息
↡追踪层次信息对应正式目录坐标“6.2.7 追踪层次信息”,在“第6章 活动记录”中用于把“追踪层次信息”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 16/17。 原版目录键 6.2.7 追踪层次信息。对“第6章 活动记录”而言,「6·2·7 追踪层次信息」在第16次检查中改变可观察状态,因为它负责把“追踪层次信息”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链;第6章 活动记录的输入角色、中间状态、输出、反例与整合证据必须与“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”对齐,不能接受只复述“追踪层次信息”名称而没有可观察状态、项目实现和恢复验证。
程序设计:栈帧
↡栈帧对应正式目录坐标“程序设计:栈帧”,在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,并受C接口、内存所有权、状态、目标机与验证边界约束。正式坐标 17/17。 原版目录键 程序设计:栈帧。在“第6章 活动记录”的第17个正式坐标中,「程序设计:栈帧」通过决定变量逃逸、帧布局、静态链和过程调用/返回序列推进活动记录、逃逸与调用约定;复核者保存逃逸集合、帧布局、调用序列、地址与寄存器轨迹,出现捕获变量生命周期、参数位置或调用约定不一致就撤回结论。
先预测,再操作三个C轨道实验
1. C模块、输入与翻译流水线
为“第6章 活动记录”选择正式目录坐标,在参考流水线与单一故障间切换,逐阶段核对接口、状态、输出和不变量。
输入—表示—翻译流水线
第6章 活动记录
选择正式目录坐标,再比较参考编译合同与单一故障的首个状态分岔。
阶段 1/4
第6章 活动记录 · C模块与输入
- 输入
- 在Tiger C实现轨道中复现“第6章 活动记录”的输入、状态、变换与验证
- 变换
- 冻结活动记录、逃逸与调用约定所需的C接口、源程序、规则、数据结构和版本
- 输出证据
- 第6章 活动记录的模块合同、输入快照与所有权表
- 不变量检查
- 第6章 活动记录的类型、所有权、源位置、名字和接口布局没有错位
第6章 活动记录的可重放协议
| 阶段 | 允许动作 | 必留证据 | 拒绝条件 |
|---|---|---|---|
| 第6章 活动记录 · C模块与输入 | 冻结活动记录、逃逸与调用约定所需的C接口、源程序、规则、数据结构和版本 | 第6章 活动记录的模块合同、输入快照与所有权表 | 未满足“第6章 活动记录的类型、所有权、源位置、名字和接口布局没有错位” |
| 第6章 活动记录 · 算法与状态 | 执行把栈帧、逃逸、静态链、调用约定和Tiger过程入口/出口编码为活动记录的最小算法并保存每一步状态 | 第6章 活动记录的参考轨迹、故障轨迹与首个状态分岔 | 未满足“第6章 活动记录每一步可由同一C接口、输入、规则和执行顺序复算” |
| 第6章 活动记录 · 输出与整合 | 比较变换前后AST/IR/汇编/运行时状态和跨模块传递 | 第6章 活动记录的前后差、接口谱系与恢复路径 | 未满足“第6章 活动记录没有把单模块通过或单一样例正确当作端到端正确性” |
| 第6章 活动记录 · 独立验证 | 重放预测、单故障、恢复和不适用边界 | 第6章 活动记录的接受、回退或拒绝理由 | 未满足“第6章 活动记录满足“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”” |
unit: "tbc-unit-06"
question: "变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?"
scenario: "在Tiger C实现轨道中复现“第6章 活动记录”的输入、状态、变换与验证"
invariant: "第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致"
fault: "逃逸分析漏标闭包捕获变量,使返回后仍引用失效栈槽"
evidence: "逃逸集合、帧布局、静态链、调用序列与地址轨迹"
reset: restore_concept_mode_stage_trace_step_case_gates_and_artifact“第6章 活动记录”要求从同一C接口、源程序、规则、数据结构、目标机、预算和执行顺序重放参考、故障与恢复路径。重置后若目录选择、模式、阶段、轨迹步骤、案例、证据门或交付包没有回到基线,本次比较已经混入状态泄漏。
本页回顾
掌握“第6章 活动记录”不是背术语、表格或伪码,而是围绕“变量何时进入寄存器或帧,嵌套函数怎样访问非局部变量?”重建C接口、输入、状态变换、输出、整合和端到端验证,并用“第6章 活动记录的C模块接口、数据结构、状态变换、输出语义与测试始终一致”拒绝“逃逸分析漏标闭包捕获变量,使返回后仍引用失效栈槽”。最终交付为逃逸集合、帧布局、静态链、调用序列与地址轨迹。
练习与答案
练习
- 问题 1:C实现合同。 “第6章 活动记录”为什么必须先冻结C接口、源程序、规则、数据结构、目标机和验证口径?
- 问题 2:目录逐项覆盖。 怎样证明“第6章 活动记录”的正式目录坐标已经进入机制、交互和程序设计项目?
- 问题 3:故障恢复。 怎样证明“逃逸分析漏标闭包捕获变量,使返回后仍引用失效栈槽”已经被修正?
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 活动记录
检索键 tbc-A 对应正式目录坐标「第6章 活动记录」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 栈帧
检索键 tbc-B 对应正式目录坐标「6·1 栈帧」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 帧指针
检索键 tbc-C 对应正式目录坐标「6·1·1 帧指针」;在“第6章 活动记录”中用于把“帧指针”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 寄存器
检索键 tbc-D 对应正式目录坐标「6·1·2 寄存器」;在“第6章 活动记录”中用于从树覆盖、活跃固定点和干涉图生成已分配目标指令,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 参数传递
检索键 tbc-E 对应正式目录坐标「6·1·3 参数传递」;在“第6章 活动记录”中用于把“参数传递”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 返回地址
检索键 tbc-F 对应正式目录坐标「6·1·4 返回地址」;在“第6章 活动记录”中用于把“返回地址”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 栈帧内的变量
检索键 tbc-G 对应正式目录坐标「6·1·5 栈帧内的变量」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 静态链
检索键 tbc-H 对应正式目录坐标「6·1·6 静态链」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- Tiger编译器的栈帧
检索键 tbc-I 对应正式目录坐标「6·2 Tiger编译器的栈帧」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 栈帧描述的表示
检索键 tbc-J 对应正式目录坐标「6·2·1 栈帧描述的表示」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 局部变量
检索键 tbc-K 对应正式目录坐标「6·2·2 局部变量」;在“第6章 活动记录”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 计算逃逸变量
检索键 tbc-L 对应正式目录坐标「6·2·3 计算逃逸变量」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 临时变量和标号
检索键 tbc-M 对应正式目录坐标「6·2·4 临时变量和标号」;在“第6章 活动记录”中用于把语言规则映射到测试、AST、类型、IR、运行时和诊断,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 两层抽象
检索键 tbc-N 对应正式目录坐标「6·2·5 两层抽象」;在“第6章 活动记录”中用于把“两层抽象”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 管理静态链
检索键 tbc-O 对应正式目录坐标「6·2·6 管理静态链」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 追踪层次信息
检索键 tbc-P 对应正式目录坐标「6·2·7 追踪层次信息」;在“第6章 活动记录”中用于把“追踪层次信息”放进活动记录、逃逸与调用约定的C接口—状态—变换—验证链,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。
- 栈帧
检索键 tbc-Q 对应正式目录坐标「程序设计:栈帧」;在“第6章 活动记录”中用于决定变量逃逸、帧布局、静态链和过程调用/返回序列,需要连接C轨道范围、状态轨迹、整合证据和不适用边界。