3 ms·
> stackless async support is suitable for systems like microcontrollers, and the design reflects that. Tangent: How feasible would it be to have a language whe
by mwcampbell 4y ago
> stackless async support is suitable for systems like microcontrollers, and the design reflects that.
Tangent: How feasible would it be to have a language where the required stack space for all function invocations is statically known at compile time, just as the sizes of Rust futures are statically known? I guess this would be even harder, because with async functions, the compiler only has to store the state of the function in a statically sized structure when it reaches an await point. But I'm guessing that running out of stack is a common problem when developing for microcontrollers.
- kibwen 4y agoYou can predetermine function stack sizes as long as you don't do anything resembling C's "alloca" (Rust doesn't support alloca directly, but it supports dynamically-sized types in some contexts which would stymie this). But from there you need to use that information to figure out the maximum stack usage of the program, which means exhaustively determining all possible execution paths, which can be a hard problem (you also need to forbid recursion, even mutual recursion, which languages generally don't try to do (something something y-combinator)).
- kaba0 4y agoI may be very wrong here, but the JVM byte code’s method structure explicitly has a stack size and local array max size property, both calculated at compile time. Are they using some heuristic here?
- surrealize 4y agoI'd bet that the stack size you refer to doesn't include callees (i.e., the stack used by procedures called by the method in question).
- kaba0 4y agoOh you are right, Java has two stacks, an operational and a method/function stack. Only the former is calculated ahead of time (and the latter is configurable at runtime).