Eva*_*oll 8 perl compiler-optimization perl5.10 constantfolding
我想知道,确实-MO=Deparse向您展示了所有Perl优化,为什么不在Perl 5.10中折叠?
$ perl -MO=Deparse -e'[qw/foo bar baz/]->[0]'
['foo', 'bar', 'baz']->[0];
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
IRC的一些人认为O=Deparse可能没有全部显示,但它确实显示了一些不断折叠.
$ perl -MO=Deparse -e'use constant "foo" => "bar"; foo'
use constant ('foo', 'bar');
'???';
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
如果我明确写出常量sub,结果相同.虽然可预测,但是文档中constant.pm包含的是创建常量列表而不是常量数组也很有趣.我假设这不仅仅是像标量常量那样折叠,而是需要在每次调用时创建新数组的开销.
$ perl -MO=Deparse -e'use constant foo => qw/foo bar baz/; (foo)[0]'
use constant ('foo', ('foo', 'bar', 'baz'));
(foo)[0];
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
我能得出的唯一结论-MO=Deparse是显示所有折叠,而常量数组在Perl中没有优化?是这样吗?它有技术原因吗?
您不能创建常量数组,因为数组不是数据.Perl 5有五种类型的数据(可以存储在变量中的东西):
你可以在其中任何一个中保持不变.Perl 5还有三个容器:
标量可以保存前四种类型的数据中的任何一种,数组和散列可以保存列表.重要的是不要混淆包含数据和数据本身的东西.
至于B::Deparse它在构建后转储了optree,因此它将显示所有常量折叠的结果.
我还没有想到它,但我没有看到任何明显的原因,它不能折叠.
| 归档时间: |
|
| 查看次数: |
800 次 |
| 最近记录: |