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