1

Is perl only checking for syntax errors during the parsing of the source code, or also doing some optimizations based on arguments/parameters?

E.g. if we run:

perl source.pl debug=0

and inside source.pl there is an if condition:

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

Would the "precompilation/parsing" optimize the code so that the "if" check is skipped (of course assuming that $debug is assigned only at the beginning of the code etc, etc.)?

By the way, any idea if TCL does that? Giorgos

Thanks

4

1 回答 1

5

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

Perl 不会像这样优化代码

my $foo = 1;
if ($foo) { ... }

do { ... };

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

use constant FOO => 1;
if (FOO) { ... }

然后对其进行优化(不断折叠)。常量被实现为特殊的子程序,假设 subs 不会被重新定义。文字也将被折叠,因此print 1 + 2 + 3实际上将被编译为print 6

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

-MO=Deparse给定一个 Perl 脚本,您可以通过传递 perl选项来查看它的解析和编译方式。这会将已编译的操作码转换回 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';
于 2013-07-02T14:48:21.677 回答