Ich habe dieses Zitat auf der Frage gesehen: Was ist eine gute funktionale Sprache, auf der ein Webdienst aufgebaut werden kann?
Insbesondere Scala unterstützt die Eliminierung von Tail-Calls nur in selbstrekursiven Funktionen, wodurch die Art der Komposition eingeschränkt wird (dies ist eine grundlegende Einschränkung der JVM).
Ist das wahr? Wenn ja, was ist mit der JVM, die diese grundlegende Einschränkung schafft?
quelle
Die grundlegende Einschränkung besteht einfach darin, dass die JVM in ihrem Bytecode keine Tail-Aufrufe bereitstellt und folglich keine direkte Möglichkeit für eine auf der JVM aufgebaute Sprache besteht, Tail-Aufrufe selbst bereitzustellen. Es gibt Problemumgehungen, die einen ähnlichen Effekt erzielen können (z. B. Trampolin), aber sie gehen zu Lasten einer schrecklichen Leistung und einer Verschleierung des generierten Zwischencodes, wodurch ein Debugger unbrauchbar wird.
Daher kann die JVM keine funktionalen Programmiersprachen in Produktionsqualität unterstützen, bis Sun Tail Calls in der JVM selbst implementiert. Sie haben jahrelang darüber diskutiert, aber ich bezweifle, dass sie jemals Tail Calls implementieren werden: Es wird sehr schwierig sein, weil sie ihre VM vor der Implementierung solcher grundlegenden Funktionen vorzeitig optimiert haben, und Suns Bemühungen konzentrieren sich stark auf dynamische Sprachen anstatt auf funktionale Sprachen.
Daher gibt es ein sehr starkes Argument dafür, dass Scala keine echte funktionale Programmiersprache ist: Diese Sprachen haben Tail Calls seit der Einführung von Scheme vor über 30 Jahren als wesentliches Merkmal angesehen.
quelle
Hence there is a very strong argument that Scala is not a real functional programming language
- Das Argument ist eigentlich ziemlich schwach. Sicher sindtail calls [as] an essential feature
, und schön, wenn die zugrunde liegende Hardware (oder virtuelle Maschine) es direkt unterstützt. Aber es sind Implementierungsdetails.Scala 2.7.x unterstützt die Tail-Call-Optimierung für die Selbstrekursion (eine Funktion, die sich selbst aufruft) der endgültigen Methoden und lokalen Funktionen.
Scala 2.8 bietet möglicherweise auch Bibliotheksunterstützung für Trampolin, eine Technik zur Optimierung gegenseitig rekursiver Funktionen.
Viele Informationen über den Zustand der Scala-Rekursion finden Sie in Rich Doughertys Blog .
quelle
Zusätzlich zu dem in Lambda The Ultimate verlinkten Artikel (aus dem oben veröffentlichten Link mmyers) hat John Rose von Sun noch etwas mehr über die Optimierung von Tail Calls zu sagen.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Ich habe gehört, dass es eines Tages auf der JVM implementiert werden könnte. Auf der Da Vinci-Maschine wird unter anderem die Unterstützung für Rückrufe geprüft.
http://openjdk.java.net/projects/mlvm/
quelle
Alle Quellen weisen darauf hin, dass die JVM im Fall einer Schwanzrekursion nicht optimieren kann, aber beim Lesen der Java-Leistungsoptimierung (2003, O'reilly) stellte der Autor fest, dass er durch die Implementierung einer Schwanzrekursion eine höhere Rekursionsleistung erzielen kann.
Sie finden seinen Anspruch auf Seite 212 (Suche nach 'Schwanzrekursion' sollte das zweite Ergebnis sein). Was gibt?
quelle