Microsoft working on new systems language

Chris Cain clcain at uncg.edu
Tue Dec 31 12:29:32 PST 2013


On Tuesday, 31 December 2013 at 19:53:29 UTC, Ola Fosheim Grøstad 
wrote:
> On Tuesday, 31 December 2013 at 17:52:56 UTC, Chris Cain wrote:
>> 1. The compiler writer will actually do this analysis and 
>> write the optimization (my bets are that DMD will likely not 
>> do many of the things you suggest).
>
> I think many optimizations become more valuable when you start 
> doing whole program anlysis.

You're correct, but I think the value only comes if it's actually 
done, which was my point.

>> 2. The person writing the code is writing code that is 
>> allocating several times in a deeply nested loop.
>
> The premise of efficient high level/generic programming is that 
> the optimizer will undo naive code.

Sure. My point was that it's a very precise situation that the 
optimization would actually work effectively enough to be 
significant enough to discard the advantages of using a library 
solution. If there were no trade offs for using a compiler 
supported new, then even a tiny smidge of an optimization here 
and there is perfectly reasonable. Unfortunately, that's not the 
case. The only times where I think the proposed optimization is 
significant enough to overcome the tradeoff is precisely the type 
of situation I described.

Note I'm _not_ arguing that performing optimizations is 
irrelevant. Like you said, "The premise of efficient high 
level/generic programming is that the optimizer will undo naive 
code." But that is _not_ the only facet that needs to be 
considered here. If it were, you'd be correct and we should 
recommend only using new. But since there are distinct advantages 
to a library solution and distinct disadvantages to the compiler 
solution, the fact that you _could_, with effort, make small 
optimizations on occasion just isn't enough to overturn the other 
tradeoffs you're making.

>> 3. Despite the person making the obvious critical error of 
>> allocating several times in a deeply nested loop, he must not 
>> have made any other significant errors or those other errors 
>> must also be covered by optimizations
>
> I disagree that that inefficiencies due to high level 
> programming is a mistake if the compiler has opportunity to get 
> rid of it. I wish D would target high level programming in the 
> global scope and low level programming in limited local scopes. 
> I think few applications need hand optimization globally, 
> except perhaps raytracers and compilers.

You seem to be misunderstanding my point again. I'm _not_ 
suggesting D not optimize as much as possible and I'm not 
suggesting everyone "hand optimize" everything. Following my 
previous conditions, this condition is obviously suggesting that 
there isn't any other significant problems which would minimize 
the effect of your proposed optimization.

So, _if_ the optimization is put in place, and _if_ the code in 
question is deeply nested to make the code take a significant 
amount of time so that your proposed optimization has a chance to 
be actually useful, then now we have to ask the question "are 
there any other major problems that are also taking up 
significant time?" If the answer is "Yes, there are other major 
problems" then your proposed speed-up seems less likely to 
matter. That's where I was going.

>> Manual optimization in this case isn't too unreasonable.
>
> I think manual optimization in most cases should be privided by 
> the programmer as compiler hints and constraints.

In some cases, yes. An "inline" hint, for instance, makes a ton 
of sense. Are you suggesting that there should be a hint provided 
to new? Something like: `Something thing = new (@stackallocate) 
Something(arg1,arg2);`? If so, it seems like a really roundabout 
way to do it when you could just do `Something thing = 
stackAlloc.make!Something(arg1,arg2);` I don't see hints possibly 
being provided to new being an advantage at all. All that means 
is that to add additional "hint" allocators, you'd have to dive 
into the compiler (and language spec) as opposed to easily 
writing your own as a library.

>> Think of replacing library calls when it's noticed that it's 
>> an allocate function. It's pretty dirty and won't actually 
>> happen nor do I suggest it should happen, but it's actually 
>> still also _possible_.
>
> Yes, why not? As long as the programmer has the means to 
> control it. Why not let the compiler choose allocation 
> strategies based on profiling for instance?

Uhh... You don't see the problem with the compiler tying itself 
to the implementation of a library allocate function? Presumably 
such a thing would _only_ be done using the default library 
allocator since when the programmer says "use 
std.allocator.StackAllocator" he generally means it. And I find 
the whole idea of the compiler hard-coding "if the programmer 
uses std.allocator.DefaultAllocator.allocate then instead of 
emitting that function call do ..." to be more than a bit ugly. 
Possible, but horrific.


More information about the Digitalmars-d mailing list