D compilation is too slow and I am forking the compiler
Walter Bright
newshound2 at digitalmars.com
Wed Nov 21 10:56:02 UTC 2018
On 11/21/2018 2:16 AM, Vladimir Panteleev wrote:
> On Wednesday, 21 November 2018 at 09:46:44 UTC, Walter Bright wrote:
>> It works by allocating memory from a memory-mapped file, which serves as the
>> precompiled header.
>
> Hey, that's a great idea! Can we do this for DMD? :D
>
> On a more serious note: do you think that with D's features (type system /
> metaprogramming), you could have avoided some of those bugs?
>
> For example, one thing we can do in D which is still impossible in C++ is to
> automatically serialize/deserialize all fields of a struct/class (using tupleof
> / allMembers).
>
Memory mapped files really were the key to success, because if you could reload
the mmf at the same address, the pointers did not have to be patched. In the
DMC++ source code, "dehydrating" a pointer meant subtracting a value from it so
it was correct for the base address of the mmf, and "hydrating" a pointer was
the inverse.
The two bug prone problems were:
1. separating out the tangled data structures into what goes into the pch, and
what does not. Obviously, nothing in the pch could point outside of it.
2. .h files are simply not compatible with this, so you've got to detect when it
won't work. For example, anything like a command line switch or a macro that
might cause different code to be generated in the pch had to invalidate it.
Maybe I should have done your fork idea? :-)
My experience with this drove many design decisions for D modules, for example,
D modules are unaffected by where they are imported, the order they are
imported, or the number of times they are imported. (Yes, I know about
https://digitalmars.com/d/archives/digitalmars/D/D_needs_to_be_honest_320976.html)
Anyhow, what I've thought about doing since the beginning was make DMD
multithreaded. The language is designed to support multithreaded compilation.
For example, lexing, parsing, semantic analysis, optimization, and code
generation can all be done concurrently.
DMD 1.0 would read imports in a separate thread. This would speed things up if
you were using a slow filesystem, like NAS or a USB stick, but it was eventually
disabled because there wasn't a perceptible speedup with current filesystems.
Wouldn't it be awesome to have the lexing/parsing of the imports all done in
parallel? The main difficulty in getting that to work is dealing with the shared
string table.
More information about the Digitalmars-d-announce
mailing list