First draft of translation document

Brian Goetz brian.goetz at oracle.com
Wed May 19 08:34:13 PDT 2010


> So for the JSR292 expert group, we have to correctly specifies
> asSam() and provides a polymorphic bindTo/insertArguments.

Well, I'd say its a "kind request" to the JSR-292 expert group rather than a 
"demand" :)

But yes, this specific translation strategy would benefit from some specific 
help from MethodHandle.

> Now the not agree part:
> Local variables can also be accessed by reference (with "shared"),

Let's set aside the question of how we refer to captured mutable variables for 
now -- this is a language issue which we will surely return to.  Let's just 
assume for this discussion that the translation approach needs to accomodate 
this use case (and we later choose to disallow it, then the type 1/2/3 
distinction becomes merely type 1/2.)

> in that case the compiler needs to construct a frame object to store the
> local variables,
> bind the frame to the method handle and retrieve the value after the call.
>
> I don't like it because:
>    - there is no support offered by the VM for that, so each compiler
> (version of compilers)
>      will choose a different ways to optimize or worst "perhaps optimize".

I don't like the Frame class either, but without additional VM support (which 
is unlikely to come from JSR-292 in the JDK 7 time frame) I'm not sure what 
the alternatives are.

In an example like:

   int total = 0;
   list.forEach(#(Person p) { total += p.getFoo(); });

There are really two cases:
  - The closure may escape from forEach(), and be saved for later or called 
from another thread;
  - The closure will not escape from forEach()

In the escaping case, I don't see how we can avoid the Frame even with VM 
support -- we need to use the Frame to extend the dynamic scope of the 
captured variables beyond their lexical scope.

In the non-escaping case, I think what you are appealing to is that total 
should live on the stack.  I think what happens here comes down to whether the 
VM can inline all the way through from the caller to forEach() and back 
through the closure.  If it can, then escape analysis eliminates the frame, 
and the locals can be hoisted into registers, and all the mechanics of 
capturing the closure are folded away.

>    - the proposed scheme introduces a hidden allocation (perhaps !)

I'm OK with that.

>    - the impact on the memory model is far from clear, one day shared
> vars will have to
>      be specified in term of happen-before.

For sure.  The JLS describes seven types of variables (though the distinction 
between two of them is pretty tenuous).  A "shared" local variable is 
definitely an eighth kind of variable.  I am in favor of making this 
distinction explicit so that the memory model semantics are clear.



More information about the lambda-dev mailing list