Frage

sah ich dieses Zitat auf die Frage: Was ist eine gute funktionale Sprache ist, auf dem ein Web-Service zu bauen

  

Scala insbesondere nicht unterstützt Tail-Call-Eliminierung, außer in Selbst rekursiven Funktionen, die die Art der Zusammensetzung begrenzt Sie tun können (dies ist eine grundlegende Einschränkung der JVM).

Ist das wahr? Wenn ja, was ist es, über die JVM, die diese grundlegende Beschränkung schafft?

War es hilfreich?

Lösung

Dieser Beitrag:?. Rekursion oder Iteration könnte helfen,

Kurz gesagt, Endrekursion Optimierung ist schwierig, weil das Sicherheitsmodelles in der JVM zu tun, und die Notwendigkeit, immer einen Stack-Trace zur Verfügung zu haben. Diese Anforderungen könnten theoretisch unterstützt werden, aber es wäre wahrscheinlich eine neue Bytecode erfordern (siehe John Rose informellen Vorschlag ).

Es gibt auch weitere Diskussion in Sun Bug # 4726340 , wo die Auswertung (ab 2002) endet:

  

Ich glaube, dies dennoch getan werden könnte, aber es ist keine leichte Aufgabe.

Zur Zeit gibt es einige Arbeiten in der Da Vinci Maschine Projekt. Das Endrekursion Teilprojektes des Status wird als „Proto 80%“ aufgeführt; es ist unwahrscheinlich, dass es in Java 7 zu machen, aber ich denke, es ist an Java 8 eine sehr gute Chance hat.

Andere Tipps

Die grundsätzliche Beschränkung ist einfach, dass der JVM bietet keinen Endaufruf in seiner Bytecode und damit es für eine Sprache gebaut auf der JVM keine direkte Möglichkeit ist Schwanz selbst ruft zu liefern. Es gibt Workarounds, die eine ähnliche Wirkung (z trampolining) erreichen können, aber sie kommen am Grab Kosten der schrecklichen Leistung und das Verschleiern des erzeugten Zwischencode, der einen Debugger nutzlos macht.

So ist die JVM kann keine Produktionsqualität funktionalen Programmiersprachen unterstützen, bis Sun Endrekursion in der JVM selbst implementieren. Sie haben es seit Jahren diskutiert, aber ich bezweifle, dass sie jemals implementieren Endaufruf. Es wird sehr schwierig, weil sie vorzeitig ihre VM optimiert haben, bevor eine solche grundlegende Funktionalität Implementierung und Suns Anstrengungen stark auf dynamische Sprachen eher als funktionale Sprachen

Daher ist es ein sehr starkes Argument, dass Scala ist nicht eine echte funktionale Programmiersprache. Diese Sprachen haben angesehen Endaufruf als ein wesentliches Merkmal, da Schema zum ersten Mal vor über 30 Jahren eingeführt wurde,

Scala 2.7.x unterstützt Tail-Call-Optimierung für Selbst Rekursion (eine Funktion selbst aufrufen) der endgültigen Methoden und lokale Funktionen.

Scala 2.8 könnte mit Bibliothek Unterstützung kommt auch für Trampolin, das eine Technik ist für beiden Seiten rekursiven Funktionen zu optimieren.

Ein großer Teil der Informationen über den Zustand der Scala Rekursion kann in Reiche Dougherty Blog .

Neben das Papier verbunden in Lambda The Ultimate (aus dem Link mmyers oben gepostet), John Rose von Sun hat etwas mehr zu sagen über Endaufruf Optimierung.

http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm

Ich habe gehört, dass es auf der JVM eines Tages umgesetzt werden könnten. Endrekursion Unterstützung unter anderem wird an auf der Da Vinci-Maschine sieht.

http://openjdk.java.net/projects/mlvm/

Alle Quellen auf die JVM zeigen nicht in der Lage im Fall von Endrekursion zu optimieren, aber beim Lesen Java Performance Tuning (2003, O'Reilly Verlag) ich den Autor gefunden behauptete, er erreichen kann, mehr Rekursion Leistung durch Endrekursion implementieren.

Sie können seinen Anspruch auf Seite 212 (Suche nach ‚Endrekursion‘ soll es das zweite Ergebnis sein) finden. Was soll das?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top