IDE support?

François REMY fremycompany_pub at yahoo.fr
Sat Sep 17 11:57:29 PDT 2011


The best way to avoid the "over-annotation" of codes is probably to teach 
users about WHEN or WHY they should add types guards. If you add the feature 
and don't explain what's her purpose and what specific scenarii it can 
solve, you'll get in trouble.

However, if you can coordinate with the whole community and publish a bunch 
of blog posts explaining how to "type efficiently", you'll get great 
results. But, in order to achieve that, all the implementations must be 
optimized for the same specific cases.

JavaScripters are acustomated to a untyped language. They will not type 
everthing because we know how handy it's to rely on compiler optimization. 
The most critical part will be to teach cross-compiler makers and people 
learning JavaScript after beeing used to, let's say, Java.

Anyway, another usage of type will be "automatic class instanciation from 
json data". For exemple, let's say I've a type defined like this :

    class A {
        var myFirstField : B;
        var mySecondField : B;
        function areEqual() : bool {
            if(myFirstField==null) { return mySecondField==null; }
            if(mySecondField==null) { return false; }
            return myFirstField.x == mySecondField.y;
        }
    };

    class B { int x; int y; }

You can do things like that :

    var myA = { myFirstField: {x:5, y:6}, mySecondField: {x:5, y:7} } as A;
    console.log(myA.areEqual());

François



-----Message d'origine----- 
From: Brendan Eich
Sent: Saturday, September 17, 2011 7:15 PM
To: Andreas Rossberg
Cc: es-discuss at mozilla.org
Subject: Re: IDE support?

On Sep 15, 2011, at 11:57 AM, Andreas Rossberg wrote:

> On 13 September 2011 16:48, Brendan Eich <brendan at mozilla.com> wrote:
>> On Sep 13, 2011, at 5:33 AM, Andreas Rossberg wrote:
>>>
>>> * There are extra costs in space and time to doing the runtime analysis.
>>> * Compile time is runtime, so there are severe limits to how smart you
>>> can afford to get in a compiler.
>>
>> These are bearable apples to trade against the moldy oranges you'd make 
>> the world eat by introducing type annotations to JS. Millions of 
>> programmers would start annotating "for performance", i.e., gratuitously, 
>> making a brittle world at high aggregate cost.
>>
>> The costs born in browsers by implementors and (this can hit users, but 
>> it's marginal) at runtime when evaluating code are less, I claim.
>
> Depends on how good you want to optimize. Aggressive compilers can be
> really slow. There are limits to what you can bear at runtime.

You the user, yes -- good point. It's not just an implementor's burden.


>>> * The massive complexity that comes with implementing all this affects
>>> stability.
>>
>> This one I'm less sympathetic to, since we won't get rid of untyped JS up 
>> front. A sunk cost fallacy? If we could make a "clean break" (ahem), 
>> sure. Otherwise this cost must be paid.
>
> Well, the counter-argument would be that you wouldn't need to care
> about optimising untyped code as much, if the user had the option to
> switch to a typed sublanguage for performance.

I was really turned off by how AS3 users over-annotate. If we added "guards" 
and users turned to them "for performance", I'm afraid we'd see the same 
contamination.

Annotating might not even help performance -- in AS3, evaluation of 
arithmetic operators must widen from int to double, not wrap around 32 bits, 
so annotating int on storage types that annotate slots fetched and used via 
+, *, etc. can actually lose performance when storing back, since you have 
to use the FPU, or analyze and guard on overflow (as JS engines do today to 
avoid the FPU).

More analysis can help to stick to the ALUs but that works for untyped JS 
too.

Still, I agree that for performance-critical storage, annotations help. This 
is obviously so with typed arrays, which the fast VMs target with dedicated 
type inference and instruction selection machinery.

Is there a way to avoid the contamination problem we saw with AS3 during the 
ES4 days?


>>> * Wrt limits, even in the ideal case, you can only approximate the
>>> performance of typed code -- e.g. for property access you have at
>>> least two memory accesses (type and slot) plus a comparison and
>>> branch, where a typed language would only do 1 memory access.
>>
>> That's *not* the ideal case. Brian Hackett's type inference work in 
>> SpiderMonkey can eliminate the overhead here. Check it out.
>
> I'm actually pretty excited about that, and hope to see more on that
> front. Cool stuff.
>
> However, that ideal case is achieved in a relatively small percentage
> of cases only. Otherwise we should probably not see a (already
> impressive) 20-40% speed-up (IIRC), but rather something closer to
> 200-400%.

Oh, we're not done! The current work does not analyze the heap as 
aggressively as it might. We want objects that can be, say, four int32 
machine types in a row, to be inferred that way and represented that way. 
Currently such a type would take four "any" values in a row, plus the usual 
header for metadata.


> So the inferencer has to work with approximations and fallbacks. For a
> language like JS, where a lot of conceptual polymorphism, potential
> mutation, and "untypable" operations are going on, those
> approximations will remain omnipresent, except, mostly, in
> sufficiently local contexts.

Yes, and a key element of TI in SpiderMonkey is to put the "monster in the 
box" -- to avoid the untyped abstractions in one's JS polluting the whole 
inference. We try to fall back on runtime PICs and the other dynamic 
optimizations where we can. This means some guarding, or to avoid guards, 
some invalidation protocol overhead instead of guards. And low-level 
barriers to monitor all writes.


> Not to say that it is not worth extending the boundaries -- it
> definitely is. But it will only get you that far.

Farther enough than without, that it seems worth it. Again for me the big 
cosmic god-mode tradeoff is implementors working harder on these approaches, 
vs. throwing users to the wolves of type (over-)annotation.


>> Type annotations or (let's say) "guards" as for-all-time monotonic bounds 
>> on mutation are useful to programmers too, for more robust 
>> programming-in-the-large. That's a separate (and better IMHO) argument 
>> than performance. It's why they are on the Harmony agenda.
>
> Of course I'd never object to the statement that there are far better
> reasons to have typy features than performance. :) I just didn't
> mention it because it wasn't the topic of the discussion.

It's useful to be reminded of the performance wins that are possible with 
judicious use of type annotations, though. I expect we'll feel some "darts" 
(lol) in our backside on this point (heh).


>>> So despite all the cool technology we use these days, it is safe to
>>> assume that we will never play in the performance league of typed
>>> languages. Unless we introduce real types into JS, of course. :)
>>
>> Does JS need to be as fast as Java? Would half as fast be enough?
>
> No, it doesn't have to be as fast. Not yet, at least... I estimate we
> have another 3 years. ;)

Agreed!

/be
_______________________________________________
es-discuss mailing list
es-discuss at mozilla.org
https://mail.mozilla.org/listinfo/es-discuss 



More information about the es-discuss mailing list