8

Perl の最適化のすべてを示しているのだろうか、-MO=Deparseなぜこれが Perl 5.10 で折りたたまれていないのだろうか?

$ perl -MO=Deparse -e'[qw/foo bar baz/]->[0]'
['foo', 'bar', 'baz']->[0];
-e syntax OK

IRC の何人かはO=Deparse、それがすべてを示しているわけではないかもしれないと考えていましたが、一定の折り畳みを示していることは確かです。

$ perl -MO=Deparse -e'use constant "foo" => "bar"; foo'
use constant ('foo', 'bar');
'???';
-e syntax OK

定数サブを明示的に記述しても同じ結果になります。予測可能ではありますが、 のドキュメントでは定数配列ではなく定数リスト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

私が到達できる唯一の結論は-MO=Deparse、すべての折り畳みを示すことであり、定数配列はPerlで最適化されていないだけですか? そうですか?技術的な理由はありますか?

4

2 に答える 2

9

配列はデータではないため、定数配列を作成することはできません。Perl 5 には 5 種類のデータ (変数に格納できるもの) があります。

  • 値なし (undef)
  • 数字
  • 文字列
  • 参考文献
  • リスト (前のタイプの 1 つ以上で構成される)

それらのいずれかから定数を作成できます。Perl 5 には 3 つのコンテナーもあります。

  • スカラー
  • 配列
  • ハッシュ

スカラーは最初の 4 種類のデータのいずれかを保持でき、配列とハッシュはリストを保持できます。データを保持するものとデータ自体を混同しないことが重要です。

についてB::Deparseは、ビルド後に optree をダンプするため、すべての定数折りたたみの結果が表示されます。

まだ十分に考えていませんが、折り畳めない明確な理由は見当たりません。

于 2010-08-24T21:48:19.533 に答える
8

Perl で定数配列を作成することはできません。定数配列、ハッシュ、さらにはスカラーを示す内部構造はありません。「定数を使用」は、Perl のサブルーチンをプロトタイプ()と単純なコードでインライン化する機能を利用します。あなたができる最善のことは、読み取り専用フラグを設定することですが、これは実行時にオフにすることができます。

Perl はコンパイル時に readonly フラグをヒントとして使用して、配列が実際に読み取り専用であることを示し、定数インデックスを使用してアクセスをインライン化することができます。読み取り専用フラグはユーザーがアクセスできるようになっていないため、このようなヒューリスティックはおそらく安全であり、おそらくオフにするべきではありません。

于 2010-08-24T22:51:23.710 に答える