Okay, what happened to my literal strings?

Bill Baxter dnewsgroup at billbaxter.com
Fri Sep 7 15:24:39 PDT 2007


Burton Radons wrote:
> 
> "Walter Bright" <newshound1 at digitalmars.com> wrote in message 
> news:fbq3d5$1j0j$1 at digitalmars.com...
>> 1) It opens the door to functional programming. This means that 
>> function calls can be automatically parallelized, which is going to 
>> become an increasingly big deal as people try to figure out how to use 
>> their multicore processors.
>>
>> Note that C++ const CANNOT do FP, and Java CANNOT do const. This will 
>> open up a huge advantage for D.
> 
> But you can't do any serious optimisations (like SIMD) unless if you 
> have the function body, in which case proving it's procedural (or where 
> the output is defined based on hermetic input) is relatively simple and 
> completely foolproof.
> 
> C-type languages have too much of a fetish for becoming undefined. If my 
> function is declared const or invariant, but it's not (which the 
> language rules allow), it's undefined and the worst kind of undefined - 
> the kind which works initially, and might even work with -O. But then 
> one day it doesn't because of new optimisations or because the file is 
> compiled in a different environment or even because the operating system 
> has been upgraded or the same code is executed on a different processor 
> or the code is moved into a different context or it or a dependency has 
> been slightly modified. This can cause major damage to older code and 
> forces dozens of discrete optimisation flags to try to get it to compile 
> properly with a little more speed.
> 
> If the language could not be put into an undefined state (but could be 
> put into an erroneous state which could be detected in debug 
> compilations) then you'd be free to implement any compliant optimisation 
> without worrying about how much code it breaks. "Aggressive 
> optimisation" wouldn't be a bad thing in that context.
> 
>> 2) People who work on large projects with several teams modifying the 
>> code tell me unequivocably that they need some sort of const to 
>> enforce modularity.
> 
> I don't think you believe it's adequate to do that. I'd expect that to 
> be a good situation for programmers using const incorrectly, because 
> they might need to cast const off code which they're not in control of, 
> particularly when the internal rule is "you should const anything you 
> don't modify" (which is an easy trap) instead of "you should const 
> anything you /shouldn't/ modify".
> 
>> 3) Const improves the self-documentation of interfaces.
> 
> In this context, const is being used to describe a contract with the 
> user. But contracts of this sort are impossible to reduce to a 
> combination of keywords and unenforcable in all contexts by the 
> compiler; there are too many subtleties. This belongs in the 
> documentation itself.
> 
> A good example is "char* strchr (const char*, char)" from C. That 
> implies that the return value is not a pointer to an index of the first 
> argument, but it is, it's just not declared that way because the 
> argument itself may not be const. So the signature misses the subtlety 
> of the true contract. If the user uses this signature as 
> self-documentation then they could easily make an error. If it were 
> instead "const char* strchr (const char*, char)" then the contract goes 
> beyond what is strictly required because it's so blunt, and interpreted 
> as self-documentation requires the user to make a copy before any 
> modifications of the return value (and makes it impossible to do certain 
> operations). If we decide that we don't want to lie then we can declare 
> it as "char* strchr (char*, char)", which implies that the function 
> modifies the string (because of the absence of const), when it never 
> does; interpreted as self-documentation you'd always call it with 
> mutable data. There's no happy medium: in any case the 
> self-documentation is wrong and harms the user.
> 
> This could be "fixed" through a complex set of attributes, in this case 
> something like "argument (a) strchr (const char*a, char)", so the 
> compiler could assume that if it calls it with a non-const argument then 
> it gets a non-const argument in return and vice versa, and the function 
> can be implemented without casting off const. But even keeping these 
> literate contracts to const there are many variations that would require 
> the user to learn a new language to interpret them when simple 
> human-interpreted language more than suffices.
> 

I think the actual "fix" in C++ would be just to define a version of 
strchr overloaded on const.  So you have both:

    const char* strchr(const char*, char);
and
    char* strchr(char*, char);

If you pass it a char* that can be modified, it'll give you back one 
that can be modified. Otherwise it won't.

--bb



More information about the Digitalmars-d mailing list