How can we make it easier to experiment with the compiler?

poffer poffer at poffer.net
Mon May 24 08:40:49 UTC 2021


On Monday, 24 May 2021 at 02:56:14 UTC, Walter Bright wrote:
> On 5/23/2021 7:25 PM, Nicholas Wilson wrote:
>> Directories.
>
> The #1 problem isn't directories, it's "every module imports 
> every other module" that leaves one with nowhere to start.
>
> We currently have:
>
>   dmd
>   dmd/root
>   dmd/backend
>
> I regularly fend off attempts to have dmd/root import files 
> from dmd, and dmd/backend import files from dmd. I recently had 
> to talk someone out of having dmd/backend import files from 
> dmd/root.
>
> In other words, a failure of encapsulation.
>
> Let's look at one example, picked more or less because I've 
> looked at it recently, dmd/target.d. The reason for its 
> existence is to abstract target information. It's imports are:
>
>   import dmd.argtypes_x86;
>   import dmd.argtypes_sysv_x64;
>   import core.stdc.string : strlen;
>   import dmd.cond;
>   import dmd.cppmangle;
>   import dmd.cppmanglewin;
>   import dmd.dclass;
>   import dmd.declaration;
>   import dmd.dscope;
>   import dmd.dstruct;
>   import dmd.dsymbol;
>   import dmd.expression;
>   import dmd.func;
>   import dmd.globals;
>   import dmd.id;
>   import dmd.identifier;
>   import dmd.mtype;
>   import dmd.statement;
>   import dmd.typesem;
>   import dmd.tokens : TOK;
>   import dmd.root.ctfloat;
>   import dmd.root.outbuffer;
>   import dmd.root.string : toDString;
>
> If I want to understand the code, I have to understand half of 
> the rest of the compiler. On a more abstract level, why on 
> earth would a target abstraction need to know about AST nodes? 
> At least half of these imports shouldn't be here, and if they 
> are, the code needs to be redesigned.
>
> Recently I needed some target information in the ImportC lexer, 
> and it would have been so easy to just import dmd.target. But 
> then that drags along all the imports that I've really tried to 
> avoid importing into the lexer.
>
> Iain came up with a clever solution to use a template parameter.
>
> Note that Phobos suffers terribly from this disease (everything 
> ultimately imports everything else), which makes it very hard 
> to understand and debug.
>
> Fixing this is not easy, it requires a lot of hard thinking 
> about what a module *really* needs to do. But each success at 
> eliminating an import makes it more understandable.
>
> Creating a false hierarchy (an implied relationship that is 
> instantly defeated by the imports) of files won't fix it.
>
> A good rule of thumb is:
>
>     *** Never import a file from an uplevel directory ***
>
> Import sideways and down, never up.

A good enhancement to the language would be adding some sort of 
module declaration that just states the admitted import packages 
or modules. I know that could be done by an external tool, but I 
feel that this one is a common problem.




More information about the Digitalmars-d mailing list