12.07.2015 Views

第七章运行时的存储分配

第七章运行时的存储分配

第七章运行时的存储分配

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

北 京 大 学 信 息 科 学 技 术 学 院2011 年 春 季 学 期 《 编 译 技 术 》第 七 章运 行 时 的 存 储 分 配Run-time Storage Allocation


静 态 存 储 区存 储 空 间 可 划 分 为 两 个 区 域 : 静 态 区 和 动 态 区 。静 态 存 储 区 : 存 储 生 命 周 期 和 整 个 程 序 执 行 时 间 相等 的 对 象 。静 态 存 储 区 的 特 点 是 , 其 分 配 确 定 后 直 到 程 序 执 行完 之 前 都 不 会 修 改 。 该 区 可 以 细 分 为 目 标 代 码 区 、常 数 区 、 静 态 数 据 区 和 库 代 码 区 。一 般 而 言 , 程 序 代 码 和 常 量 都 不 能 修 改 , 所 以 目 标代 码 区 、 常 数 区 和 库 代 码 区 通 常 是 只 读 区 , 静 态 数据 区 是 可 读 可 写 区 。分 配 在 静 态 存 储 区 的 每 个 对 象 地 址 在 编 译 的 连 接 装配 阶 段 就 可 以 确 定 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院5


动 态 存 储 区 动 态 存 储 区 : 存 储 生 命 周 期 和 其 所 属 的 函 数执 行 时 间 相 等 或 由 用 户 决 定 的 对 象 。 动 态 存 储 区 的 特 点 是 , 在 程 序 执 行 过 程 中 各对 象 的 存 储 位 置 会 不 断 地 修 改 。 动 态 区 可 以 细 分 为 栈 区 (Stack) 和 堆 区 (Heap)• 分 配 在 栈 中 的 对 象 要 满 足 “ 先 进 后 出 ” 的 原 则 ,即 先 分 配 到 存 储 空 间 的 对 象 要 后 释 放 所 分 到 的存 储 空 间 。 栈 区 用 于 存 储 非 静 态 局 部 变 量 的 值等 ;• 分 配 在 堆 中 的 对 象 分 配 到 存 储 空 间 和 释 放 所 分到 的 存 储 空 间 的 次 序 是 任 意 的 , 堆 用 于 存 储 动态 变 量 的 值 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院6


目 标 代 码 区常 数 区静 态 数 据 区库 代 码 区静 态 存 储 区栈动 态 存 储 区堆2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院7


活 动 记 录 子 程 序 ( 函 数 或 过 程 ) 的 一 次 执 行 ( 由 于 被调 用 而 引 发 ), 称 为 子 程 序 的 一 次 活 动(activity)。 子 程 序 执 行 时 所 用 到 的 信 息 ( 除 去 全 局 变 量、 静 态 变 量 等 ) 存 储 在 一 个 地 址 连 续 的 存 储块 内 , 这 个 存 储 块 称 为 活 动 记 录 (activityrecord)。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院8


返 回 地 址活 动 记 录 的 结 构返 回 值 • 控 制 链 ( 可 选 ): 指 向 调 用 过实 在 参 数程 活 动 的 活 动 记 录 。控 制 链 • 存 取 链 ( 可 选 ): 指 向 本 活 动存 取 链 要 访 问 的 非 局 部 数 据 所 在 的活 动 记 录 。机 器 状 态• 机 器 状 态 : 调 用 过 程 活 动 在调 用 点 的 机 器 状 态 , 包 括 指令 计 数 器 (PC),, 各 种 寄 存 器局 部 数 据等 的 值 。• 局 部 数 据 : 子 程 序 定 义 的局 部 变 量 。临 时 数 据 • 临 时 数 据 : 存 储 子 表 达 式 值2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院9


活 动 记 录 示 例例 如 一 个 PASCAL 语 言 的 过 程 如 下 :PROCEDURE sub(x, y: real);VARi, ,j: integer;a: ARRAY[1..5] OF real;e, f: real;BEGINf: := e+i*j;END;2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院10


PROCEDURE sub(x, y: real);VARi, j: integer;a: ARRAY[1..5] OF real;e, f: real;BEGINf := e+i*j;END;符 号 表活 动 记 录 布 局(sp,0)(sp,1)(sp,2)(sp,3)(sp,20)(sp,21)(sp 22)返 回 值 无xy名 字 形 类 型 偏 移 量ix 形 real 1jy 形 real 2(sp,22)i int 20aj int 21(sp,27)ea array 22(sp,28) fe real 27f real 28 设 sp 指 向 局 部 数 据 的 起 始 位 置2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院…11


中 间 代 码 示 例语 句 f:=e+i*j 的 中 间 代 码 形 式* i j t1 * (sp, 20) )(sp, 21) )(sp, 29)+ e t1 t2 + (sp, 27) (sp, 29) (sp, 30)itor t2 - t3 itor (sp, 30) – (sp, 31):= t3 f := (sp, 31) (sp, 28)• 编 译 结 束 时 , 知 道 每 个 过 程 的 活 动 记 录 的 长 度 , 将 其填 写 到 相 应 的 过 程 表 中 。• 运 行 时 , 调 用 哪 个 过 程 , 就 在 运 行 栈 顶 , 推 进 那 个 过程 的 活 动 记 录 ( 栈 箭 头 加 上 活 动 记 录 长 度 )。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院12


72 7.2 存 储 分 配 策 略影 响 存 储 分 配 策 略 的 语 言 特 征• 过 程 能 否 递 归• 当 控 制 从 过 程 的 活 动 返 回 时 , 局 部 变 量 的 值是 否 要 保 留• 过 程 能 否 访 问 非 局 部 变 量• 过 程 调 用 的 参 数 传 递 方 式• 过 程 能 否 作 为 参 数 被 传 递• 过 程 能 否 作 为 结 果 值 传 递• 存 储 块 能 否 在 程 序 控 制 下 动 态 地 分 配• 存 储 块 是 否 必 须 显 式 地 释 放2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院13


局 部 存 储 分 配 策 略 局 部 数 据 的 安 排• 字 节 (Byte) 是 可 编 址 内 存 的 最 小 单 位• 变 量 所 需 的 存 储 空 间 可 以 根 据 其 类 型 而 静 态 确定• 一 个 过 程 所 声 明 的 局 部 变 量 , 按 这 些 变 量 声 明时 出 现 的 次 序 , 在 局 部 数 据 域 中 依 次 分 配 空 间• 局 部 数 据 的 地 址 可 以 用 相 对 于 某 个 位 置 的 地 址来 表 示• 数 据 对 象 的 存 储 安 排 还 要 考 虑 对 齐 (Alignment)问 题2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院14


局 部 数 据 分 配 : 对 齐 (alignment) 在 SPARC/Solaris 工 作 站 上 下 面 两 个 结 构 的size 分 别 是 24 和 16, 为 什 么 不 一 样 ?typedef struct _a{ typedef struct _b{}a;char c1; 0char c1;long i; 4char c2;char c2; 8long i;double f; 16double f;}b;0148Double 占 8 个 字 节 (64 位 )2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院15


局 部 数 据 分 配 : 对 齐 (alignment) 在 x86/Linux 机 器 的 结 果 和 SPARC/Solaris 工作 站 不 一 样 , 是 20 和 16。typedef struct _a{ typedef struct _b{}a;char c1; 0char c1;long i; 4char c2;char c2; 8long i;double f; 12double f;}b;0148Double 占 8 个 字 节 (64 位 )2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院16


全 局 存 储 分 配 策 略 介 绍 程 序 运 行 时 所 需 的 各 个 活 动 记 录 在 存 储空 间 的 分 配 策 略 描 述 过 程 的 目 标 代 码 怎 样 访 问 绑 定 到 局 部 名字 的 存 储 单 元 介 绍 三 种 分 配 策 略• 静 态 分 配 策 略• 栈 式 分 配 策 略• 堆 式 分 配 策 略2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院17


静 态 存 储 分 配 名 字 在 程 序 被 编 译 时 绑 定 到 存 储 单 元 , 不 需要 运 行 时 的 任 何 支 持 绑 定 的 生 存 期 是 程 序 的 整 个 运 行 期 间 控 制 再 次 进 入 该 过 程 时 , 局 部 变 量 的 值 和 控制 上 一 次 离 开 时 的 一 样 每 个 过 程 活 动 记 录 的 大 小 是 固 定 的 过 程 调 用 时 保 存 信 息 的 地 址 在 编 译 时 也 是 已知 的2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院18


静 态 存 储 分 配 策 略 静 态 分 配 给 语 言 带 来 限 制• 在 编 译 时 刻 需 要 知 道 数 据 目 标 的 大 小 和 它 们 在内 存 位 置 上 的 约 束 ;• 不 支 持 递 归 调 用 过 程 ;• 不 能 动 态 地 建 立 数 据 结 构 。 标 准 FORTRAN 语 言 使 用 静 态 存 储 分 配 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院19


例 : 静 态 存 储 分 配 (Fortran)子 程 序 列 表NameMPQRLNSize1K3K1K1K2K1K调 用 关 系S 2K活 动 记 录 分 配T2K注 :M 为 主 程 序M P Q RL N S T876543210T (2K)6 S(2K)P (3K)N (1K)M (1K)R (1K)Q (1K)L (2K)2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院20


动 态 栈 式 存 储 分 配 将 整 个 程 序 的 数 据 空 间 设 计 为 一 个 栈 。• 每 当 调 用 一 个 过 程 时 , 它 所 需 的 数 据 空 间 分 配在 栈 顶 ; 过 程 完 成 时 就 释 放 这 部 分 空 间 。• 过 程 所 需 的 空 间 包 括 :本 过 程 活 动 中 所 需 的 局 部 变 量 、 参 数 单 元 、 临 时 变量调 用 该 过 程 的 那 个 过 程 的 活 动 相 关 的 机 器 状 态 信 息也 需 要 保 持 到 栈 里 。• 通 过 控 制 链 表 示 过 程 之 间 的 调 用 关 系• 可 以 用 于 函 数 的 递 归 调 用• 适 用 于 Pascal, C/C++ 等 语 言 的 实 现 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院21


例 : 栈 式 存 储 分 配int fact(int k)fact{参 数 k = 0if(k==0)控 制 链return 1;elsefactreturn k*fact(k‐1);参 数 k = 1}控 制 链factvoid main()参 数 k = 2{控 制 链int n;factprintf("Enter a number:");参 数 k = 3scanf("%d",&n);控 制 链printf(“Results =%d\n %d\n",mainfact(n));局 部 变 量 n = 3}控 制 链计 算 阶 乘 的 C 程 序2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院22


动 态 堆 式 存 储 分 配 栈 式 分 配 策 略 在 下 列 情 况 下 行 不 通 :• 过 程 活 动 停 止 后 , 局 部 名 字 的 值 还 必 须 维 持• 被 调 用 者 的 活 动 比 调 用 者 的 活 动 活 得 时 间 更 长 ,此 时 不 能 正 确 描 绘 程 序 的 控 制 流• 不 遵 守 栈 式 规 则 的 有 Pascal 语 言 和 C 语 言 的 动 态变 量• Java 禁 止 程 序 员 自 己 释 放 空 间 堆 式 存 储 分 配 : 运 行 时 在 堆 中 进 行 存 储 分 配• 堆 (heap): 若 干 个 可 供 分 配 的 存 储 块 构 成 的 序列2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院23


堆 式 存 储 分 配 过 程 堆 分 配 可 以 采 用 不 同 的 分 配 策 略• 最 佳 适 配 : 把 所 有 长 度 大 于 或 等 于 N 的 可 用 块 中长 度 最 小 者 作 为 待 分 配 块 。• 首 先 适 配 : 把 构 成 堆 的 可 用 块 序 列 中 的 第 一 个 长度 大 于 或 等 于 N 的 作 为 待 分 配 块 。• 最 大 适 配 : 把 所 有 长 度 大 于 或 等 于 N 的 可 用 块 中长 度 最 大 者 作 为 待 分 配 块 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院24


堆 式 存 储 回 收 过 程 堆 分 配 的 空 间 需 要 进 行 重 复 利 用 ( 回 收 )• 可 以 通 过 程 序 员 编 写 命 令 显 式 执 行 ( 例 如 free)• 也 可 以 系 统 自 动 回 收 : 垃 圾 回 收 垃 圾 回 收 (garbage collection) 算 法• Mark-Sweep• 伙 伴 系 统2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院25


小 结 : 分 配 策 略 的 应 用 实 际 应 用 中 , 经 常 用 同 时 用 到 多 种 策 略 。 比 如 , 在 C 语 言 的 编 译 系 统 中 :• 对 于 目 标 代 码 、 全 局 变 量 、 静 态 变 量 等 采 用 静态 存 储 分 配 ;• 对 于 被 调 用 函 数 的 活 动 记 录 , 采 用 动 态 栈 式 存储 分 配 ;• 对 于 由 malloc 生 成 的 动 态 变 量 , 采 用 动 态 堆 式 存储 分 配 方 法 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院26


73 7.3 数 据 的 访 问 方 法对 全 局 变 量 和 静 态 变 量 的 访 问• 地 址 形 式 可 以 是 直 接 地 址 ;• 也 可 以 是 R, offset 形 式 ,R 的 值 与 offset 之 和为 实 际 地 址R 的 值 是 静 态 区 开 始 地 址 ,offset 是 变 量 等 数 据 对象 相 对 于 静 态 区 开 始 地 址 的 偏 移 量对 动 态 变 量 的 访 问• 动 态 变 量 是 通 过 调 用 new ( 或 类 似 的 语 言 工 具 )生 成 , 并 且 被 动 态 地 分 配 在 堆 中• 动 态 变 量 的 地 址 可 以 存 入 某 寄 存 器 r 内 , 采 用 地址 形 式 为 r2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院27


对 不 允 许 子 程 序 嵌 套 的 局 部 变 量 访 问局 部 变 量 的 地 址 形 式 为 R, offset。• R 的 值 是 活 动 记 录 的 起 始 地 址 ,• offset 是 该 局 部 变 量 相 对 于 活 动 记 录 起 始 地 址 的偏 移 量 , 可 以 在 编 译 时 计 算 。• R 的 值 与 offset 之 和 为 该 局 部 变 量 的 实 际 地 址 。当 调 用 子 程 序 p 时 , 在 栈 中 为 p 的 活 动 记 录分 配 存 储 空 间 , 把 该 存 储 空 间 始 址 赋 给 R。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院28


对 嵌 套 子 程 序 中 外 层 变 量 的 访 问 静 态 作 用 域 ( 或 称 词 法 作 用 域 ) 规 则• Pascal 语 言 中 , 一 个 过 程 或 函 数 除 了 可 以 访 问自 身 的 变 量 及 形 式 参 数 之 外 , 还 可 以 访 问 包 含该 过 程 或 函 数 的 所 有 外 层 过 程 和 函 数 说 明 的 变量 及 形 式 参 数 。• 需 要 外 层 子 程 序 活 动 记 录 地 址 可 以 采 用 的 方 法 :• 存 取 链 法• display 表 法 不 考 虑 子 过 程 作 为 参 数 的 情 况2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院29


一 个 PASCAL 程 序 b iprocedure P (px: integer;py: real);var i : integer; r : real;procedure P0(p0x: integer);beginwrite (i+p0x)end;procedure P1(p1x : boolean;p1y: integer);var j: integer;function F(fx : real): integer;var x : integer;P0beginif p1x thenx := fx*10+ py-relse x: = j+p1y+i-px;P0(x);F:=x+10end;beginif p1x then j := f(p1y+20)+ielse j := f(p1y-10)-r;write (j)end;beginread(i); read(r);i := i+px; r := r+p1y;p1(i>r ,i*r)end;2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院FP1P30


子 程 序 和 局 部 变 量 的 嵌 套 层 次嵌 套 层 次 是 子 程 序 和 局 部嵌 套 层 次 : 1 2 3 4变 量 的 的 重 要 属 性• 定 义 主 程 序 ( 可 以 看 成 是 最外 层 的 子 程 序 ) 的 嵌 套 层 次为 1, 被 嵌 套 层 次 为 n 的 子 程序 ( 包 括 主 程 序 ) 直 接 包 含的 子 程 序 的 嵌 套 层 次 为 n+1• 局 部 变 量 ( 包 括 形 式 参 数 )的 嵌 套 层 次 定 义 为 说 明 该 变量 的 子 程 序 的 嵌 套 层 次 。MPP0P1 F2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院31


存 取 链 法 存 取 链 法 就 是 利 用 子 程 序 的 活 动 记 录 中 存取 链 获 取 该 子 程 序 可 以 访 问 的 外 层 子 程 序活 动 记 录 的 地 址 。• 存 取 链 的 访 问• 存 取 链 的 建 立 存 取 链 又 称 作 是 静 态 链 , 相 应 地 , 可 以 把控 制 链 称 作 是 动 态 链 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院32


存 取 链 示 例M M M M---P存 取 链i, r1 2 3 4P0PM P1 F---P存 取 链i, rP1存 取 链j---P存 取 链i, rP1存 取 链jF存 取 链x---P存 取 链i, rP1存 取 链jF存 取 链xP0存 取 链2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院33


非 局 部 名 字 的 访 问假 定 过 程 P 的 嵌 套 深 度 为 m, 它 引 用 嵌 套 深 度 为 n的 变 量 a,n m。 如 何 访 问 a 的 存 储 单 元 ?嵌 套 层 次 : 1 2 3 4• 从 栈 顶 的 活 动 记 录 开 始 , 追踪 访 问 链 (m-n) 次• 到 达 a 的 声 明 所 在 过 程 的 活 动记 录• 存 取 链 的 追 踪 用 间 接 操 作 就可 完 成MPP0P1 F2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院34


存 取 链 示 例M M M M---P存 取 链i, r1 2 3 4P0PM P1 F---P存 取 链i, rP1存 取 链j---P存 取 链i, rP1存 取 链jF存 取 链x---P存 取 链i, rP1存 取 链jF存 取 链xP0存 取 链2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院35


存 取 链 的 建 立假 定 嵌 套 深 度 为 m 的 过 程 P 调 用 嵌 套 深 度 为 n 的 过 程 Qm < n 的 情 况• Q 肯 定 就 声 明 在 P 中• 被 调 用 过 程 的 访 问 链 必 须 指 向 调 用 过 程 的 活 动 记 录的 访 问 链m n 的 情 况• P 和 Q 的 嵌 套 深 度 分 别 为 1,2,…,n, , , 1 的 外 围 过 程肯 定 相 同• 追 踪 访 问 链 (m n + 1) 次 , 到 达 了 静 态 包 围 Q 和 P 的且 离 它 们 最 近 的 那 个 过 程 的 最 新 活 动 记 录• 所 到 达 的 访 问 链 就 是 Q 的 活 动 记 录 中 的 访 问 链 应 该指 向 的 那 个 访 问 链2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院36


Display 表 法 当 进 入 一 个 过 程 后 , 在 建 立 其 活 动 记 录 区 的同 时 建 立 一 张 嵌 套 层 次 显 示 表 display, 把display 表 作 为 活 动 记 录 的 一 部 分 。 令 过 程 R 的 外 层 为 Q,Q 的 外 层 为 主 程 序 为 P,则 过 程 R 运 行 时 的 Display 表 内 容 为 :2 R 的 现 行 活 动 记 录 的地 址 (SP 的 现 值 )1 Q 的 最 新 活 动 记 录 的地 址0 P 的 活 动 记 录的 地 址2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院37


Display 表 的 维 护 设 P 调 用 Q,Q 的 嵌 套 层 次 是 n。1. 首 先 在 栈 中 为 Q 分 配 活 动 记 录 空 间 , 接 着 把display[n] 的 原 来 值 写 入 Q 活 动 记 录 中 的 存取 链 域• 所 有 的 存 取 链 域 都 改 成 保 存 display[i] 的 值2. 最 后 再 把 Q 的 活 动 记 录 地 址 写 入 display[n]3. 在 执 行 完 Q 返 回 之 前 , 把 存 取 链 域 的 值 写 回display[n]2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院38


过 程 调 用 和 返 回 的 处 理 需 要 对 活 动 记 录 进 行 压 栈 和 弹 栈 栈 顶 活 动 记 录 用 两 个 指 针 top 和 sp 指 示• top 指 向 栈 顶 ;• sp 指 向 栈 顶 活 动 记 录 的 开 始 位 置 , 用 于 访 问 局 部数 据 ;机 器 状 态 域spold sp活 动 记 录top局 部 数 据2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院39


过 程 调 用 序 列激 活 一 个 过 程 的 活 动 是 执 行 过 程 语 句 的 结果 。 过 程 语 句p(e 1 ,e 2 ,……,e n )的 目 标 代 码 ( 调 用 序 列 ) 完 成 如 下 任 务 :1. 调 用 者 对 实 在 参 数 求 值 , 并 把 它 们 传 送 给 被 调用 过 程 的 活 动 记 录 的 参 数 域 ;2. 调 用 者 在 被 调 用 者 的 活 动 记 录 中 存 放 返 回 地 址和 老 的 sp 值 。 之 后 调 用 者 修 改 sp 值 ;3. 被 调 用 者 存 放 寄 存 器 值 和 其 它 状 态 信 息 ;4. 被 调 用 者 初 始 化 其 局 部 数 据 并 开 始 执 行 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院40


过 程 返 回 序 列 return 目 标 代 码 完 成 的 任 务 是 :1. 被 调 用 者 在 自 己 的 活 动 记 录 的 返 回 值 域 中 放 一个 返 回 值 ;2. 利 用 状 态 域 中 的 信 息 , 被 调 用 者 恢 复 sp 和 其 它寄 存 器 , 并 且 按 返 回 地 址 转 移 到 调 用 者 的 代 码之 中 ;3. 调 用 者 复 制 返 回 值 到 自 己 的 活 动 记 录 中 。任 务 的 划 分 , 根 据 源 语 言 、 目 标 机 器 和 操 作 系 统等 具 体 情 况 而 定 。上 述 任 务 , 由 运 行 支 持 子 程 序 完 成 , 可 视 为 虚 机指 令 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院41


可 变 长 度 的 数 据源 程 序 的 例 子PROCEDURE exam(k,m,n:integer);VARa:array [1..k] of real;b:array [1..m] of real;c:array [1..n] of real;BEGIN……END;编 译 时 , 不 知 a,b,c 的 大 小 , 仅 对 每 个 数 组 设 置 一个 指 针 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院42


例 : 动 态 分 配 的 数 组sptoptopControl linkabcarray aarray barray cP 的 活 动 记 录P 的 动 态 数 组2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院43


动 态 作 用 域被 调 用 过 程 的 非 局 部 名 字 a 和 它 在 调 用 过 程 中 引 用的 是 同 样 的 存 储 单 元• 仅 为 被 调 用 过 程 的 局 部 名 字 建 立 新 的 绑 定 , 指 向 这 些 名字 在 被 调 用 过 程 的 活 动 记 录 中 占 用 的 存 储 单 元实 现 动 态 作 用 域 的 方 法• 深 访 问 : 用 控 制 链 搜 索 运 行 栈 , 寻 找 包 含 该 非 局 部 名 字的 第 一 个 活 动 记 录• 浅 访 问 为 每 个 名 字 在 静 态 分 配 的 存 储 空 间 中 保 存 它 的 当 前 值当 过 程 p 的 新 活 动 出 现 时 ,p 的 局 部 名 字 n 使 用 在 静 态 数据 区 分 配 给 n 的 存 储 单 元 。n 的 先 前 值 可 以 保 存 在 p 的 活动 记 录 中 , 当 p 的 活 动 结 束 时 再 恢 复2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院44


动 态 作 用 域 的 例 子program dynamic (input,output);var r: real;procedure show; 在 静 态 作 用 域 之 下 ,begin write (r: 5:3) end; 程 序 的 输 出 为 :procedure small;0.250 0.250var r: real;0.250 0.250begin r :=0.125; show end;begin在 动 态 作 用 域 之 下 ,r :=0.25;输 出 为 :show; small; writeln;0.250 0.125show; small; writeln0.250 0.125end.2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院45


74 7.4 参 数 传 递 实 在 参 数 和 形 式 参 数 结 合 的 方 法 :• 传 值 调 用 (call-by-value) 把 实 参 的 值 传 给 形 参• 引 用 调 用 (call-by-reference) 对 形 参 的 引 用 就是 对 实 参 的 引 用 , 把 实 参 的 地 址 传 给 形 参• 复 制 恢 复 (copy-restore) 把 实 参 的 地 址 值 和 传给 形 参 , 返 回 时 再 把 形 参 的 值 传 给 实 参• 传 名 调 用 (call-by-name) 逻 辑 上 把 形 参 名 字 改成 实 参 名 字 ( 也 称 换 名 调 用 )。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院46


传 值 调 用 把 形 参 当 作 所 在 过 程 的 局 部 名 看 待 , 形 参 的存 储 单 元 在 该 过 程 的 活 动 记 录 中 调 用 过 程 计 算 实 参 , 并 把 它 们 的 值 放 入 形 参的 存 储 单 元 中2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院47


传 值 调 用 的 例 子program callbyvalue l (input, output);t)var a, b: integer;procedure swap (x, y: integer);var temp: integer;x := 1begin temp :=x;y := 2x :=y;temp := xx := yy :=tempy := tempend;begina:=1; b:=2; 程 序 输 出 :swap (a, b);writeln ( 'a=', a, 'b=', b)a=1 b=2end.2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院48


引 用 调 用把 实 在 参 数 的 地 址 传递 给 相 应 的 形 式 参 数在 目 标 代 码 中 , 在 被调 用 过 程 中 对 形 式 参数 的 一 次 引 用 就 成 为对 传 递 给 被 调 用 过 程的 指 针 的 一 个 间 接 引用 。Referencea 1b 2xswapa的 指 针 的 一 个 间 接 引 y btemp2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院49


引 用 调 用 的 例 子program reference (input, output);var a, b: integer;procedure swap (var x, y: integer);var temp: integer;begin temp :=x;x:=y;y :=tempend;beginend.temp:=a;a:= b;b:=temp;a:=1; b:=2; 程 序 输 出swap (a, b);:writeln ( 'a=‘, a, 'b=', b)a=2 b=12011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院50


复 制 恢 复 Copy-Restore 传 值 调 用 和 引 用 调 用 的 混 合 复 制 恢 复 的 实 现 :• 当 控 制 流 入 到 被 调 用 过 程 之 前 , 把 实 在 参 数 的值 和 地 址 传 递 到 被 调 用 过 程 中 ;• 当 控 制 返 回 时 , 把 形 式 参 数 的 现 行 值 复 制 回 到相 应 的 实 在 参 数 的 左 值 中 。2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院51


复 制 恢 复 的 例 子program copyout (input, output);var a : integer;procedure unsafe (var x : integer);beginx := 2;a:=0end;begina := 1;unsafe (a);writeln (‘a=’, a)end.采 用 引 用 调 用 的 程序 输 出 :a=0采 用 复 制 恢 复 的 程序 输 出 :a=22011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院52


传 名 调 用传 名 调 用 由 Algol 中 的 复 制 规 则 (copy-rule) 定 义为 :• 过 程 被 当 作 宏 对 待 。 过 程 调 用 的 作 用 相 当 于 把 被 调用 过 程 的 过 程 体 宏 扩 展 到 调 用 出 现 的 地 方procedure swap(var x, y: integer);var temp: integer;begin调 用 swap(i, a[i])temp := x; temp:= i;x := y;i:=a[i];y := temp a[i]:=temp;end2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院53


本 章 小 结 过 程 调 用 时 会 在 内 存 中 创 建 相 应 的 活 动 记 录• 存 取 链• Display 表 存 储 分 配 的 不 同 策 略• 静 态 分 配• 栈 式 分 配• 堆 式 分 配 非 局 部 数 据 访 问 的 实 现 方 法 掌 握 参 数 传 递 的 不 同 方 式2011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院54


作 业 P151• 7.1, 7.2, 7.3, 7.42011 年 春 季 学 期 《 编 译 技 术 》 课 程 北 京 大 学 信 息 科 学 技 术 学 院55

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!