鹦鹉虚拟机/运行鹦鹉
鹦鹉可以在命令行中以多种模式运行,并具有许多不同的选项。鹦鹉可以直接处理三种形式的输入:鹦鹉汇编语言 (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 switch
和 case
结构来选择要运行的下一条操作。在每次迭代时,都会执行一次 switch,每个 case 代表一个操作。操作执行完毕后,控制流会跳转回 switch 的开头,并重复循环。
switch 语句,尤其是使用许多连续值的语句,通常会被编译器转换为跳转表,其性能与计算转到跳转非常相似。
以上内核是其他专用内核的基础设计。
Parrot 团队的某些成员开发了 Apache Web 服务器的扩展,允许 Parrot 用于生成服务器端内容。这项工作的成果是 mod_parrot
,它可以用来使用 PIR 或 PASM 生成网站。它本身的用途有限。但是,mod_parrot 允许为目标为 Parrot 的语言创建额外的模块。像这样的一个值得注意的模块是 mod_perl6
,它是一个在 mod_parrot 之上运行的字节码模块。
有关 mod_parrot 的更多信息,请访问其网站:http://www.parrot.org/mod_parrot