Getting the const-correctness of Object sorted once and for all
Chris Cain
clcain at uncg.edu
Mon May 14 00:47:25 PDT 2012
On Monday, 14 May 2012 at 06:27:15 UTC, Walter Bright wrote:
> On 5/13/2012 11:09 PM, Mehrdad wrote:
>> (1) Compiler helps you write correct multithreaded code
>> (2) You help compiler perform optimizations based on contracts
>> (3) I don't think there exists a #3 that's very different from
>> #1 and #2
>
> #3 Improves self-documentation of code - it's more
> understandable and less susceptible to breakage during
> maintenance.
>
> #4 Improves encapsulation
>
> #5 Makes function purity possible
And all this together culminates into a much greater ability to
_reason about code_.
Suppose I have code like this:
immutable item = ...;
auto res = aPureFunct(item);
// tons of code
auto calc = someVal * aPureFunct(item);
Barring the fact that the compiler will probably optimize this
out for you in D... If you were writing C++ code like this, you
couldn't tell _almost anything_ about this code based on that
fragment I gave you. The mere fact that I can tell you
_something_ is shocking. I can figure out properties and reason
about code, even in small chunks like this. I know that I can
replace "aPureFunct(item)" with res and it'll be equivalent.
I'd say that this is my favorite reason (but non-obvious unless
you actually code using const/immutable):
#6 Reduced cognitive load
I posted this elsewhere, but it also ties multiple things
together (including the GC):
How about if you're trying to figure out how often a substring of
length 10 is repeated in some large string (maybe 4 million
characters long?). In D:
uint[string] countmap;
foreach(i; 0..str.length-10)
++countmap[str[i..i+10]];
And you're done. Because your string is immutable, D will do the
correct thing and use pointer+length to the original huge string
and won't waste time copying things that are guaranteed not to
change into its hash table. Thanks to the GC, you don't have to
worry about watching your pointers to make sure they get deleted
whenever it's appropriate (when you're done, you can just clear
out countmap and the GC will collect the string if it's not used
by anyone else...). Presumably the associative array
implementation could take advantage of both the immutability of
the string and the purity of toHash to cache the result of
hashing (although, I'm not certain it does).
Now imagine the code you'd have to write in C++ or many other
languages to do this _right_. Not just fast, but _also_ correct.
The fact of the matter is that, considering all of D's features,
the whole is greater than the sum of its parts. Can you find
something wrong with each part? Of course. But the fact of the
matter is that each of them support each other in such a way that
they synergistically improve the language ... if you take any one
of them away, you would be left with everything else being less
useful than before.
This is why you really ought to spend some time with const and
immutable (and, yeah, they're mostly inseparable) and really get
to know what it enables you to do. Tons of features and
capabilities depend on it, so it's really not something that
"should be gotten rid of to make the language more marketable".
I'm not saying I wouldn't use D if we lost const/immutable, but
it would certainly sour my experience with it.
More information about the Digitalmars-d
mailing list