Why Tailcalls

From JVMLangSummit
Revision as of 09:27, 29 July 2010 by Forax (talk | contribs) (Reduce call stack size !)
Jump to navigationJump to search

Are tailcalls fated to come in second place on every feature priority list?

Let's gather the use cases and consider the implementation.

(Note: This page is about "hard tail calls" as defined in the Rose blog. Soft TCO is already in many compilers, but does not have a strong effect on software architecture.)

use cases

multi-core task distribution

(Doug Lea) chaining task execution; without tail calls you blow the stack needlessly

languages with guaranteed TCO

These are languages with functional patterns, including Scheme, Scala, F#. Seph also aims to give this guarantee.

guaranteed disposal of stack-frame

Clojure needs workarounds to avoid floating garbage

 public static int count(Object o) {
   if (o instanceof Counted)
     return ((Counted) o).count();
   return countFrom(Util.ret1(o, o = null));
 }
 static public Object ret1(Object ret, Object nil) { return ret; }

Reduce call stack size !

(Rémi) Avoid to show language implementation internals by collapsing runtime stack frame.

Kōan

Tail call... Booty call... More than a coincidence? You decide.

external links

Proposal
http://blogs.sun.com/jrose/entry/tail_calls_in_the_vm
Thesis
http://www.ssw.uni-linz.ac.at/Research/Papers/Schwaighofer09Master/
mlvm Wiki
http://wikis.sun.com/display/mlvm/TailCalls
mlvm Code
http://hg.openjdk.java.net/mlvm/mlvm/hotspot/file/tip/tailc.patch