Goose is pretty cool. The idea is that you don’t need to make representable all programs: a language for a restricted purpose is ok. As long as you can statically specify the number of growable memory regions, you can use Goose. However, since there’s no garbage collection, you’ll probably need to be careful about memory use while a program is running. Ie: the stacks can get too big if you keep growing them, even as old data is not used any more.
Still, for a large number of programs - like data-oriented applications - it’s probably a good fit. It might work ok with entity-component game systems as long as you reuse old memory…
You typically "allocate only" if a data structure is made entirely on construction, or if its growth is bounded.
If it is potentially completely unbounded, you need different solutions like a pool, or essentially reconstructing etc.
Why not build in a very simple garbage collector - for example a ref counter - and default to it when you can't prove stack tricks are suficient at compile time? This guarantees all programs can be represented and it removes range anxiety for anyone trying a new language.
Seems any compiled language with automatic memory can make use of the techniques to obtain speed ups.
IIRC, this is feasible. But I think there's a nice simplicity in constraints. You know what you'd use Goose for, if it limits what you can express.