D's treatment of values versus side-effect free nullary functions

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Wed Jul 21 09:04:18 PDT 2010


Don wrote:
> Jonathan M Davis wrote:
>> On Tuesday, July 20, 2010 17:24:33 bearophile wrote:
>>> Jonathan M Davis:
>>>> But theoretically, it
>>>> could be used for optimizations just like inlining (particularly with
>>>> pure functions), and that being the case, it probably will at some
>>>> point.
>>> Pure functions go well with CTFE because they don't use global state, 
>>> but
>>> you can run code at compile time only if all the arguments are known at
>>> compile time :-)
>>>
>>> If some of their arguments are known at compile time and some of them 
>>> are
>>> not known, and you want to optimize better, then you need partial
>>> compilation, that is a bit hard to implement, probably makes the 
>>> compiler
>>> slow and complex.
>>>
>>> So for a practical form of manual partial compilation practical time 
>>> ago I
>>> have proposed something similar to GCC __builtin_constant_p
>>> (http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Other-Builtins.html#index-g_t 
>>>
>>> _005f_005fbuiltin_005fconstant_005fp-2392 ), that is syntax sugar 
>>> that you
>>> can use inside functions to turn them into templates (I don't know if 
>>> you
>>> can also have a single entry point to keep the possibility of taking 
>>> their
>>> address). You can use a static if with such __trait(isCTAgument, 
>>> foo), to
>>> tell if each function argument as foo is known at compile time, and do
>>> something with it if it is. This is like defining those arguments as CT
>>> template arguments, that later the optimizer can optimize better (and
>>> perform the partial compilation).
>>>
>>> Bye,
>>> bearophile
>>
>> Partial compilation would indeed be a big step forward, but it would 
>> certainly be a lot of work. Just being able to have functions run with 
>> CTFE which could be fully run with CTFE would lead to some nice 
>> optimizations. Certainly, that would need to be achieved before we 
>> could look at having partial compilation. Still, partial compilation 
>> would certainly be cool if we ever reached that point.
>>
>> - Jonathan M Davis
> 
> While running the semantic on each function body, the compiler could 
> fairly easily check to see if the function is CTFEable. (The main 
> complication is that it has to guess about how many iterations are 
> performed in loops).

I don' think that's easy. The compiler would need to do a fixed-point 
iteration on the transitive closure of the functions called by the 
analyzed function.

Andrei


More information about the Digitalmars-d mailing list