var*_*nie 4 perl internals moose constantfolding
我一直对Perl执行的常量折叠优化感到好奇,但是当代码中有Moose涉及的机会是不会执行常量折叠时(如果我错了请纠正我).
我有Moose代码,其中包含如下方法:
sub foo {
my ($self) = shift;
my $test_y = $self->pos->[1];
#...
if ($self->is_map_val($self->pos->[0]+8, $test_y+32) ||
$self->is_map_val($self->pos->[0]+32-8, $test_y+32)) {
{
heavy_stuff();
}
#...
}
Run Code Online (Sandbox Code Playgroud)
当我运行时,perl -MO=Deparse ./program.pl我得到几乎相同的代码行:
if ($self->is_map_val($self->pos->[0] + 8, $test_y + 32) or
$self->is_map_val($self->pos->[0] + 32 - 8, $test_y + 32))
{
heavy_stuff();
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么Perl没有优化32-8为24?是否有任何真正的原因Perl没有这样做(也许Moose子系统让生活变得更难?).
如果它有帮助,我运行Perl(v.5.14.2)
这与穆斯没有任何关系.在
$x + 32 - 8
Run Code Online (Sandbox Code Playgroud)
评估顺序相当于
($x + 32) - 8
Run Code Online (Sandbox Code Playgroud)
(即+与-具有相同的优先级,并且左结合).作为一棵树:
(-)
/ \
(+) 8
/ \
$x 32
Run Code Online (Sandbox Code Playgroud)
该语法树的任何部分都只有常量节点:$x + 32不是常量,PREVIOUS_PART - 8也不是常量.因此,常量折叠(仅在此树级操作,并且无法对树的部分重新排序)看不到任何优化机会.
你确实得到了重新排序的优化32 - 8 + $x.
所述perlguts记录恒定的折叠,并具体说明,它通过用树的部分进行操作.