OT (partially): about promotion of integers

foobar foo at bar.com
Wed Dec 12 02:33:56 PST 2012


On Wednesday, 12 December 2012 at 00:43:39 UTC, H. S. Teoh wrote:
> On Wed, Dec 12, 2012 at 01:26:08AM +0100, foobar wrote:
>> On Wednesday, 12 December 2012 at 00:06:53 UTC, bearophile 
>> wrote:
>> >foobar:
>> >
>> >>I would enforce overflow and underflow checking semantics.<
>> >
>> >Plus one or two switches to disable such checking, if/when 
>> >someone
>> >wants it, to regain the C performance. (Plus some syntax way 
>> >to
>> >disable/enable such checking in a small piece of code).
>> >
>> >Maybe someday Walter will change his mind about this topic :-)
>
> I don't agree that compiler switches should change language 
> semantics.
> Just because you specify a certain compiler switch, it can cause
> unrelated breakage in some obscure library somewhere, that 
> assumes
> modular arithmetic with C/C++ semantics. And this breakage will 
> in all
> likelihood go *unnoticed* until your software is running on the
> customer's site and then it crashes horribly. And good luck 
> debugging
> that, because the breakage can be very subtle, plus it's *not* 
> in your
> own code, but in some obscure library code that you're not 
> familiar
> with.
>
> I think a much better approach is to introduce a new type (or 
> new types)
> that *does* have the requisite bounds checking and static 
> analysis.
> That's what a type system is for.
>
>
> [...]
>> Yeah, of course, that's why I said the C# semantics are _way_
>> better. (That's a self quote)
>> 
>> btw, here's the link for SML which does not use tagged ints -
>> http://www.standardml.org/Basis/word.html#Word8:STR:SPEC
>> 
>> "Instances of the signature WORD provide a type of unsigned 
>> integer
>> with modular arithmetic and logical operations and conversion
>> operations. They are also meant to give efficient access to the
>> primitive machine word types of the underlying hardware, and 
>> support
>> bit-level operations on integers. They are not meant to be a
>> ``larger'' int. "
>
> It's kinda too late for D to rename int to word, say, but it's 
> not too
> late to introduce a new checked int type, say 'number' or 
> something like
> that (you can probably think of a better name).
>
> In fact, Andrei describes a CheckedInt type that uses operator
> overloading, etc., to implement an in-library solution to 
> bounds checks.
> You can probably expand that into a workable lightweight int
> replacement. By wrapping an int in a struct with custom 
> operators, you
> can pretty much have an int-sized type (with value semantics, 
> just like
> "native" ints, no less!) that does what you want, instead of 
> the usual
> C/C++ int semantics.
>
>
> T

I didn't say D should change the implementation of integers, in 
fact I said the exact opposite - that it's probably to late to 
change the semantics for D. Had D was designed from scratch than 
yes, I would have advocated for a different design, either the C# 
one or as you suggest go even further and have two distinct types 
(as in SML) which is even better. But by no means am I to suggest 
to change D semantics _now_. Sadly, it's likely to late and we 
can only try to paper it on top with additional library types. 
This isn't a perfect solutions since the compiler has builtin 
knowledge about int and does optimizations that will be lost with 
a library type.


More information about the Digitalmars-d mailing list