proposal: private module-level import for faster compilation
Sebastien Alaiwan via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jul 24 05:53:50 PDT 2016
On Wednesday, 20 July 2016 at 19:59:42 UTC, Jack Stouffer wrote:
> I concur. If the root problem is slow compilation, then there
> are much simpler, non-breaking changes that can be made to fix
> that.
I don't think compilation time is a problem, actually. It more
has to do with dependency management and encapsulation.
Speeding up compilation should never be considered as an
acceptable solution here, as it's not scalable: it just pushes
the problem away, until your project size increases enough.
Here's my understanding of the problem:
// client.d
import server;
void f()
{
Data x;
// Data.sizeof depends on something in server_private.
x.something = 3; // offset to 'something' depends on
privateStuff.sizeof.
}
// server.d
private import server_private;
struct Data
{
Opaque someOtherThing;
int something;
}
// server_private.d
struct Opaque
{
byte[43] privateStuff;
}
I you're doing separate compilation, your dependency graph has to
express that "client.o" depends on "client.d", "server.d", but
also "server_private.d".
GDC "-fdeps" option properly lists all transitive imported files
(disclaimer: this was my pull request). It's irrelevant here that
imports might be private or public, the dependency is still here.
In other words, changes to "server_private.d" must alway trigger
recompilation of "client.d".
I believe the solution proposed by the OP doesn't work, because
of voldemort types. It's always possible to return a struct whose
size depends on something deeply private.
// client.d
import server;
void f()
{
auto x = getData();
// Data.sizeof depends on something in server_private.
x.something = 3; // offset to 'something' depends on
privateStuff.sizeof.
}
// server.d
auto getData()
{
private import server_private;
struct Data
{
Opaque someOtherThing;
int something;
}
Data x;
return x;
}
// server_private.d
struct Opaque
{
byte[43] privateStuff;
}
My conclusion is that maybe there's no problem in the language,
nor in the dependency generation, nor in the compiler
implementation.
Maybe it's just a design issue.
More information about the Digitalmars-d
mailing list