Am 06.12.2013 23:40, schrieb bearophile:
Walter Bright:

comes up now and then. I think it's incorrect, D has many inherent
advantages in generating code over C:

I think in your list you have missed the point 8, that is templates
allow for data specialization, or for specialization based on
compile-time values.

The common example of the first is the C sort() function compared to the
type specialized one.

An example for the second is code for the kD-tree that is specialized on
the dimension (coordinate) to slice on:
http://rosettacode.org/wiki/K-d_tree#D

As you see the cyclic selection of the coordinate nextSplit is assigned
to an enum:

struct KdTree(size_t k, F) {
     KdNode!(k, F)* n;
     Orthotope!(k, F) bounds;

     // Constructs a KdTree from a list of points...
     this(Point!(k, F)[] pts, in Orthotope!(k, F) bounds_) pure {
         static KdNode!(k, F)* nk2(size_t split)(Point!(k, F)[] exset)
         pure {
...
             enum nextSplit = (split + 1) % d.length;//cycle coordinates



2. D knows when functions are pure. C has to make worst case assumptions.

Perhaps D purity were designed for usefulness, code correctness, etc.
but not to help compilers. I remember some recent discussions in this
newsgroup by developers of GDC that explained why the guarantees D
offers over C can't lead to true improvements in the generated code. If
this is true then perhaps D has some features that weren't designed in
hindsight of what back-ends really need to optimize better.


On this whole subject I remember that pointers in Fortan are regarded as
so dis-empowered that the Fortran compiler is able to optimize their
usage better than any pointers in usual C programs, even C99 programs
that use the "restrict" keyword.


There are also situations where D is slower than D: when D can't prove
that an array will be accessed in bounds [*]. And when a D compiler
because of separate compilation can't de-virtualize a virtual class
method call.

Bye,
bearophile

[*] I will have to say more on this topic in few days.


That is why most safe systems programming language compilers allow disabling bounds checking. :)

Back in the MS-DOS days, I made use of {$R-} sections if I really needed the few ms gained by disabling bounds checking in Turbo Pascal.

--
Paulo

Reply via email to