Vision for the D language - stabilizing complexity?
John Colvin via Digitalmars-d
digitalmars-d at puremagic.com
Wed Jul 13 02:19:29 PDT 2016
On Wednesday, 13 July 2016 at 00:03:04 UTC, Walter Bright wrote:
> On 7/12/2016 6:13 AM, John Colvin wrote:
>> On Tuesday, 12 July 2016 at 10:19:04 UTC, Walter Bright wrote:
>>> On 7/12/2016 2:40 AM, John Colvin wrote:
>>>> For the previous statement to be false, you must define
>>>> cases where
>>>> casting away immutability *is* defined.
>>>
>>> @system programming is, by definition, operating outside of
>>> the
>>> language guarantees of what happens. It's up to you, the
>>> systems
>>> programmer, to know what you're doing there.
>>
>> This is so, so wrong. There's a world of difference between
>> "you have to
>> get this right or you're in trouble" and "the compiler (and
>> especially
>> the optimiser) is free to assume that what you're doing never
>> happens".
>> Undefined behaviour, as used in practice by modern optimising
>> compilers,
>> is in the second camp. You might have a different definition,
>> but it's
>> not the one everyone else is using and not the one that our
>> two fastest
>> backends understand.
>>
>> Given the definition of undefined behaviour that everyone else
>> understands, do you actually mean "modifying immutable data by
>> any means
>> is undefined behaviour" instead of "casting away immutable is
>> undefined
>> behaviour"?
>
> What's the difference?
"Casting away immutable is undefined behaviour": the following
code has undefined results (note, not implementation defined, not
if-you-know-what-you're-doing defined, undefined), despite not
doing anything much:
void foo()
{
immutable a = new int;
auto b = cast(int*)a;
}
"modifying immutable data is undefined": The above code is fine,
but the following is still undefined:
void foo()
{
immutable a = new int;
auto b = cast(int*)a;
b = 3;
}
> Anyhow, if you cast away immutability, and the data exists in
> rom, you still can't write to it (you'll get a seg fault). If
> it is in mutable memory, you can change it, but other threads
> may be caching or reading the value while you do that, i.e.
> synchronization issues. The optimizer may be taking advantage
> of immutability in its semantic transformations.
>
> As a systems programmer, you'd have to account for that.
Something like "it might be in ROM" is an implementation detail.
It's the optimiser part that forces a formal decision about what
is undefined behaviour or not.
Implementation defined behaviour is in the realm of the "systems
programming, be careful you know what you're doing". Undefined
behaviour is a different beast.
More information about the Digitalmars-d
mailing list