跳转到内容

鹦鹉虚拟机/运行鹦鹉

来自 Wikibooks,开放世界中的开放书籍

运行鹦鹉

[编辑 | 编辑源代码]

鹦鹉可以在命令行中以多种模式运行,并具有许多不同的选项。鹦鹉可以直接处理三种形式的输入:鹦鹉汇编语言 (PASM),这是一种面向虚拟机的低级人类可读汇编语言,鹦鹉中间表示 (PIR),它是在 PASM 之上的一个语法覆盖层,对某些表达式具有更友好的语法,以及鹦鹉字节码 (PBC),它是一种编译后的二进制输入格式。

PIR 和 PASM 在正常执行过程中被转换为 PBC。只有 PBC 可以被 Parrot 直接执行。从 PIR 或 PASM 转换为 PBC 的编译阶段需要一些时间,并且可以单独完成。我们将在稍后讨论这些过程。

鹦鹉信息

[编辑 | 编辑源代码]

要获取有关当前鹦鹉版本的的信息,请键入

parrot -V

要获取命令行选项及其用途的列表,请键入

parrot -h

我们将在本书的后面部分讨论所有各种命令行选项,但当问题出现时,拥有多种资源总是一件好事。

文件类型

[编辑 | 编辑源代码]

.pbc 结尾的文件被视为鹦鹉字节码文件,并立即执行。以 .pir.pasm 结尾的文件分别被视为 PIR 或 PASM 源代码文件,并被解释执行。要将 PIR 或 PASM 编译成字节码,请使用 -o 开关,例如

parrot -o output.pbc input.pir

或者

parrot -o output.pbc input.pasm

注意,如果我们使用 .pasm 文件扩展名,我们可以输出到 PASM 而不是 PBC。

parrot -o output.pasm input.pir

要强制输出 PBC,即使输出文件没有 .pbc 扩展名,请使用 --output-pbc 开关。要在你生成 PBC 文件后运行它,请使用 -r 开关。

要强制将文件作为 PASM 运行,无论文件扩展名如何,请使用 -a 开关。

要强制将文件作为 PBC 文件运行,无论文件扩展名如何,请使用 -c 开关。

运行时选项

[编辑 | 编辑源代码]

鹦鹉还可以使用许多其他选项来运行。

优化可能需要一些时间来执行,但会提高生成的程序的执行速度。对于简单的程序、短而粗糙的一次性程序,大量的优化可能没有多大意义。你可能花费更多时间优化一段软件,而不是执行它。但是,对于经常运行的程序、非常大的程序或必须持续运行且性能良好的程序,优化可能是一件有价值的事情。使用优化编译程序一次,并将输出的优化字节码保存到磁盘,这样就不需要再次优化(除非 Parrot 集成了更好的优化)。

鹦鹉有多种优化选项,具体取决于要执行的优化的程度。每个选项都可以使用不同的命令行开关激活,格式为 -Ox,其中 x 是代表要执行的优化类型的字符。

标记 描述
-O0 没有优化,这是默认模式
-O1-O 没有生命信息(例如分支)的优化
-O2 具有生命信息的优化
-Op 重新写入 I 和 N PASM 寄存器,最常用的寄存器排在最前面
-Ot 选择最快的运行内核(在 -O1 和 -O2 下默认为该内核)
-Oc 开启可选/实验性的尾递归优化

生命信息 是一个分析步骤,其中代码和数据被跟踪,以确定控制流模式和局部变量的生命周期。了解某些变量使用和不使用的地方,可以让寄存器被重复使用,而不是必须分配新的寄存器。了解某些代码何时是不可到达的,可以让优化器完全忽略它。

运行内核

[编辑 | 编辑源代码]

运行内核是鹦鹉程序的中心循环,有多个不同的运行内核可用,它们指定了 Parrot 的性能和功能。运行内核决定了 parrot 如何执行传递到解释器的字节码指令。运行内核可以执行某些任务,例如边界检查、测试或调试。其他运行内核已被优化,可以非常快速地运行。有关各种内核的实现细节,请参阅 src/runops_cores.c

可以通过在命令行传递特定开关来激活不同的内核。以下部分将讨论各种运行内核,它们的作用、工作原理以及如何激活它们。

基本内核

[编辑 | 编辑源代码]

慢速内核

[编辑 | 编辑源代码]

默认的 "慢速" 内核将所有操作视为单独的 C 函数。每个函数被调用,并返回下一条指令操作的地址。许多内核,例如跟踪内核和调试内核,都是基于慢速内核设计的。

快速内核

[编辑 | 编辑源代码]

快速内核是一个简陋的内核,不执行任何特殊操作,例如跟踪、调试或边界检查。

计算转到内核

[编辑 | 编辑源代码]

计算转到是某些编译器的一项功能,它允许 goto 指令的目标是一个包含标签地址的变量,而不是直接到一个标签。通过将所有标签的地址缓存到一个数组中,跳转可以直接到达必要的指令。这避免了多次子例程调用的开销,并且在支持它的平台上可以非常快。有关计算转到运行内核的工作原理的更多信息,请参阅生成的 src/ops/core_ops_cg.c 文件。

切换内核

[编辑 | 编辑源代码]

切换内核使用标准的 C switchcase 结构来选择要运行的下一条操作。在每次迭代时,都会执行一次 switch,每个 case 代表一个操作。操作执行完毕后,控制流会跳转回 switch 的开头,并重复循环。

switch 语句,尤其是使用许多连续值的语句,通常会被编译器转换为跳转表,其性能与计算转到跳转非常相似。

变体内核

[编辑 | 编辑源代码]

以上内核是其他专用内核的基础设计。

mod_parrot

[编辑 | 编辑源代码]

Parrot 团队的某些成员开发了 Apache Web 服务器的扩展,允许 Parrot 用于生成服务器端内容。这项工作的成果是 mod_parrot,它可以用来使用 PIR 或 PASM 生成网站。它本身的用途有限。但是,mod_parrot 允许为目标为 Parrot 的语言创建额外的模块。像这样的一个值得注意的模块是 mod_perl6,它是一个在 mod_parrot 之上运行的字节码模块。

有关 mod_parrot 的更多信息,请访问其网站:http://www.parrot.org/mod_parrot


上一个 鹦鹉虚拟机 下一个
Building_Parrot Parrot_Programming
华夏公益教科书