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

yor*_*rgo 1 perl arguments precompile

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

例如,如果我们运行:

perl source.pl debug=0
Run Code Online (Sandbox Code Playgroud)

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

if ($debug == 1) {...} else {...} 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

amo*_*mon 5

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

Perl不会优化代码

my $foo = 1;
if ($foo) { ... }
Run Code Online (Sandbox Code Playgroud)

do { ... };
Run Code Online (Sandbox Code Playgroud)

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

use constant FOO => 1;
if (FOO) { ... }
Run Code Online (Sandbox Code Playgroud)

然后优化(恒定折叠).常量被实现为特殊子例程,假设不会重新定义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';
Run Code Online (Sandbox Code Playgroud)