Ich las das Buch "Funktionale Programmierung für die reale Welt". Es begann mit dem Vergleich zwischen imperativen und funktionalen Programmiersprachen. Und es wurde angegeben, wie sich "Werte" und "Ausdrücke" in der funktionalen Programmierung von "Variablen" und "Funktionen" der imperativen Programmierung unterscheiden. Aus der Diskussion entwickelte ich eine Idee, dass -
Funktionale Programmiersprachen bieten mehr Möglichkeiten zur Optimierung der Kompilierungszeit als ihre zwingenden Gegenstücke.
Ist es wahr?
quelle
Dass es für funktionale Sprachen im Prinzip mehr Möglichkeiten zur Optimierung der Kompilierungszeit gibt als für ihre zwingenden Gegenstücke, ist wahrscheinlich richtig.
Interessanter ist jedoch, ob sie tatsächlich in aktuellen Compilern implementiert sind und wie relevant diese Optimierungen in der Praxis sind (dh die endgültige Leistung von idiomatischem 'Real Life (TM)' - Code in einer Produktionsumgebung mit a priori vorhersehbaren Compilereinstellungen).
Zum Beispiel erwecken die Haskell-Beiträge für das berüchtigte Computersprachen-Benchmark-Spiel (so schlecht es auch sein mag - aber es ist nicht so, dass es im Moment etwas wesentlich Besseres gibt) den Eindruck, dass viel Zeit dafür aufgewendet wurde Manuelle Optimierungen, die mit der Behauptung "mögliche Compiler-Optimierungen aufgrund von
insert some property about FP languages here
" konfrontiert wurden, lassen es so aussehen, als wären die Optimierungen (derzeit zumindest) eher eine theoretische Möglichkeit als eine relevante Realität.Ich würde mich freuen, wenn ich mich in diesem Punkt als falsch erweisen würde.
quelle
Im funktionalen Stil ist der Wertefluss durch ein Programm sehr, sehr sichtbar (sowohl für den Compiler als auch für den Programmierer). Dies gibt dem Compiler viel Spielraum, um zu entscheiden, wo Werte gespeichert werden sollen, wie lange sie aufbewahrt werden sollen usw.
In einer imperativen Sprache verspricht der Compiler dem Programmierer ein Modell, bei dem die meisten Variablen tatsächlichen Speicherorten entsprechen, die für eine definierte Lebensdauer bestehen bleiben. Möglicherweise kann jede Anweisung von jedem dieser Speicherorte lesen (oder darauf schreiben!), Sodass der Compiler nur Speicherorte durch Registerzuordnung ersetzen, zwei Variablen zu einem einzigen Speicherort zusammenführen oder ähnliche Optimierungen durchführen kann, nachdem eine sorgfältige Analyse des Speicherorts durchgeführt wurde Andernfalls kann im Programm auf diese Variable verwiesen werden.
Nun gibt es zwei Einschränkungen:
Um die allgemeine Frage zu beantworten: Ja, ein funktionales Paradigma gibt dem Compiler viel Freiheit bei der Optimierung, die er in einer zwingenden Umgebung nicht hat.
quelle
main
es sich um eine Zustandsumwandlung handelt und nicht um etwas, das den Zustand selbst verwendet.