Program size, linking matter, and static this()
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Fri Dec 16 15:13:49 PST 2011
On 12/16/11 4:39 PM, Jonathan M Davis wrote:
> It wouldn't be. It wouldn't need to be. The programmer is telling the compiler
> that there isn't a dependency. It's up to the programmer to make sure that
> it's right, and it's wrong, it's their fault. There are plenty of other
> features like that in D - just not SafeD.
I don't see progress here over arranging packages and modules to reflect
program structure in a way that clarifies it to the human /and/ the
compiler.
>>> annoying issues in D IMHO.
>> Adding a language construct that turns off the checking entirely (as you
>> seem to suggest) is not at all better than having to create a few
>> additional source files.
>
> I completely disagree. For instance, it's impossible to move the singleton
> instances of UTC and LocalTime from std.datetime into another module without
> breaking encapsulation, and it's definitely impossible to do it and leave them
> as members of their respective classes.
Maybe there's an issue with the design. Maybe Singleton (the most damned
of all patterns) is not the best choice here. Or maybe the use of an
inheritance hierarchy with a grand total of 4 classes. Or maybe the
encapsulation could be rethought.
The general point is, a design lives within a language. Any language is
going to disallow a few designs or make them unsuitable for particular
situation. This is, again, multiplied by the context: it's the standard
library.
> Those static constructors clearly
> don't rely on any other modules except for the one which gives the declaration
> for tzset (and has no static constructors). But if std.file needed a module
> constructor, we'd end up with a circular dependency between std.datetime and
> std.file when clearly nothing in std.datetime's static constructor relies on
> std.file in any way shape or form. It would be a huge improvement to be able to
> just mark those static constructors as not relying on any other modules having
> their static constructors run first. As it stands, it's a royal pain to deal
> with any circular dependencies which pop up and because of that, it quickly
> becomes best practice to avoid static constructors as much as possible, which
> is a big problem IMHO.
I think this point has gotten into an extreme, a corner of the design
space. Yeah, sky's blue, apple pie is good (and too much of it gives
diabetes), and module dependencies can be messy. But it strikes me as a
bit backwards to add instructions in the core language to lessen
guarantees and make things even messier, when alternatives exist that
foster better dependency control for the very rare situations that need
intervention. It's just not proportional response.
The persona using such a feature would be quite an odd combination - a
developer with sophisticated enough needs to want unchecked dependencies
as a feature, yet naive enough to be unable to solve the problem without
the feature, and yet again sophisticated enough to not make mistakes in
using said feature.
> Factoring out the static constructor's contents into a separate module is not
> always possible, and it's an ugly solution IMHO. I'd _much_ rather have a
> feature where I can tell the compiler that there is no circular dependency so
> that it can appropriately order the loading of the modules.
But what's the appropriate order then? :o)
Andrei
More information about the Digitalmars-d
mailing list