Identity et al (was Re: [E-Lang] Authority -- what is its
dual?)
Mark S. Miller
markm@caplet.com
Mon, 22 Oct 2001 08:37:20 -0700
At 06:12 AM 10/19/2001 Friday, Jonathan A Rees wrote:
>Executive summary:
>
>1. On the detailed technical question, JAR is wrong and Tribble is
> right, perhaps modulo latency and partitioning issues.
> JAR didn't know about Joule's clever challenge/response solution.
>
>2. On the engineering question, JAR is right and Tribble is wrong.
> Tribble and JAR have different views on what programming is about.
MarkM's view (custom crafted for this thread): Programming is about having
your cake and eating it too.
>Sorry, I wasn't talking about Scheme; I'm talking about a Scheme
>subset in which EiaO, i.e. the only primitive object creation is
>LAMBDA and the only operation is invocation - no primitive numbers, no
>EQ, etc.
Sounds like a good step towards Actors.
> I care [about T] because they helped get energetic secrets correct
> in Joule. I think that'as outside of the scope of this discussion,
> however :-)
>
>Wow, that's the first I've ever heard of this! I knew some people
>liked the object system, but I never heard of anyone building on it
>intellectually. Tell me more.
I don't know if it'll make any sense out of context, but the Energetic
Secrets chapter of the Joule manual is at
ftp://ftp.webcom.com/pub1/agorics/postscript/MANUAL.B17.ps.Z .
The experience of trying to make this work under open systems constraints
revealed some non-obvious problems which we can discuss if anyone's
interested. As a result of these problems, E chickened out and retreated to
"a message selector is simply the message name string as it appears in the
source program". No lexical lookup step in sight. Dean is still trying to
argue me into at least a T-like position, which is intermediate between the
two.
> >I should say that I'm worried about the version of EiaO, where *all*
> >you have is message passing -- no identity or equality. We might call
> >this "all you can do is send a message" or AYCDISAM, but I'll call it
> >"strong EiaO" instead.
>
> This should be called "no eq"
>
>I would stick by my use of the term "identity", since I admit the
>possibility of stateless objects that have identity, but I have no
>objection to "no eq". This would be more trouble than it's worth to
>pin down rigorously, so let's move on.
I prefer AYCDISAM, since that expresses the hard constraint that Hewitt
first articulated, and that only some Actors languages (including Act-1) and
Joule have successfully achieved. I was going to suggest Purely Message
Mediated Computation, or PMMC, which amounts to much the same thing. A
primitive 'eq', such as E provides, in only one of many ways in which a
language can fail to be AYCDISAM.
Actually, neither AYCDISAM nor PMMC is quite right either. Neither Hewitt
nor Dean are arguing against primitive objects (or "rock bottom actors")
like integers. True AYCDISAM would force "3 + 4" to proceed by having 3 send
a message to the "+ 4" message, and eventually to both "+" and "4". "4"
could only interact with the message it receives by sending a message to it.
While this doesn't quite fall of the cliff of infinite regress, it comes
close enough to create a explosion of tedious messages for very little
purpose. It also starts to become fantastic to imagine that this explosion
of messages could actually be optimized into a single ALU "add" operation.
Rather, what Actors, Joule, Smalltalk, and E all do is to have "3", by magical
means available only inside the kernel's implementation, test whether "4" is
indeed a primitive integer. If it is, then it sucks the bits out of "4" and
proceeds to do ALU arithmetic.
Where some Actors languages and Joule get it right, and Smalltalk and E get
it wrong, is in the design of the actions by the primitives when the test
fails. This is the bottoming out issue that at least Henry Lieberman has
explained in the context of Act-1. The essential difference is whether
computation seems to be mediated only by messages. Put another way, since
user code in these systems can do nothing other than send messages, the
issue is whether they can abuse the test-failure behavior of the primitives to
effectively engage in behavior that goes beyond message passing. In
Smalltalk and E they can. This doesn't hurt any of E's security goals, but
it does hurt extensibility, as in the failed LazyMaker explained below.
Dean, could you explain how "3 + x" proceeds in Joule? I think we need the
concreteness before we proceed.
> >Actually weak EiaO doesn't really qualify as
> >EiaO, since identity can be used to implement passive objects
> >(e.g. numbers) that are never sent messages.
>
> Of course it qualifies: the big distinction we are making is between magic
> built-in datatypes that the user cannot emulate vs. everything has a
> uniform object semantics.
>
>But if there's EQ, then one user can define a built-in datatype that
>no other user can emulate. For example, I can define particular
>objects to be boolean true and false, and allow no other objects to
>qualify. If others are obligated to work with me (I'm the boss or the
>police, etc.), then I'm effectively a "system", so what's the
>difference?
The difference is that, in Act-1 or Joule, a user-defined transparent
forwarder in front of an object cannot be distinguished from the object
itself. This means, for example, that a lazy evaluator that will compute
and then become a number can be provided anywhere a number is expected. The
LazyMaker at http://www.erights.org/elang/blocks/defPlumbing.html is as
close as E can come, but it fail badly. For example, "3 + lazyNum" will not
work in E.
>I'm worried about the necessity of a having a private communication
>path (capability) from object to verifier. Digital signatures don't
>have this property, which makes me worry that the approach is flawed,
>or at least not robust to partitions.
This doesn't apply to Act-1 or Joule, but a hypothetical AYCDISAM E wouldn't
need to worry about this issue since all E's AYCDISAM-violating constructs
only operate between mutually-near objects.
>I'm also bothered that state and timing are involved in extracting
>information. If the object and/or verifier are slow to respond, and I
>get bored waiting for an answer, then that's not a negative answer,
>it's an I-don't-know.
I'm mildly bothered by the state (in the same way I'm bothered by the
assignments in Scheme's canonical expansion of letrec).
I'm both surprised and very disturbed by the timing dependence. I thought
Dean had a timing-independent solution. There is no timeout long enough to
guarantee success when the semantics of the construct says we should succeed.
I'd prefer that these constructs wait forever if necessary. Dean?
>[...] I suppose selfless objects together with verifiers for them
>allow you to simulate data, but it seems very roundabout to me.
This is why I started off with having one's cake and eating it too. Many
things that now seem natural to us, like using tail recursion for loops,
must have seemed terribly roundabout to people used to compiling Fortran or
Algol. These "simulations" are explanatory stories and constraints on the
semantics. As Dan Ingalls says, in the implementation "you can cheat as long
as you don't get caught".
Ken, can you tell the story of Cordell Green inventing logic programming but
not knowing it, because, without knowing it could be made efficient, he
imagined it was only a technique for simulating computation.
The "eating it too" is that we shouldn't lose the advantages of other
valuable programming paradigms when we incorporate a new one. We should
design languages that allow us to reason about the same program using
multiple perspectives.
>In the real world (common-sense version) there is data and there is
>transparency, and I exploit them all the time. Maybe I use my eyes
>(unreliable but mostly effective) to verify that the thing in my hand
>is a pencil and not an impostor, but does that mean that the pencil
>knew about my eyes when it was manufactured?
So, the question is, how does Joule support this programming perspective any
less well than Scheme?
>They have to because they want to run their programs. But in the
>style I strive for, the ideal program is a pun, simultaneously
>declarative and imperative. When a human first reads it, it's
>understood declaratively, and only then, when someone (human or
>computer) cares about running it, is it understood imperatively. The
>idea is to isolate the user from implementation details such as
>inherent asymmetry.
An excellent example of simultaneously supporting multiple perspectives.
Cheers,
--MarkM