Mark S. Miller wrote:
On Sun, Jul 14, 2013 at 10:39 PM, Brendan Eich <[email protected] <mailto:[email protected]>> wrote:

    Mark S. Miller wrote:

        First, I wholeheartedly agree. JS is increasingly being used
        as a target of compilation. When I asking people doing so what
        they biggest pain point is, the lack of support for integers
        is often the first thing mentioned.


    int64/uint64 come up faster when compiling from C/C++. I've
    prototyped these in SpiderMonkey in a patch that I'm still
    rebasing, but planning to land pretty soon:

    https://bugzilla.mozilla.org/show_bug.cgi?id=749786


I don't think we should introduce precision limited integers into JS, ever. The only point would be to do something weird on overflow of the precision limit. The traditional C-like weirdness is wrapping -- the only advantage being that it avoids even needing to check for overflow.

We already have precision limited integers in JS, both via the bitwise-logical and shift operators, and via typed arrays / binary data. We need 64-bit ints for the latter, scalar and SIMD-vector as well as arbitrary length typed array element type.

This ship has sailed, bignums are not equivalent or a superset. These are in the hardware, they need to be in JS for the "memory safe low-road" role it plays for WebGL, asm.js, etc.

        Were we not introducing TypedArrays until ES7, would we have
        typedArray.length be a bignum rather than a floating point
        number? If so, is there anything we can do in ES6 to leave
        ourselves this option in ES7?


    That would be unwanted, overkill. All typed arrays want is memory
    capacity, and 64 bits is more than enough. Even 53 is enough, and
    that's where ES6 is going, last I talked to Allen. People do want
    >4MB typed arrays.



When a bignum represents a small integer, there's no reason that it needs to be any slower than a JS floating point number representing a small integer. Most JS implementations already optimize the latter to store the small integer in the "pointer" with a tag indicating that the non-tag bits are the small integer value. Exactly the same trick has been used for bignums in Lisps and Smalltalks for many decades.

Sure, I'm familiar -- but again those older implementations did not face the performance constraints of the "low road" that JS does, nor were they were quite so aggressively optimized.

I'm not saying bignums couldn't be used as doubles are today -- they could.

Rather, JS has number and always will, and the speculations toward int are sunk cost (good sunk cost in a practical sense). Waiting for bignums to come in before typed arrays, just to support types bigger than memory in any foreseeable future, and get the same optimizations as number, does not fly. We won't wait in ES6 -- we will be lucky to get integer-domain double instead of uint32 lengths for typed arrays if not arrays.

As long as the numbers represent small integers, I think the only differences would be semantics, not performance.

Both, in the "short run", in practice. But we aren't even doing bignums in ES6, and we are doing typed arrays / binary data. We need to satisfy >4G memory buffer use cases now, and be future-proof. 53 bits is enough.

/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to