Re: [RFC][PATCH 0/5] arch: atomic rework
From: Torvald Riegel
Date: Mon Feb 17 2014 - 18:42:45 EST
On Mon, 2014-02-17 at 14:47 -0800, Linus Torvalds wrote:
> On Mon, Feb 17, 2014 at 2:25 PM, Torvald Riegel <triegel@xxxxxxxxxx> wrote:
> > On Mon, 2014-02-17 at 14:02 -0800, Linus Torvalds wrote:
> >>
> >> The argument was that an lvalue doesn't actually "access" the memory
> >> (an rvalue does), so this:
> >>
> >> volatile int *p = ...;
> >>
> >> *p;
> >>
> >> doesn't need to generate a load from memory, because "*p" is still an
> >> lvalue (since you could assign things to it).
> >>
> >> This isn't an issue in C, because in C, expression statements are
> >> always rvalues, but C++ changed that.
> >
> > Huhh. I can see the problems that this creates in terms of C/C++
> > compatibility.
>
> That's not the biggest problem.
>
> The biggest problem is that you have compiler writers that don't care
> about sane *use* of the features they write a compiler for, they just
> care about the standard.
>
> So they don't care about C vs C++ compatibility. Even more
> importantly, they don't care about the *user* that uses only C++ and
> the fact that their reading of the standard results in *meaningless*
> behavior. They point to the standard and say "that's what the standard
> says, suck it", and silently generate code (or in this case, avoid
> generating code) that makes no sense.
There's an underlying problem here that's independent from the actual
instance that you're worried about here: "no sense" is a ultimately a
matter of taste/objectives/priorities as long as the respective
specification is logically consistent.
If you want to be independent of your sanity being different from other
people's sanity (e.g., compiler writers), you need to make sure that the
specification is precise and says what you want. IOW, think about the
specification being the program, and the people being computers; you
better want a well-defined program in this case.
> So it's not about C++ being incompatible with C, it's about C++ having
> insane and bad semantics unless you just admit that "oh, ok, I need to
> not just read the standard, I also need to use my brain, and admit
> that a C++ statement expression needs to act as if it is an "access"
> wrt volatile variables".
1) I agree that (IMO) a good standard strives for being easy to
understand.
2) In practice, there is a trade-off between "Easy to understand" and
actually producing a specification. A standard is not a tutorial. And
that's for good reason, because (a) there might be more than one way to
teach something and that should be allowed and (b) that the standard
should carry the full precision but still be compact enough to be
manageable.
3) Implementations can try to be nice to users by helping them avoiding
error-prone corner cases or such. A warning for common problems is such
a case. But an implementation has to draw a line somewhere, demarcating
cases where it fully exploits what the standard says (eg, to allow
optimizations) from cases where it is more conservative and does what
the standard allows but in a potentially more intuitive way. That's
especially the case if it's being asked to produce high-performance
code.
4) There will be arguments for where the line actually is, simply
because different users will have different goals.
5) The way to reduce 4) is to either make the standard more specific, or
to provide better user documentation. If the standard has strict
requirements, then there will be less misunderstanding.
6) To achieve 5), one way is to get involved in the standards process.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/