For example, Clojure lacks proper tail recrusion  optimization due to
some missing functionality in the JVM. But does anybody know the details?

|Basically, the JVM lacks a native ability to do tail calls. It does |not have an instruction to remove/replace a stack frame without |executing an actual return to the calling method/function.

There is a conflict between preserving stack layout and efficient
tail calls. Unfortunately, stack inspection appears to be used for
security aspects in JVM. That doesn't make tail calls impossible,
but may have slowed down progress as this argument always
comes up in discussing tail calls on the JVM (since its byte code
isn't just an internal detail, but an externally used API).

None of the various partial workarounds are quite satisfactory
(jumps work only locally, there is an upper size limit on how
much code can be considered as local, trampolines return before each call, there are alternatives that clear the stack not before
each call, but every n calls, ..., see the various Haskell to Java/JVM
papers).

I was curious about the current state (the issue is as old as JVM),
and here's what I've found so far (more concrete/official info would
be appreciated):

   tail calls in the VM [2007]
   http://blogs.sun.com/jrose/entry/tail_calls_in_the_vm

   RFE: Tail Call Optimization [2002]
   http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4726340

   [2009]
   http://wikis.sun.com/display/mlvm/TailCalls

   Tail Call Optimization in the Java HotSpot(TM) VM [2009]
   http://www.ssw.uni-linz.ac.at/Research/Papers/Schwaighofer09Master/

Still cooking, still not done, it seems, but perhaps closer than ever?

Claus


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to