13.07.2015 Views

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

Perl 语言编程 - Linux教程

SHOW MORE
SHOW LESS

Create successful ePaper yourself

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

伸 到 树 的 底 部 ( 象 图 18-2 里 那 样 ) 子 过 程 调 用 者 仍 然 可 以 找 到 第 一 个 操 作 码 。 而 且 这里 不 需 要 解 释 器 回 朔 到 分 析 树 里 寻 找 从 哪 里 开 始 。• 回 合 2: 自 顶 向 下 优 化如 果 你 在 阅 读 一 小 段 <strong>Perl</strong> 代 码 ( 或 者 英 文 文 章 ), 那 么 如 果 你 不 检 查 上 下 文 的 词 法 元素 的 话 , 你 就 无 法 判 断 环 境 。 有 时 候 你 在 获 取 更 多 的 消 息 之 前 无 法 判 断 真 正 将 要 发 生 什么 事 情 。 不 过 , 不 必 害 怕 , 因 为 你 并 不 孤 独 : 编 译 器 也一 样 。 在 这 个 回 合 里 , 在 它 刚 创 建 的 子 树 上 向 回 退 , 以 便 进 行 局 部 优 化 , 最 需 要 注意 的 事 情 是 环 境 传 播 。 编 译 器 用 当 前 节 点 产 生 的 恰 当 的 环 境 ( 空 , 标 量 , 列 表 , 引 用 或者 左 值 等 ) 标 记 到 相 邻 的 下 层 节 点 上 。 不 需 要 的 操 作 码 被 清 空 但 并 不 删 除 , 因 为 现 在 重新 构 造 执 行 顺 序 已 经 太 晚 了 。 我 们 将 依 赖 第 三 回 合 把 他 们 从 第 一 回 合 决 定 了 的 临 时 执 行顺 序 中 删 除 。• 回 合 3: 窥 探 孔 优 化 器有 些 代 码 单 元 有 自 己 的 存 储 空 间 , 它 们 在 里 面 保 存 词 法 范 围 的 变 量 。( 在 <strong>Perl</strong> 的 说 法里 , 这 样 的 空 间 称 为 便 条 簿 (scratchpad))。 这 样 的 单 元 包 括 eval STRING, 子 过程 和 整 个 文 件 。 从 优 化 器 的 角 度 来 说 , 更 重 要 的 是 它 们 1. 有 自 己 的 进 入 点 , 这 就 意 味着 尽 管 我 们 知 道 从 这 里 开 始 的 执 行 顺 序 , 我 们 也 不 知 道 以 前 发 生 过 什 么 , 因 为 这 个 构 造可 能 是 从 其 他 什 么 地 方 调 用 的 。 因 此 如 果 一 个 这 样 的 单 元 被 分 析 器 分 析 完 成 ,<strong>Perl</strong> 就在 那 段 代 码 上 运 行 一 个 窥 探 孔 优 化 器 。 和 前 面 两 个 回 合 不 同 的 是 , 前 面 两 个 回 合 在 分 析树 的 各 个 分 支 上 运 行 , 而 这 个 回 合 是 以 线 性 执 行 顺 序 横 跨 代 码 , 因 为 这 里 基 本 上 是 我 们采 取 这 个 步 骤 的 最 后 的 机 会 了 , 然 后 我 们 就 要 从 分 析 器 上 砍 断 操 作 码 列 表 了 。 大 多 数 优化 已 经 在 头 两 个 回 合 里 完 成 了 , 但 是 有 些 不 行 。最 后 的 分 类 优 化 在 这 个 阶 段 发 生 , 包 括 把 最 后 的 执 行 顺 序 缝 合 在 一 起 , 忽 略 清 空 了的 操 作 码 , 以 及 识 别 什 么 时 候 可 以 把 各 种 操 作 码 缩 减 成 更 简 单 的 东 西 。 识 别 字 串 的 链 接就 是 一 个 非 常 重 要 的 优 化 , 因 为 你 肯 定 不 想 每 次 向 字 串 结 尾 加 一 点 东 西 的 时 候 就 要 到 处拷 贝 字 串 。 这 个 回 合 不 仅 仅 做 优 化 ; 它 还 做 大 量 “ 实 际 ” 的 工 作 : 捕 获 光 字 , 在 有 问 题 的构 造 上 生 成 警 告 信 息 , 检 查 那 些 可 能 无 法 抵 达 的 代 码 , 分 析 伪 哈 希 键 字 , 以 及 在 子 过 程的 原 型 被 编 译 前 寻 找 它 们 。• 回 合 4: 代 码 生 成477

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

Saved successfully!

Ooh no, something went wrong!