鹦鹉虚拟机/运行鹦鹉
鹦鹉可以通过命令行以多种模式和不同的选项运行。鹦鹉可以直接处理三种形式的输入:鹦鹉汇编语言 (PASM),它是虚拟机的一种低级人类可读汇编语言,鹦鹉中间表示 (PIR),它是 PASM 的语法覆盖,对某些表达式具有更好的语法,以及鹦鹉字节码 (PBC),它是一种编译后的二进制输入格式。
在正常执行期间,PIR 和 PASM 会被转换为 PBC。只有 PBC 可以被鹦鹉直接执行。将 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 开关。
鹦鹉也可以使用许多额外的选项运行。
优化可能需要时间才能执行,但会提高生成的程序的执行速度。对于简单的程序,短而粗糙的一次性程序,广泛的优化可能没有太大意义。你花在优化软件上的时间甚至会超过你执行它的时间。然而,对于经常运行的程序,或者非常大的程序,或者必须以良好的性能连续运行的程序,优化可能是一件有价值的事情。用优化编译一个程序,并可以将输出优化的字节码保存到磁盘,无需再次优化(除非鹦鹉集成了更好的优化)。
鹦鹉有多种优化选项,具体取决于要执行的优化的范围。每个选项都可以使用不同的命令行开关激活,形式为 -Ox
,其中 x
是一个表示要执行的优化类型的字符
标志 | 描述 |
---|---|
-O0 |
无优化,这是默认模式 |
-O1 或 -O |
不使用生命信息优化(例如分支) |
-O2 |
使用生命信息优化 |
-Op |
将最常使用的 I 和 N PASM 寄存器重写为最先使用 |
-Ot |
选择最快的运行内核(默认使用 -O1 和 -O2) |
-Oc |
开启可选/实验性的尾调用优化 |
生命信息 是一个分析步骤,其中代码和数据被跟踪以确定控制流模式和局部变量的生命周期。了解某些变量使用和不使用的区域,可以使寄存器得到重复使用,而不是必须分配新的寄存器。了解某些代码何时无法到达 使优化器能够完全忽略它。
运行内核是鹦鹉程序的中心循环,并且有几个不同的运行内核可用,它们指定了鹦鹉的性能和功能。运行内核决定鹦鹉如何执行传递到解释器中的字节码指令。运行内核可以执行某些任务,例如边界检查、测试或调试。其他运行内核经过优化以非常快地运行。有关各种内核的实现细节,请参阅 src/runops_cores.c
。
可以通过在命令行传递特定的开关来激活不同的内核。以下部分将讨论各种运行内核,它们的作用、工作原理以及如何激活它们。
默认的“慢速”内核将所有操作视为单个 C 函数。每个函数都被调用,并返回下一条指令操作的地址。许多内核,例如跟踪和调试内核,都是基于慢速内核设计。
快速内核是一个基本内核,不执行任何特殊操作,例如跟踪、调试或边界检查。
计算 goto 是某些编译器的一项功能,它允许 goto
指令的目标是一个包含标签地址的变量,而不一定是直接到标签。通过将所有标签的地址缓存到一个数组中,可以直接跳转到必要的指令。这避免了多次子例程调用的开销,并且在支持它的平台上可以非常快。有关计算 goto 运行内核工作原理的更多信息,请参阅生成的 src/ops/core_ops_cg.c
文件。
Switch 内核使用标准 C switch
和 case
结构来选择要运行的下一个操作。在每次迭代中,都会执行一个 switch,每个 case 代表一个操作。在执行操作后,控制流跳转回 switch 的顶部,循环重复。
Switch 语句,尤其是那些使用许多连续值的语句,通常会被编译器转换为跳转表,这些跳转表执行起来与计算 goto 跳转非常相似。
以上核心是其他专用核心的基本设计。
Parrot 团队的一些成员为 Apache Web 服务器开发了一个扩展,允许使用 Parrot 来生成服务器端内容。这项工作的结果是 mod_parrot
,它可以用于使用 PIR 或 PASM 生成网站。这本身用途有限。但是,mod_parrot 允许为目标为 Parrot 的语言创建额外的模块。一个著名的此类模块,mod_perl6
是一个字节码模块,它运行在 mod_parrot 之上。
有关 mod_parrot 的更多信息,请访问其网站:http://www.parrot.org/mod_parrot