Hi all.
go back to Carl Hewitt in the early and mid 1970s. Carl once motivated
programming in the large (i.e., distributed computing). How do you program
interactions with a remote service? You send asynchronous messages. With
a vat. Then actors would have naturally had multiple mailboxes.
Mark--
For what it's worth, while there may have been a dispute going on, I don't
recall being directly involved in it or feeling any "business panic". My
motivation was simple impatience and a desire to start coding something.
This may have dovetailed with something like a "business panic" on the part
of others, but I can't speak to that.
Cheers,
Doug
-----Original Message-----
Sent: Sunday, June 12, 2011 4:22pm
To: "Discussion of E and other capability languages" <
Subject: Re: [e-lang] Question about E's history.
[+kenneth.kahn, +danfuzz, +douglas (barnes), +ehud.shapiro, +carl, +chip]
On Sun, Jun 12, 2011 at 3:54 AM, Constantine Plotnikov <
[...]
Post by Constantine PlotnikovIt would be interesting to know how this idea of Vat comes to E. I'm also
interested whether there are other Actor model implementations (that
declare
Post by Constantine Plotnikovthat they such) where asynchronous components could share single event
loop.
Post by Constantine PlotnikovAgreed. The larger islands of sequential programming in E were quite a
benefit for many kinds of programming, and is probably the key insight in
[the] E computational model. [...]
Thanks. To explain how E arrived at this insight, a bit of history. The
following is all based on my old flawed memories, so cc'ing various involved
people for corrections and gap-filling. For those new to this thread, more
context can be found starting at <
http://www.eros-os.org/pipermail/e-lang/2011-June/013865.html>. To
contribute to this thread, please first subscribe at <
http://www.eros-os.org/mailman/listinfo/e-lang> or your messages will be
silently rejected.
Ehud Shapiro's 1983 paper "A subset of Concurrent Prolog and its
Interpreter" began the field of concurrent logic programming. That same
year, Shapiro (cc'ed) and Takeuchi's "Object-oriented programming in
concurrent Prolog" showed how to encode actors as a pattern of concurrent
logic programming, by reifying the "mailbox" as a stream of incoming
messages, provided by convention as a first argument to a goal. In 1987, Ken
Kahn, Dean Tribble, Danny Bobrow, and myself formed the Vulcan project at
PARC, initially to provide sugar to more directly express actors/objects on
top of this concurrent logic programming base.
Dean diagnosed and fixed a flaw in an early draft of "Vulcan: Logical
Concurrent Objects", and in so doing invented the inner-vs-outer send
technique which would later show up in Joule and become so important to our
E story below. An outer send would append onto the tail of a stream of
messages, adding a new message to be serviced after all previously queued
messages. An inner send, it you had the capabilities needed to express it,
would prepend a message onto the head of the stream of messages, to be
servived ahead of all previously queued messages.
Vijay Saraswat (hi Vijay -- it's good to see you here!) joined the Vulcan
project soon afterwards. We never really made much use of our sugar, finding
it didn't add much convenience and hid too much of the underlying power. And
a good thing too. The sugar would have baked in the one-mailbox-per-actor
assumption. By programming more directly on the base, we came to realize the
power of having a single actor (or concurrent logic programming perpetual
process) serve multiple mailboxes. This power is explained well in Ken
Kahn's "Objects: A Fresh Look" (the crucial text seems to be in the pages
missing between p217 and p220 in <
http://books.google.com/books?id=oiAkSgoiz6EC&lpg=PA207&ots=ShwbQwMNp9&dq=%22objects%20a%20fresh%20look%22%20kahn&pg=PA207#v=onepage&q=%22objects%20a%20fresh%20look%22%20kahn&f=false
Of the Vulcaneers, Ken (cc'ed) may have also originated this technique; I
don't remember. Ken, do you have the full paper online? Do you remember how
we came to realize the significance of this pattern?
Joule had two levels of semantic description. At the lower kernel layer,
Joule was a pure actors language with a single implicit mailbox per actor.
At the higher layer, which was more convenient for both users and
implementors, a Joule actor had multiple facets -- directly supporting the
power we'd discovered in the Vulcan project, that Ken's paper explains so
well. A Joule actor as a whole still processed only one event at a time, but
could service multiple mailboxes, one for each of its facets. In this way, a
Joule actor was a cheap unit of atomicity among multiple services being
provided from common state. I would count this as the first foundational
step away from the "active objects" view of actors that Tom mentioned. Joule
coupled this with (at this higher layer) direct support for inner-vs-outer
sends.