内容

名称

O - Perl 编译器后端的通用接口

语法

perl -MO=[-q,]Backend[,OPTIONS] foo.pl

说明

该模块用作 Perl 编译器的前端。

如果将 -q 选项传递给模块,则在编译期间,STDOUT 文件句柄将被重定向到变量 $O::BEGIN_output 中。这会产生这样的效果:BEGIN 块或已使用的模块打印到 STDOUT 的任何输出都将存储在此变量中,而不是打印出来。对于那些本身会产生输出的后端(DeparseConcise 等)来说,这很有用,这样它们的输出就不会与正在编译的代码所生成的输出混淆。

-qq 选项的行为与 -q 类似,但它还会在完成反解析后关闭 STDERR。这会禁止 perl 通常会生成的“语法正常”消息。

惯例

大多数编译器后端都使用以下惯例:OPTIONS 由一个单词列表(没有空格)组成,用逗号分隔。-v 选项通常会将后端置于详细模式。-ofile 选项会将输出生成到 file,而不是 stdout。-D 选项后跟各种字母,会打开各种内部调试标志。请参阅所需后端的文档(对于上面的示例,名为 B::Backend),以了解该后端的信息。

实现

此部分仅适用于那些想要编写可通过此模块使用的编译器后端模块的人员。

SYNOPSIS 部分中提到的命令行对应于 Perl 代码

use O ("Backend", OPTIONS);

O::import 函数加载适当的 B::Backend 模块并调用其 compile 函数,向其传递 OPTIONS。该函数应返回一个子引用,我们将其称为 CALLBACK。接下来,打开“仅编译”标志(等同于命令行选项 -c),并注册一个 CHECK 块,该块调用 CALLBACK。因此,读取命令行上提到的 Perl 主程序,将其解析并编译成内部语法树形式。由于设置了 -c 标志,因此程序不会开始运行(当然 BEGIN 块除外),但会调用编译器后端注册的 CALLBACK 函数。

总之,编译器后端模块应称为“B::Foo”(对于某些 foo)并位于该名称的适当目录中。它应定义一个名为 compile 的函数。当用户键入

perl -MO=Foo,OPTIONS foo.pl

该函数被调用并传递那些 OPTIONS(以逗号分隔)。它应返回一个子引用到主编译函数。在加载和解析用户程序后,将调用返回的子引用,然后它可以继续进行编译,通常是通过使用 B 模块的功能。

BUGS

如果 perl 未使用 PerlIO 支持进行编译,则 -q-qq 选项无法正常工作:STDOUT 将被关闭,而不是重定向到 $O::BEGIN_output

AUTHOR

Malcolm Beattie,[email protected]