3 ms·
They eventually want to be competitive against C++ code and it seems they won't support TCO as that would harm their performance target.
by Offler 13y ago
They eventually want to be competitive against C++ code and it seems they won't support TCO as that would harm their performance target.
- pjmlp 13y agoThe thing is that most C and C++ compilers actually do TCO when applying -O2 or similar, if they see the possibility to do so.
- jacquesm 13y agoNot having TCO might lead to a much bigger problem than not hitting a performance target for large numbers of loop iterations. I'd rather have a program that is slightly slower and that works correctly for all input than one that has a built in - but invisible and hard to test for - hard limit.
- qznc 13y agoI assume you mean that without TCO the stack might overflow for certain inputs and it is easy to miss those cases during testing. Is that actually a real problem? I never hear C/C++/Java/Python/Ruby/Javascript/D/Go/Clojure programmers complain about such bugs. On a Linux/Windows/OS X system the stacks are big enough to practically never hit such bugs. Whenever I get a stack overflow, I coded an infinite loop, which is actually easier to find without TCO, because the program is terminated.
- jacquesm 13y agoC/C++ etc don't have that problem because they have loops. TCO is a way to turn a recursion into a loop. If for every situation where you would elegantly use recursion you'd end up with real recursion and all its overhead you'd indeed end up overflowing the stack. For a C/C++ etc program it would not matter whether your loop iterator would be 10 or 10,000,000,000, the program would just run a little slower. The rust/clojure program (coded up without knowledge of the underlying mechanisms, so 'naively') would likely run out of memory. With TCO such a naive implementation would run just fine. 10,000,000,000 is merely large, not infinite and should all things otherwise being equal not come with a huge memory penalty if all you're doing is writing elegant code in the most applicable idiom for a certain language.
- kibwen 13y agoI can't speak for Clojure, but the idiomatic Rust code that I've seen does tend toward C-style iteration (though that iteration is discreetly accomplished via closures and higher-order functions) rather than Lisp-style recursion. So I wouldn't expect recursive memory exhaustion to be a common concern in idiomatic Rust, though that's obviously no consolation if you were hoping to code in a recursive style. Though perhaps you'll be happy to hear that Rust stacks are growable (Go-style) rather than fixed, so stacks are typically small and running out of stack is (afaict) theoretically less of a concern than in C/C++.
- pcwalton 13y agoThe most applicable idiom for Rust is to use looping with higher-order functions. Rust code doesn't really favor recursion.
- jacquesm 13y agoYes, but that may very well be because it does not do TCO... What's idiomatic in a language is usually the result of how efficiently that language implements certain constructs.
- 13y ago