Toon,

    what you describe is how Peter Deutsch designed closures for ObjectWorks
2.4 & ObjectWorks 2.5, whose virtual machine and bytecode set served all the
way through VisualWorks 3.0.  If you read the context management paper
you'll understand why this is a really slow design for a JIT.  When I
replaced that scheme by one essentially isomorphic to the Squeak one the VM
became substantially faster; for example factors of two and three in
exception delivery performance.  The description of the problem and the
performance numbers are all in the paper.  There are two main optimizations
I performed on the VisualWorkas VM, one is the closures scheme and the other
is PICs.  Those together sped-up what was the fastest commercial Smalltalk
implementation by a factor of two on most platforms and a factor of three on
Windows.

I'm sorry it's complex, but if one wants good performance it's a price
well-worth paying.  After all I was able to implement the compiler and
decompiler within a month, and Jorge proved at INRIA-Lille that I'm far form
the only person on the planet who understands it.  Lispers have understood
the scheme for a long time now.

best,
Eliot

On Thu, Mar 24, 2011 at 6:01 PM, Toon Verwaest <[email protected]>wrote:

>
>  I can't say that i clearly understood your concept. But if it will
>> simplify implementation
>> without seemingly speed loss, i am all ears :)
>>
>>
> test
>    |b|
>    [ |a|
>      a + b ]
>
> Suppose you can't compile anything away, then you get
>
> |==============
> |MethodContext
> |
> |a := ...
> |==============
>     ^
>     |
> |==============
> |BlockContext
> |
> |b := ...
> |==============
>
> And you just look up starting at the current context and go up. Except if
> the var is from the homeContext, then you directly follow the home-context
> pointer.
> Since all contexts link to the home-context, this makes it 1 pointer
> indirection to get to the method's context. 1 for the parent context. So
> that makes only 2 indirections starting from the 3 nested block (so when you
> have [ ... [ ... [ ... ] ... ] ... ]; where all of them are required for
> storing captured data. ifTrue:ifFalse: etc blocks obviously don't count. And
> blocks without shared locals could be left out (although we might not do
> that, for debugging reasons).
>
> Hope that helps.
>
> cheers,
> Toon
>
>

Reply via email to