3 ms·
Not only does it not have computed goto (almost no languages do, tbh), it also doesn't have guaranteed tall-call elimination or allow you to use the GHC calling
by chc4 4y ago
Not only does it not have computed goto (almost no languages do, tbh), it also doesn't have guaranteed tall-call elimination or allow you to use the GHC calling convention. Which are more egregious, imo.
- LoganDark 4y agoWhy is the lack of "GHC calling convention" egregious? I've never heard this before as an argument against Rust.
- margorczynski 4y agoI was looking for that (tail recursion) and it seems the story and feature request goes back years ago and still hasn't been added. Somewhere someone wrote that the issue is with LLVM but can't the tail call be transformed to an iteration before that?
- shadowofneptune 4y agoThe most practical uses of recursive functions are those that cannot be easily eliminated. For an interpreter, it could mean dozens of functions all calling each other in a pattern determined at runtime. The issue used to be with LLVM, yes, but that appears to be solved (see Clang's 'musttail' attribute). Instead it's more about language design. Constructors, destructors, and all of the fancy language features Rust has must work with this new feature, with no changes being visible elsewhere.
- User23 4y agoTail call optimization isn’t just for recursive functions. Any tail call can be optimized to little more than a jump, which makes implementing threaded code or similar much nicer. Your compiled code will just push the instruction pointer along an array of opcodes in a tight loop with no function call overhead.
- shadowofneptune 4y agoExactly, though I do not see how it is not an example of recursion.
- bmitc 4y ago> it also doesn't have guaranteed tall-call elimination I had no idea about that. Is there a specific reason why that choice was made?
- pornel 4y agoAFAIK guaranteed TCE wasn't supported in LLVM at all when Rust was still being designed and considered adding it. Support for musttail in LLVM has been added relatively recently. WASM doesn't support guaranteed TCE yet (it's a proposal), and that's an important target for Rust. https://github.com/rust-lang/rfcs/issues/2691 https://github.com/rust-lang/rfcs/issues/2691
- kzrdude 4y ago`become` is still a reserved keyword for this in Rust, so there's that.