perl是否仅在解析源代码时检查语法错误,还是根据参数/参数进行一些优化?
E.g。如果我们跑:
perl source.pl debug=0
并且在source.pl里面有一个if条件:
if ($debug == 1) {...} else {...}
“预编译/解析”是否会优化代码以便跳过“if”检查(当然假设$debug
仅在代码等的开头分配等)?
顺便问一下,任何想法,如果TCL这样做? Giorgos
由于
答案 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';