Compile Imported Modules

Jonathan Marler via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 25 06:03:11 PDT 2017


On Friday, 25 August 2017 at 01:50:00 UTC, Jonathan Marler wrote:
> On Thursday, 24 August 2017 at 17:37:12 UTC, Jonathan Marler 
> wrote:
>> On Thursday, 24 August 2017 at 16:49:08 UTC, Seb wrote:
>>> On Thursday, 24 August 2017 at 16:32:32 UTC, Jonathan Marler 
>>> wrote:
>>>> [...]
>>>
>>> rdmd is really bad in terms of performance. If you call a 
>>> single D file with rdmd, it will always compile it twice. 
>>> There was an attempt to fix this 
>>> (https://github.com/dlang/tools/pull/194), but this has been 
>>> reverted as it introduced a regression and no one had time to 
>>> look at the regression.
>>> Moving rdmd into DMD has been on the TODO list for quite a 
>>> while and there is a consensus that the performance overhead 
>>> if rdmd isn't nice. However, IIRC there was no clear 
>>> consensus on how the integration should happen. I recall that 
>>> the plan was to do try this with "dmd as a library", but I'm 
>>> not sure whether that's really feasible ATM.
>>
>> Well this should solve the rdmd performance problem as well as 
>> make other user cases easier that don't necessarilly use rdmd.
>>
>> I had another thought that instead of making this an "opt-in" 
>> feature, it would probably make more sense to be an "opt-out" 
>> feature.  So by default the compiler would compile missing 
>> imported modules unless you indicate otherwise, maybe a 
>> command line switch like "-dont-compile-imports".  And I don't 
>> see how this would break anything.  Everything should work the 
>> same as it did before, it's just now you can omit imported 
>> module files from the command line and it should just work.
>
> I've looked through the DMD code to see how this could be 
> implemented and I've run into a problem.  The solution I came 
> up with was to go through all the imported modules and then 
> determine which ones need to be compiled that haven't been 
> given on the command line. The problem is, I don't know how to 
> determine whether a module was already compiled and given in an 
> obj/lib file.  For example,
>
> dmd something.obj anotherthing.lib prog.d
>
> As far as I know, the compiler has no idea which modules are 
> contained in "something.obj" and "anotherthing.lib".  It just 
> compiles the source given on then command line, then passes all 
> the object files and libraries to the linker, at which point 
> the concept of modules is lost.
>
> Am I correct in saying that the compiler has no idea which 
> modules an obj/lib file contains?

I created a prototype implementation here 
(https://github.com/dlang/dmd/pull/7099).

It uses the same logic that rdmd uses to determine if a module 
exists in a given object/library file.  Pretty cool that now I 
can compile any code without having to list the import module 
files!

Instead of:

dmd prog.d -Isomelib somelib\foo\module1.d somelib\foo\module2.d 
somelib\foo\module3.d somelib\foo\module4.d somelib\foo\module5.d 
somelib\foo\module6.d -Ianotherlib anotherlib\bar\module1.d 
anotherlib\bar\module2.d anotherlib\bar\module3.d 
anotherlib\bar\module4.d anotherlib\bar\module5.d

I can do:

dmd -ci prog.d -Isomelib -Ianotherlib


More information about the Digitalmars-d mailing list