跳转到内容

鹦鹉虚拟机/运行鹦鹉

来自维基教科书,开放的世界,开放的书籍

运行鹦鹉

[编辑 | 编辑源代码]

鹦鹉可以通过命令行以多种模式和不同的选项运行。鹦鹉可以直接处理三种形式的输入:鹦鹉汇编语言 (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 指令的目标是一个包含标签地址的变量,而不一定是直接到标签。通过将所有标签的地址缓存到一个数组中,可以直接跳转到必要的指令。这避免了多次子例程调用的开销,并且在支持它的平台上可以非常快。有关计算 goto 运行内核工作原理的更多信息,请参阅生成的 src/ops/core_ops_cg.c 文件。

Switch 内核

[编辑 | 编辑源代码]

Switch 内核使用标准 C switchcase 结构来选择要运行的下一个操作。在每次迭代中,都会执行一个 switch,每个 case 代表一个操作。在执行操作后,控制流跳转回 switch 的顶部,循环重复。

Switch 语句,尤其是那些使用许多连续值的语句,通常会被编译器转换为跳转表,这些跳转表执行起来与计算 goto 跳转非常相似。

变体内核

[编辑 | 编辑源代码]

以上核心是其他专用核心的基本设计。

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
华夏公益教科书