4 ms·
...tail-calls... Note that neither the Microsoft C# compiler nor the Mono one emit tail calls. In practice, the MS .NET Just-In-Time compiler however transform
by DrJokepu 17y ago
...tail-calls...
Note that neither the Microsoft C# compiler nor the Mono one emit tail calls. In practice, the MS .NET Just-In-Time compiler however transforms tail recursion to loops even if the compiler didn't ask for it if a number of conditions are met. I'm no JVM expert by any means but I don't see why the JVM couldn't do something similar, in theory or in practice.
- prog 17y agoScala compiler does self-tail calls so in theory Java compiler should be able to do it. But IIUC doing tail calls between functions is not possible (or at least not worth the effort) on the JVM.
- bad_user 17y ago> Note that neither the Microsoft C# compiler nor the Mono one emit tail calls The F# compiler does, and not just for self-recursive calls. > the MS .NET Just-In-Time compiler however transforms tail recursion to loops The hard problem is to have mutually recursive functions ... A() calls B() calls C() calls A(). I'm currently working on a compiler that behind the scenes implements trampolines, so if you had something like ... int methodA() { // does something here return methodB("calling B"); } This would be translated to something like (pseudocode) ... int methodA(TailCallException ex) { // do something here ex.method = methodB; ex.args = [ 'calling B' ]; throw ex; } // trampoline implemented for any method with tail-calls int methodA() { int result; has_next = true; method = reference to methodA; args = [] // reusing the same TailCallException instance exc = new TailCallException(); while (has_next) { try { result = method.invoke(args, exc); has_next = false; } catch (TailCallException ex) { method = ex.method; args = ex.args; } } return result; } So yeah, it's possible. But this is overkill for functional languages where you've got recursion all over the place.
- j_baker 17y agoThe only thing that you really need for tail call recursion is a goto statement. Mutually recursive functions may be a different story though.
- borisk 17y agoC# apps do get tail calls, under some conditions http://blogs.msdn.com/clrcodegeneration/archive/2009/05/11/tail-call-improvements-in-net-framework-4.aspx http://blogs.msdn.com/clrcodegeneration/archive/2009/05/11/t...