Compiler as dll

Don nospam at nospam.com
Wed Jan 28 05:16:15 PST 2009


grauzone wrote:
> Alexander Pánek wrote:
>> grauzone wrote:
>>> John Reimer wrote:
>>>> ddl does not work for memory sharing like normal dll's, where 
>>>> multiple applications have access to a single dll at runtime.  It 
>>>> appears that such support would be quite difficult to implement and 
>>>> moves in the direction of operating system features.
>>>
>>> Couldn't this be achieved by simply mmap()-ing the file contents into 
>>> memory? mmap() normally shared the memory pages with other processes.
>>>
>>> Of course, this wouldn't work if the code both isn't position 
>>> independent, and needs to be relocated to a different base address. 
>>> But that's also the case with operating system supported dynamic 
>>> shared objects.
>>>
>>>> It does do runtime linking, however, which is extremely useful for 
>>>> certain situations... specifically any sort of application that 
>>>> needs a plugin architecture for D (ie.. it can link with libraries 
>>>> and object files at runtime) that is gc and exception friendly.  
>>>
>>> I never understood why this is needed. Can't they simply compile the 
>>> plugins into the main program?
>>
>> Well, compiling them directly into the main program kinda defeats the 
>> purpose of runtime-pluggable plugins, wouldn’t it?
> 
> But why do you want them in the first place? For Open Source projects, 
> this seems to be completely pointless to me.
> 
>>> When it's a commercial program, the DLL plugin approach probably 
>>> wouldn't work anyway: in order to enable others to compile plugins, 
>>> you would need to expose your internal "headers" (D modules). Note 
>>> that unlike in languages like C/C++, this would cause internal 
>>> modules to be exposed too, even if they are not strictly needed. What 
>>> would you do to avoid this? Maintain a separate set of import modules?
>>
>> Make use of .di files. You don’t have to distribute code.
> 
> D interface files (.di) files are what I meant by "import module", sorry 
> about this. They are compiler specific, and the only intended purpose is 
> speeding up the compilation. Quoting from the D site:
> 
>  > D interface files bear some analogous similarities to C++ header
>  > files. But they are not required in the way that C++ header files are,
>  > and they are not part of the D language. They are a feature of the
>  > compiler, and serve only as an optimization of the build process.
> 
> http://www.digitalmars.com/d/2.0/dmd-linux.html#interface_files

They were also intended to act as header files, to conceal 
implementation details.

> I looked at the Tango .di files, which are (I think) automatically 
> generated by the D compiler. I noticed several things:
> 
> - Private symbols are included, even private imports or private class 
> members => they are exposed to the public, and changing them might break 
> ABI compatibility under circumstances.
> 
> - All transitive imports seem to be included => you either expose your 
> internal modules as interface file, or your public modules must not 
> (transitively) import private modules. Note that this forbids direct use
> of any private type or function. You'll probably have to program around 
> using indirections like interfaces or abstract base classes. Also note 
> that this is way harder as in C: unlike in D, there are incomplete 
> types, and the implementation (.c files) is completely separate and can 
> import any private headers.
> 
> - Sometimes, the full code for methods or functions is included, 
> although they are not templated in any way. I guess it's even possible 
> that plugins will inline those functions.

Yes, I think that's why they're included.

  This means changing these
> functions could randomly break already compiled plugins. Of course, this 
> can be fixed, but nobody has bothered yet. It probably shows that .di 
> files weren't designed with ABI compatibility in mind.

> 
> It seems that dynamic linking with D code is extremely fragile, and it 
> requires serious extra effort to maintain ABI compatibility. Please 
> correct me if I'm wrong.



More information about the Digitalmars-d mailing list