[E-Lang] Re: Why Not Coroutines? (was: Deadlock-free [was what is good about E?])
zooko@zooko.com
zooko@zooko.com
Wed, 18 Jul 2001 20:10:15 -0700
MarkM:
That was a well-written and highly accurate summary of one of the three reasons
that pre-emptive multithreading is so abhorrent to me as a programmer.
The first reason, as you described, is that pre-emptive multithreading
prevents me, when reading a sequence of source code, from using valuable
assumptions about how all of the state remains unchanged during the execution
of this sequence except for changes caused by the code I am looking at.
The second reason is deadlock.
The third reason is that bugs caused by the first two reasons are almost always
non-reproduceable and rare, thus being much more destructive and time-consuming
than a reproduceable and frequent bug would be.
If I understand correctly, E's execution model completely solves all three of
these problems.
So describing E as "deadlock free" may be describing only one of three valuable
improvements for the working programmer.
Regards,
Zooko
> When coding, I, and I believe most programmers, need a strong convention
> about what boundaries in a program represent places where they need to
> recheck assumption, because things can change since "they" last looked. (Or
> rather, when the narrative in their head about what the program is doing last
> looked.) Our naive intuitions from sequential programming are mostly
> inarticulate, but go something like:
>
> 1) On entry to a function/method, assume state invariants are intact, but
> within those constraints anything may have changed. [...]
>
> 2) From one instruction/expression/statement to the next, assume that the
> immediately accessible world is only affected in the ways I (this code)
> affects it.
>
> 3) Between a call and a return, assume that the callee only affects the world
> in way I can understand. (This is strengthened in a pointer-safe language,
> and especially in a capability language, in that we may have a principled
> basis for reasoning about the what state the callee may and may not affect.)
>
> Advocates of pre-emptive shared-memory multithreading would have us relearn
> #2 and #3. I say #2 is too valuable and relearning it is too hard, so forget it.
>
> Advocates of coroutines would let us keep #2, but have us relearn #3. We
> see by the hypothetical transformation, combined with a coroutine-based
> scheduler, that the programmer using such a hypothetical transformer is now
> writing source code that confuses #1 and #3. Put another way, since the
> transformer silently turns #3 into #1, on return from a call, we would now
> have to be as assumption-free about the current state as we normally are on
> entry to a method.
>
> Traditional pure event-loop languages (Actors...Toontalk) have not had
> call/return, but are faithful to intuitions #1 and #2.
>
> E is faithful to all three intuitions.