Adam D. Ruppe:

> I wonder if it would be a good idea to have logging or debug prints
> that simply lie about being pure so you can use them there.

If the compiler sees a function as pure, the debug prints may or may not appear 
according to how much pure-related optimizations the compiler is doing. This is 
a test done with C code compiled with GCC 4.6:


#include "math.h"
#include "stdio.h"

__attribute__((const, noinline))
static float sigmoid1(const float x) {
    puts("hello world");
    return 1.0f / (1.0f - exp(-x));
}

static float calculate(const float x, const unsigned int n) {
    unsigned int i;
    float sum = 0.0;
    for (i = 0; i < n; ++i)
        sum += sigmoid1(x);
    return sum;
}

int main(int argc, const char **argv) {
    const int x = argc;
    const float y = calculate(x, 20);
    printf("%f\n", y);
    return 0;
}



The GCC attribute "const" is similar to the pure of D (GCC also has the "pure" 
attribute but I think it's a little different). If you compile this program 
with -O0 you get 20 hello world, if you compile with -O3 GCC performs the pure 
optimizations and prints a single hello world. Is this an acceptable debug 
printing for you? For me it's not good enough.

An alternative solution, that avoids the need of the -disablepure switch, is to 
state in the D specs that pure-related optimizations are not performed if the 
program is not compiled in an optimized (-O) way.

I have not used D/DMD for this example because DMD isn't optimizing purity 
enough yet.

Bye,
bearophile

Reply via email to