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
谢谢
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)
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |