Zwei Jahre nach der Optimierung des JVM-Prevent-Tail-Call scheint es eine Prototyp- Implementierung zu geben, und MLVM listet die Funktion seit einiger Zeit als "Proto 80%" auf.
Gibt es kein aktives Interesse von Sun / Oracle an der Unterstützung von Tail Calls oder ist es nur so, dass Tail Calls "[...] auf jeder [...] Feature-Prioritätsliste den zweiten Platz einnehmen ", wie in der JVM erwähnt Sprachgipfel ?
Es würde mich sehr interessieren, wenn jemand einen MLVM-Build getestet hat und einige Eindrücke davon teilen könnte, wie gut er funktioniert (wenn überhaupt).
Update: Beachten Sie, dass einige VMs wie Avian ordnungsgemäße Tail-Calls ohne Probleme unterstützen.
Antworten:
Diagnose von Java-Code: Die Verbesserung der Leistung Ihres Java-Codes ( alt ) erklärt, warum die JVM die Tail-Call-Optimierung nicht unterstützt.
Es gibt dann ein Beispiel für Java-Code, der sich nicht transformieren lässt.
Dann gibt es einen Test, mit dem Sie herausfinden können, ob Ihre JIT dies tut.
Da es sich um ein IBM Papier handelt, enthält es natürlich einen Stecker:
quelle
instanceof
Prüfung einfügt , um festzustellen, obthis
es sich um einExample
Objekt handelt (und nicht um eine Unterklasse vonExample
).Ein Grund, den ich in der Vergangenheit gesehen habe, um TCO nicht in Java zu implementieren (und es wird als schwierig angesehen), ist, dass das Berechtigungsmodell in der JVM stapelempfindlich ist und daher Tail-Calls die Sicherheitsaspekte berücksichtigen müssen.
Ich glaube, Clements und Felleisen [1] [2] haben gezeigt, dass dies kein Hindernis ist, und ich bin mir ziemlich sicher, dass der in der Frage erwähnte MLVM-Patch dies auch behandelt.
Mir ist klar, dass dies Ihre Frage nicht beantwortet. nur interessante Informationen hinzufügen.
quelle
Vielleicht wissen Sie das bereits, aber die Funktion ist nicht so trivial, wie es sich anhört, da die Java-Sprache den Stack-Trace tatsächlich dem Programmierer zur Verfügung stellt.
Betrachten Sie das folgende Programm:
Obwohl dies einen "Tail-Call" hat, kann es nicht optimiert werden. (Wenn es wird optimiert, es bedarf noch der Buchführung des gesamten Call-Stack , da die Semantik des Programms beruht darauf.)
Grundsätzlich bedeutet dies, dass es schwierig ist, dies zu unterstützen, während es dennoch abwärtskompatibel ist.
quelle
g
in diesem Fall indirekt aufgerufen werden. Denken Sie beispielsweise an Polymorphismus und Reflexion.getStackTrace()
von einer Methodex()
, die der Quellcode anzeigt , zurückgegebene Stapelverfolgung von einer Methode aufgerufen wird,y()
zeigt dies auchx()
aus aufgerufen wurdey()
? Denn wenn es etwas Freiheit gibt, gibt es kein wirkliches Problem.Java ist die am wenigsten funktionierende Sprache, die Sie sich vorstellen können (na gut, vielleicht auch nicht !), Aber dies wäre ein großer Vorteil für JVM-Sprachen wie Scala .
Meine Beobachtungen sind, dass die Herstellung der JVM zu einer Plattform für andere Sprachen für Sun und ich für Oracle nie ganz oben auf der Prioritätenliste zu stehen schien.
quelle