Compile time function execution...
Andrei Alexandrescu (See Website For Email)
SeeWebsiteForEmail at erdani.org
Fri Feb 16 12:27:30 PST 2007
Dave wrote:
> Andrei Alexandrescu (See Website For Email) wrote:
>> Walter Bright wrote:
>>> janderson wrote:
>>>> Walter Bright wrote:
>>>>> Right now, the compiler will fail if the compile time execution
>>>>> results in infinite recursion or an infinite loop. I'll have to
>>>>> figure out some way to eventually deal with this.
>>>>
>>>> Maybe you could allow the user to specify stack size and maximum
>>>> iteration per loop/recursion function to the compiler as flags (with
>>>> some defaults). This way the user can up the size if they really
>>>> need it. This would make it a platform thing. That way a D
>>>> compiler could still be made for less powerful systems.
>>>
>>> Whether you tell it to fail at a smaller limit, or it fails by itself
>>> at a smaller limit, doesn't make any difference as to whether it runs
>>> on a less powerful system or not <g>.
>>>
>>> The C standard has these "minimum translation limits" for all kinds
>>> of things - number of lines, chars in a string, expression nesting
>>> level, etc. It's all kind of bogus, hearkening back to primitive
>>> compilers that actually used fixed array sizes internally (Brand X,
>>> who-shall-not-be-named, was notorious for exceeding internal table
>>> limits, much to the delight of Zortech's sales staff). The right way
>>> to build a compiler is it either runs out of stack or memory, and
>>> that's the only limit.
>>>
>>> If your system is too primitive to run the compiler, you use a cross
>>> compiler running on a more powerful machine.
>>>
>>> I have thought of just putting a timer in the interpreter - if it
>>> runs for more than a minute, assume things have gone terribly awry
>>> and quit with a message.
>>
>> That could be achieved with a watchdog process without changing the
>> compiler, and it's more flexible.
>>
>> I think you just let the compiler go and crunch at it. Since you
>> esentially have partial evaluation anyway, the execution process can
>> be seen as extended to compile time. If you have a non-terminating
>> program, that non-termination can be naturally manifest itself during
>> compilation=partial evaluation.
>>
>
> Completely agree, otherwise it contradicts your "right way to build a
> compiler" statement except with time as the metric instead of memory.
> Imagine the frustration of someone who has legitimate code and the
> compiler always craps out half-way through a looong makefile, or worse
> only sometimes craps out depending on machine load.
Yes, memory watching would be great. It is easy to write a script that
watches dmd's memory and time consumed, and kills it past some
configurable threshold.
> I think the best solution is to list out any compile-time execution with
> the '-v' switch. That way if someone runs into this, they can throw -v
> and find out where it's happening.
Sounds great.
Andrei
More information about the Digitalmars-d
mailing list