M
Moi
I think you may be conflating the two different meanings of "stack".
Call frames for currently active functions do form a stack, in the sense
of last-in first-out data structure. Calling a function pushes a new
frame on the stack; returning from a function pops the top-most frame.
Even setjmp and longjmp maintain the stack discipline.
In the model you describe, this stack of call frames is not allocated
contiguously. It's still a logical stack. It's just not organized as a
contiguous hardware stack. You seem to have another stack-like data
structure that's something other than the call stack, but the call stack
is still there.
The "logical" stack is not the only way to guarantee LIFO behavior, IMHO.
Imagine a message passing architecture, where each function is actually a
node in a network. A function starts living once it has received its
parameters, does the computations, and it can stop to exist once it has
sent it's return value.
This is of course silly, and maybe difficult to implement (eg. nodes need
to "block" once the perform a call to an other node and need to be woken
up once the callee returns), but is certainly doable, and will behave
*as if* a stack were involved. A stack is not needed to impose LIFO-order.
(global and static variables and longjumps are left as an exercise for
the reader ;-)
HTH,
AvK