用B::Deparse揭露Perl的魔法

B::Deparse 模块将Perl程序编译,然后反解析,生成内部生成的源代码。这有什么用呢?嗯,它让你可以看到幕后的情况,检查Perl是如何结构化程序代码的,这可以帮助你调试,以及其他事情。

示例

考虑本周关于子程序签名的文章中的粘性参数优化。我们知道从速度基准测试中,使用粘性参数后,签名速度提高了大约30%,我们可以推理出为什么是这样,但B::Deparse可以显示原因。以下是两个签名的代码,一个是正常的,另一个使用了粘性参数

use feature 'signatures';

sub normal_signature ($foo) {}

sub slurpy_signature ($foo, @) {}

现在,如果我们把代码保存为signatures.pl,我们就可以在命令行使用B::Deparse来检查它

$ perl -MO=Deparse signatures.pl

这生成了以下输出

sub normal_signature {
    use feature 'signatures';
    die 'Too many arguments for subroutine' unless @_ <= 1;
    die 'Too few arguments for subroutine' unless @_ >= 1;
    my $foo = $_[0];
    ();
}
sub slurpy_signature {
    use feature 'signatures';
    die 'Too few arguments for subroutine' unless @_ >= 1;
    my $foo = $_[0];
    ();
}
signatures.pl syntax OK

生成的代码显示了Perl如何内部结构化signatures.pl代码。你可以看到“slurpy_signature”有一个更少的die语句。这解释了性能提升的原因,因为子程序要做的更少。魔法被揭露了!

B::Deparse更多内容

B::Deparse附带详尽的文档,并有一些有用的选项来更改输出。

brian d foy的《精通Perl》书中有很多宝石,其中“Cleaning up Perl”章节中的B::Deparse条目就是其中之一。在书中,brian展示了B::Deparse的几个用途,包括调试单行代码和解码混淆代码。你可以在网上阅读章节的草稿这里

PerlMonks有一个有趣的条目,对于那些好奇为什么命令行使用B::Deparse的命令是“-MO=Deparse”而不是“-MB::Deparse”的人来说。

感谢

再次感谢Perl Pumpking和teflon man Ricardo Signes,他让我开始使用B::Deparse来分析子程序签名。

封面图像 © bark 图像已被数字修改


本文最初发布在 PerlTricks.com

标签

David Farrell

David是一位职业程序员,他经常 推文博客 关于代码和编程的艺术。

浏览他们的文章

反馈

这篇文章有什么问题?请通过在 GitHub 上打开问题或拉取请求来帮助我们。