在解析源代码时,Perl是否根据特定参数进行优化?

时间:2013-07-02 14:41:44

标签: perl arguments precompile

perl是否仅在解析源代码时检查语法错误,还是根据参数/参数进行一些优化?

E.g。如果我们跑:

perl source.pl debug=0

并且在source.pl里面有一个if条件:

if ($debug == 1) {...} else {...} 

“预编译/解析”是否会优化代码以便跳过“if”检查(当然假设$debug仅在代码等的开头分配等)?

顺便问一下,任何想法,如果TCL这样做? Giorgos

由于

1 个答案:

答案 0 :(得分:5)

Perl中的优化相当有限。这主要是由于非常宽松的类型系统,并且没有静态类型。 eval等功能也不会让它变得更容易。

Perl不会像

那样优化代码
my $foo = 1;
if ($foo) { ... }

do { ... };

但是,可以声明编译时常量:

use constant FOO => 1;
if (FOO) { ... }
然后优化

(恒定折叠)。常量被实现为特殊子例程,假设不会重新定义subs。文字也会被折叠,因此print 1 + 2 + 3实际上会被编译为print 6

有趣的运行时优化包括方法缓存和正则表达式优化。 但是,perl不会尝试证明代码的某些属性,并且总是假设变量是真正的变量,即使它们只被赋予一次。

给定一个Perl脚本,您可以通过传递perl -MO=Deparse选项来查看它的解析和编译方式。这将编译后的操作码转换回Perl代码。输出并不总是可运行的。当'???'出现时,这表示代码已经过优化,但无关紧要。例子:

$ perl -MO=Deparse -e' "constant" '  # literal in void context
'???';
$ perl -MO=Deparse -e' print 1 + 2 + 3 '  # constant folding
print 6;
$ perl -MO=Deparse -e' print 1 ? "yep" : "nope" '  # constant folding removes branches
print 'yep';