On 12/16/2012 4:48 PM, H. S. Teoh wrote:
I've proposed this before: when compiling a library, the compiler should
process everything into an intermediate form (perhaps even the IR that's
used internally to integrate with the codegen), then save that as a sort
of partially-compiled object format. This can either be in the form of
an object file, or perhaps a custom D-specific format. Everything,
including templates, function bodies, etc., is included.  Then when you
import something from the library, the compiler simply loads the IR from
the intermediate format and use that info to compile the code.

This offers nothing over a .di file.


This eliminates the wasted time relexing and reparsing imported files
every single time they're used,

Frankly, it's not much faster than parsing the .di file.


and also suitably "hides" the
implementation details of the library in a format that isn't easily
read. (I mean, let's face it, if someone is desperate enough, he can
reverse engineer *anything*, so imagining that shipping a binary is
somehow "safer" than shipping a straightforward IR is nonsense. But in
the reasonable case, the library being in IR should be disincentive
enough for people to not try to break encapsulation.)

It doesn't hide the source in any effective way. There are enough Java byte code => source translators around to prove that. It only takes one such tool to exist (and it's especially easy to create such a tool given D being open source).

An effective way to hide your implementation is to use PIMPL, which D supports 
well.


This intermediate format can be in the form of some kind of hash table
that the compiler can quickly look up referenced symbols from, so there
will be almost no overhead.

I've done such (precompiled headers for C++), I've done .di files, and I've done Java bytecode. .di files are superior in nearly every way.

Reply via email to