Wie funktioniert O = Deparse und hat Perl konstante Arrays?

8

Ich frage mich, zeigt -MO=Deparse Ihnen alle Perl-Optimierungen und warum wird das nicht in Perl 5.10 gefalzt?

%Vor%

Einige im IRC dachten, dass O=Deparse nicht alles zeigt, aber es zeigt sicherlich eine konstante Faltung.

%Vor%

Gleiches Ergebnis, wenn ich explizit das Konstantensub schreibe. Obwohl es vorhersagbar ist, ist es auch ziemlich interessant, dass Sie in der Dokumentation in constant.pm eine Konstantenliste anstelle eines Konstantenarrays erstellen. Ich nehme an, dass dies nicht nur wie skalare Konstanten gefaltet ist, sondern auch den Aufwand, ein neues Array bei jedem Aufruf zu erstellen.

%Vor%

Die einzige Schlussfolgerung, zu der ich kommen kann, ist -MO=Deparse zeigt die gesamte Faltung, und konstante Arrays sind einfach nicht in Perl optimiert? Ist das so? Gibt es einen technischen Grund dafür?

    
Evan Carroll 24.08.2010, 21:32
quelle

2 Antworten

9

Sie können keine konstanten Arrays erstellen, da Arrays keine Daten sind. Perl 5 hat fünf Arten von Daten (Dinge, die in Variablen gespeichert werden können):

  • kein Wert (undef)
  • Zahlen
  • Zeichenfolgen
  • Referenzen
  • Listen (bestehend aus einem oder mehreren der vorherigen Typen)

Sie können aus jedem eine Konstante machen. Perl 5 hat auch drei Container:

  • Skalar
  • Array
  • Hash

Skalare können einen der ersten vier Datentypen enthalten, Arrays und Hashes können Listen enthalten. Es ist wichtig, Dinge nicht zu verwechseln, die Daten und die Daten selbst enthalten.

Wie bei B::Deparse wird der optree nach der Erstellung des Dumps ausgegeben, damit die Ergebnisse angezeigt werden von allen konstanten Falten.

Ich habe noch nicht genug darüber nachgedacht, aber ich sehe keine offensichtlichen Gründe dafür, dass es nicht gefaltet werden könnte.

    
Chas. Owens 24.08.2010 21:48
quelle
8

Sie können in Perl kein konstantes Array erstellen, es gibt nichts in den Interna, um ein konstantes Array oder Hash oder sogar einen Skalar anzugeben. "use constant" nutzt Perls Fähigkeit, Unterroutinen mit einem Prototyp von () und einfachem Code zu inline zu schreiben. Das Beste, was Sie tun können, ist das Flag readonly , das zur Laufzeit ausgeschaltet werden kann.

Perl könnte das Readonly-Flag zur Kompilierzeit als einen Hinweis verwenden, um anzuzeigen, dass das Array tatsächlich nur gelesen wird, und dann jeden Zugriff unter Verwendung eines konstanten Index inline. Eine solche Heuristik wäre wahrscheinlich sicher, da das Readonly-Flag nicht für Benutzer zugänglich sein sollte und Sie es wahrscheinlich nicht ausschalten sollten.

    
Schwern 24.08.2010 22:51
quelle