Why CTFE I/O would be awesome: No-Build-Tool Custom Build Steps

Nick Sabalausky a at a.a
Thu Mar 22 18:12:35 PDT 2012


"Nick Sabalausky" <a at a.a> wrote in message 
news:jkdho8$1p3a$1 at digitalmars.com...
> "F i L" <witte2008 at gmail.com> wrote in message
> news:sofbqiiyvragxjaxqbix at forum.dlang.org...
>> Kapps wrote:
>>> or even automatically creating bindings for a C header file.
>>
>> I've thought about that before. It would be great to have fully automatic
>> linking to C libs. You could even have a cache system that stores .di
>> files and only regenerates them if the .h file was modified.
>>
>
> That hits on the one irritating limitation of CTFE: No I/O. So that cache
> system would be a no-go right now.
>

(I'm branching this off from "Three Unlikely Successful Features of D")

At least one way I think CTFE I/O could be a really big thing:

A library could include any custom build steps it needed (or at least 
pre-build steps) *in* the library itself without the library's user needing 
to deal with buildscripts/buildtools. You can *kinda* do it now, but it 
requires all the processing be done within the naturally-slow and 
memory-hungry CTFE interpreter (compared to just running already-compiled 
native code), and *everything* will be recomputed on every compile whether 
it needs to be or not. So it'd be more of a curiosity right now than a real 
professional approach. But with CTFE I/O, that can change, and I think that 
could be a very big thing:

For example (and I apologize if this sounds like shameless promotion of my 
project - but it's a good example of the scenarios I have in mind), the 
typical expected workflow in most cases for Goldie Parsing System is like 
this:

1. Run 'goldie-grmc' to compile your grammar definition from the BNF-like 
GRM file to a CGT file ("compiled grammar tables" - ie, precomputed LALR and 
DFA tables). This can take some real non-trivial time for non-trivial 
grammars. 'Couse, I think I can still optimize it more, but the nature of 
LALR still prevents this step from scaling well even when natively compiled, 
let alone if it were to be run inside CTFE.

2. Run 'goldie-staticlang' on the CGT file to generate a D library 
custom-tailered for your grammar.

3. Compile your program (which imports the generated D files from 
'goldie-static'').

Obviously there's improvements I can still make, such allowing 
'goldie-staticlang' to optionally do the job of 'goldie-grmc' (thus merging 
steps 1 and 2). Or, it should be possible to make 'goldie-staticlang' (minus 
any 'goldie-grmc' features) a CTFE-based library instead of an external 
tool, once some DMD bugs are fixed. But there's *still* a custom build step 
required, which you have to manually add into your buildscript, or even run 
manually. And while that build step could theoretically be made CTFE-able, 
it would be much less efficient, and would *considerably* slow down compile 
times for *every* compile.

But:

If CTFE had I/O, I'm pretty sure I could set things up so that *all* you'd 
need to do is step 3: import Goldie and compile your program. Then, inside 
Goldie, there would be some CTFE that checks if the CGT file is missing or 
out-of-date, and if so (and *only* if so), invokes 'goldie-grmc' on it 
automatically - which will run at *full* natively-compiled efficiency.  Then 
it would do the same for 'goldie-staticlang' (although it should be 
reasonable to make 'goldie-staticlang' an CTFE-based library instead of an 
external tool, just with some existing DMD bugs fixed). And finally it would 
import your either-already-existing-or-freshly-rebuilt custom-tailered D 
library. Hell, it could even rebuild 'goldie-grmc' itself if it needed to!

All CTFE needs is system(), file I/O, and date/time stuff, and then need for 
buildsystems could be heavily reduced and make external tools/libs easier to 
use. I can see that being a big selling point for D.

That might even make it possible (though I haven't really thought it 
through) to implement the dependency-searching feature of RDMD as a library.




More information about the Digitalmars-d mailing list