Please integrate build framework into the compiler

Christopher Wright dhasenan at gmail.com
Sun Mar 22 17:38:50 PDT 2009


Kristian Kilpi wrote:
> On Sun, 22 Mar 2009 14:14:39 +0200, Christopher Wright 
> <dhasenan at gmail.com> wrote:
> 
>> Kristian Kilpi wrote:
>>> #includes/imports are redundant information: the source code of 
>>> course describes what's used in it. So, the compiler could be aware 
>>> of the whole project (and the libraries used) instead of one file at 
>>> the time.
>>
>> That's not sufficient. I'm using SDL right now; if I type 'Surface 
>> s;', should that import sdl.surface or cairo.Surface? How is the 
>> compiler to tell? How should the compiler find out where to look for 
>> classes named Surface? Should it scan everything under 
>> /usr/local/include/d/? That's going to be pointlessly expensive.
> 
> Such things should of course be told to the compiler somehow. By using 
> the project configuration, or by other means. (It's only a matter of 
> definition.)
> 
> For example, if my project contains the Surface class, then 'Surface s;' 
> should of course refer to it. If some library (used by the project) also 
> has the Surface class, then one should use some other way to refer it 
> (e.g. sdl.Surface).

Then I want to deal with a library type with the same name as my builtin 
type.

You can come up with a convention that does the right thing 90% of the 
time, but produces strange errors on occasion.

> But my point was that the compilers today do not have knowledge about 
> the projects as a whole. That makes this kind of 'scanning' too 
> expensive (in the current compiler implementations). But if the 
> compilers were build differently that wouldn't have to be true.

If you want a system that accepts plugins, you will never have access to 
the entire project. If you are writing a library, you will never have 
access to the entire project. So a compiler has to address those needs, too.

> If I were to create/design a compiler (which I am not ;) ), it would be 
> something like this:
> 
> Every file is cached (why to read and parse files over and over again, 
> if not necessary). These cache files would contain all the information 
> (parse trees, interfaces, etc) needed during the compilation (of the 
> whole project). Also, they would contain the compilation results too 
> (i.e. assembly). So, these cache/database files would logically replace 
> the old object files.
> 
> That is, there would be database for the whole project. When something 
> gets changed, the compiler knows what effect it has and what's required 
> to do.

All this is helpful for developers. It's not helpful if you are merely 
compiling everything once, but then, the overhead would only be 
experienced on occasion.

> And finally, I would also change the format of libraries. A library 
> would be one file only. No more header/.di -files; one compact file 
> containing all the needed information (in a binary formated database 
> that can be read very quickly).

Why binary? If your program can operate efficiently with a textual 
representation, it's easier to test, easier to debug, and less 
susceptible to changes in internal structures.

Additionally, a database in a binary format will require special tools 
to examine. You can't just pop it open in a text editor to see what 
functions are defined.



More information about the Digitalmars-d mailing list