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.

• 递 归 词 法 填 充 堆 栈 (recursive lexical pad stacks)当 子 过 程 被 递 归 地 调 用 时 词 法 变 量 和 其 他 “ 原 始 寄 存 器 ” 存 放 的 地 方 。当 然 , 还 有 存 放 所 有 C 变 量 的 C 堆 栈 。<strong>Perl</strong> 实 际 上 力 图 避 免 依 赖 C 的 堆 栈 存 储 保 存 的数 值 , 因 为 longjmp(3) 忽 略 了 这 样 的 数 值 的 合 理 的 恢 复 。所 有 的 这 些 就 是 说 , 我 们 对 解 释 器 的 通 常 的 看 法 : 一 个 解 释 另 外 一 个 程 序 的 程 序 , 是 非 常 不足 以 描 述 其 内 部 的 真 正 情 况 的 。 的 确 , 它 的 内 部 是 一 些 C 的 代 码 实 现 了 一 些 操 作 码 , 但 当我 们 提 到 “ 解 释 器 ” 的 时 候 , 我 们 所 说 的 含 义 要 比 上 面 这 句 话 更 多 些 , 就 好 象 我 们 谈 到 “ 音 乐家 ” 时 , 我 们 说 的 含 义 可 不 仅 仅 是 一 个 可 以 把 符 号 转 换 成 声 音 的 DNA 指 令 集 。 音 乐 家 是 活生 生 的 “ 有 状 态 ” 的 有 机 组 织 。 解 释 器 也 一 样 。具 体 来 说 , 所 有 这 些 动 态 和 词 法 范 围 , 加 上 全 局 符 号 表 , 带 上 分 析 树 , 最 后 加 上 一 个 执 行 的线 索 , 就 是 我 们 所 谓 的 一 个 解 释 器 。 从 执 行 的 环 境 来 看 , 解 释 器 实 际 上 在 编 译 器 开 始 运 行 之前 就 存 在 了 , 并 且 甚 至 是 可 以 在 编 译 器 正 在 制 作 它 的 环 境 的 时 候 解 释 器 就 开 始 进 行 初 步 的 运行 了 。 实 际 上 , 这 就 是 当 编 译 器 调 用 解 释 器 执 行 BEGIN 块 等 的 时 候 发 生 的 事 情 。 而 解 释器 可 以 回 过 头 来 使 用 编 译 器 进 一 步 制 作 自 己 的 运 行 环 境 。 每 次 你 定 义 另 外 一 个 子 过 程 或 者 装载 另 外 一 个 模 块 , 那 么 我 们 称 之 为 解 释 器 的 特 定 的 虚 拟 <strong>Perl</strong> 机 器 实 际 上 就 在 重 新 定 义 自身 。 你 实 际 上 不 能 说 是 编 译 器 还 是 解 释 器 在 控 制 这 一 切 , 因 为 它 们 合 作 控 制 我 们 通 常 称 之 为“ 运 行 <strong>Perl</strong> 脚 本 ” 的 引 导 过 程 。 就 象 启 动 一 个 孩 子 的 大 脑 。 是 DNA 还 是 蛋 白 质 在 做 处 理 ?我 们 认 为 两 个 都 在 起 作 用 , 并 且 还 有 一 些 来 自 外 部 程 序 员 的 输 入 。我 们 可 以 在 一 个 进 程 里 运 行 多 个 解 释 器 ; 它 们 可 以 或 者 不 可 以 共 享 分 析 树 , 取 决 于 它 们 是 通过 克 隆 一 个 现 有 解 释 器 生 成 的 还 是 通 过 从 头 开 始 制 作 一 个 新 的 解 释 器 生 成 的 。 我 们 也 可 能 在一 个 解 释 器 里 运 行 多 个 线 程 , 这 种 情 况 下 我 们 不 仅 共 享 分 析 树 而 且 还 共 享 全 局 符 号 —— 参 阅第 十 七 章 , 线 程 。不 过 大 多 数 <strong>Perl</strong> 程 序 只 使 用 一 个 <strong>Perl</strong> 解 释 器 执 行 它 们 编 译 好 了 的 代 码 。 并 且 尽 管 你 可 以在 一 个 进 程 里 运 行 多 个 独 立 的 <strong>Perl</strong> 解 释 器 , 目 前 可 以 实 现 这 个 目 的 的 API 只 能 从 C 里访 问 。( 注 : 到 目 前 为 止 只 有 一 个 例 外 :<strong>Perl</strong> 5.6.0 可 以 在 Microsoft Windows 的 仿 真fork 的 支 持 下 实 现 克 隆 解 释 器 。 到 你 阅 读 到 此 处 时 , 可 能 也 有 一 个 实 现 "ithread" 的 <strong>Perl</strong>API 。) 每 个 独 立 的 <strong>Perl</strong> 解 释 器 起 到 一 个 完 全 独 立 的 进 程 的 作 用 , 但 是 并 不 象 创 建 一 个完 全 新 的 进 程 那 样 开 销 巨 大 。 这 就 是 为 什 么 Apache 的 mod_perl 扩 展 的 性 能 如 此 突 出的 原 因 : 当 你 在 mod_perl 里 启 动 一 个 CGI 脚 本 时 , 那 个 脚 本 已 经 被 编 译 成 <strong>Perl</strong> 的 操作 码 了 , 消 除 了 重 新 编 译 的 需 要 —— 但 是 更 重 要 的 是 , 消 除 了 启 动 一 个 新 进 程 的 需 要 , 这才 是 真 正 的 瓶 颈 。Apache 在 一 个 现 存 的 进 程 里 初 始 化 一 个 新 的 <strong>Perl</strong> 解 释 器 然 后 把 前 面编 译 完 了 的 代 码 交 给 它 执 行 。 当 然 , 这 里 头 的 东 西 要 远 比 我 们 说 的 多 —— 一 直 是 这 样 的 。 更481

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

Saved successfully!

Ooh no, something went wrong!