assert semantic change proposal

via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 5 13:11:16 PDT 2014


On Tuesday, 5 August 2014 at 18:57:40 UTC, H. S. Teoh via 
Digitalmars-d wrote:
> Exactly. I think part of the problem is that people have been 
> using
> assert with the wrong meaning. In my mind, 'assert(x)' doesn't 
> mean
> "abort if x is false in debug mode but silently ignore in 
> release mode",
> as some people apparently think it means. To me, it means "at 
> this point
> in the program, x is true".  It's that simple.

A language construct with such a meaning is useless as a safety 
feature. If I first have to prove that the condition is true 
before I can safely use an assert, I don't need the assert 
anymore, because I've already proved it. If it is intended to be 
an optimization hint, it should be implemented as a pragma, not 
as a prominent feature meant to be widely used. (But I see that 
you have a different use case, see my comment below.)

> The optimizer only guarantees (in theory)
> consistent program behaviour if the program is valid to begin 
> with. If
> the program is invalid, all bets are off as to what its 
> "optimized"
> version does.

There is a difference between invalid and undefined: A program is 
invalid ("buggy"), if it doesn't do what it's programmer 
intended, while "undefined" is a matter of the language 
specification. The (wrong) behaviour of an invalid program need 
not be undefined, and often isn't in practice.

An optimizer may only transform code in a way that keeps the 
resulting code semantically equivalent. This means that if the 
original "unoptimized" program is well-defined, the optimized one 
will be too.

> Yes, the people using assert as a kind of "check in debug mode 
> but
> ignore in release mode" should really be using something else 
> instead,
> since that's not what assert means. I'm honestly astounded that 
> people
> would actually use assert as some kind of 
> non-release-mode-check instead
> of the statement of truth that it was meant to be.

Well, when this "something else" is introduced, it will need to 
replace almost every existing instance of "assert", as the latter 
must only be used if it is proven that the condition is always 
true. To name just one example, it cannot be used in range 
`front` and `popFront` methods to assert that the range is not 
empty, unless there is an additional non-assert check directly 
before it.

>
> Furthermore, I think Walter's idea to use asserts as a source of
> optimizer hints is a very powerful concept that may turn out to 
> be a
> revolutionary feature in D. It could very well develop into the 
> answer
> to my long search for a way of declaring identities in 
> user-defined
> types that allow high-level optimizations by the optimizer, thus
> allowing user-defined types to be on par with built-in types in
> optimizability. Currently, the compiler is able to optimize 
> x+x+x+x into
> 4*x if x is an int, for example, but it can't if x is a 
> user-defined
> type (e.g. BigInt), because it can't know if opBinary was 
> defined in a
> way that obeys this identity. But if we can assert that this 
> holds for
> the user-defined type, e.g., BigInt, then the compiler can make 
> use of
> that axiom to perform such an optimization.  This would then 
> allow code
> to be written in more human-readable forms, and still maintain 
> optimal
> performance, even where user-defined types are involved.

This is a very powerful feature indeed, but to be used safely, 
the compiler needs to be able to detect invalid uses reliably at 
compile time. This is currently not the case:

     void onlyOddNumbersPlease(int n) {
         assert(n % 2);
     }

     void foo() {
         onlyOddNumbersPlease(42);    // shouldn't compile, but 
does
     }

It would be great if this were possible. In the example of 
`front` and `popFront`, programs that call these methods on a 
range that could theoretically be empty wouldn't compile. This 
might be useful for optimization, but above that it's useful for 
verifying correctness.

Unfortunately this is not what has been suggested (and was 
evidently intended from the beginning)...


More information about the Digitalmars-d mailing list