[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Demystifying Continuations



*** 
The following is forwarded from the comp.lang.smallscript.design
newsgroup.
***

> Ahh. Now we are getting to what I really wanted to understand
properly. I
> had presumed correctly that we replace the return context with the
provided
> continuation. What I had not realized was the temporal "set" semantics
that
> require us to unwind/remove intervening continuations.
> 
> This model is then "exactly" like a block far-return or an exception
> unwinding sequence. Where, the F-B contexts/frames are not just
discarded.
> They "must" be unwound to preserve any guard/finally handler
semantics.
> 
> Which means that call-continuation is not that of "replacing" the
default
> return continuation. It is actually a case of throw/unwind until the
given
> continuation.
> 

Continuations are usually talked about in Procedural language settings, 
not Object Oriented settings. Specifically because a continuation is 
easily implemented as a goto.

One of the reasons the picture becomes complex in the OO world is 
because of all the throw/unwind logic. For historical purposes, I would 
say that a 'normal' continuation would NOT unwind, but would indeed
replace.

I believe this behaviour, from your arguments so far, would be 
inappropriete in an Object Oriented language. Calling a continuation 
within your execution thread should do a throw/unwind.

One of the reasons that threads aren't unwound is because if the 
continuation is not from your execution thread (ie; you've picked it up 
from an instance variable or some place else) then you don't need to 
waste time unwinding back through the last 50,000,000 threads. You can 
simple throw them away. This is extremely effecient. But it may not be 
entirely 'correct' in the object world.

So you have a choice. You can implement continuations with inconsistent 
behaviour by having it do two things:
(a) within the current thread, unwind back to the continuation frame
(b) within another thread, don't unwind, but jump straight to the 
continuation frame.

(I'll just throw in another thought for you. We've all seen people with 
memory problems because they hold on to things that shouldn't be held on

to. Like, a window on a class variable, or the root object on a class 
variable.. things like that. Imagine for a second somebody holding 
continuations about!)

Or you can have consistent continuations that really do behave like a 
procedural language and never unwind, but jump straight to the 
continuation frame.

As you've pointed out, this approach would have significant impacts on 
the handler code of SmallScript. This would actually give you something 
of an 'aspect' oriented programming approach. Using continuations you 
could override several programming features to give you a new aspect on 
parts of the system. I'm sure this would play havoc on the security and 
managed features of SmallScript.

Here's another thought if you want to preserve unwind behaviour. How do 
you handle your execution stack? I know if I'd written a process stack, 
I would be modifying it as I go. Lets say we've got a multithreaded 
continuation happening. Thread A sets the continuation for itself and 
keeps on running.

Thread B tried to call the continuation - it's now too late to do a lazy

copy. You needed to copy the entire thread stack when thread A set the 
continuation somewhere. This is extremely costly and reduces the 
benefits of continuations.

Of course, if you decide to ignore the unwind problems, then you won't 
have to copy the entire thread's execution stack.

In short I'd say you have some options and decisions to make. I'm 
guessing you really want to add continuations as a tick in the box to 
SmallScript. But it may not be a feasable feature for a secure Object 
Oriented Agents System.

Michael