digitalmars.D.learn - Writing closed source programs in D?
- Shriramana Sharma (15/15) May 31 2013 Now I'm *not* going to write closed source programs in D [;-)], but am
- Regan Heath (10/20) May 31 2013 You ship the library with .di files created by the compiler.
- Jonathan M Davis (21/24) May 31 2013 The only problem with auto is that the type can't be inferred without th...
- Jesse Phillips (4/15) Jun 03 2013 During the discussion about increasing attribute inference to
- Maxim Fomin (65/85) Jun 03 2013 Actually dmd for code importing module doesn't need full
Now I'm *not* going to write closed source programs in D [;-)], but am curious -- in C++ we have header files which a developer can confidently distribute along with the compiled libraries, and the actual source of the libraries (the *.cpp files) remains with the developer. In D, (obviously I'm a noob) it seems that module is the unit of programming, so how does one provide the library user with an API only without distributing the full D sources? Is it perhaps like Python where you can compile stuff into a SO and provide appropriate documentation so the user can just do import fooclosedlib and go ahead? --=20 Shriramana Sharma =E0=AE=B6=E0=AF=8D=E0=AE=B0=E0=AF=80=E0=AE=B0=E0=AE=AE=E0= =AE=A3=E0=AE=B6=E0=AE=B0=E0=AF=8D=E0=AE=AE=E0=AE=BE =E0=A4=B6=E0=A5=8D=E0= =A4=B0=E0=A5=80=E0=A4=B0=E0=A4=AE=E0=A4=A3=E0=A4=B6=E0=A4=B0=E0=A5=8D=E0=A4= =AE=E0=A4=BE
May 31 2013
On Fri, 31 May 2013 12:25:48 +0100, Shriramana Sharma <samjnaa gmail.com> wrote:Now I'm *not* going to write closed source programs in D [;-)], but am curious -- in C++ we have header files which a developer can confidently distribute along with the compiled libraries, and the actual source of the libraries (the *.cpp files) remains with the developer. In D, (obviously I'm a noob) it seems that module is the unit of programming, so how does one provide the library user with an API only without distributing the full D sources? Is it perhaps like Python where you can compile stuff into a SO and provide appropriate documentation so the user can just do import fooclosedlib and go ahead?You ship the library with .di files created by the compiler. http://dlang.org/dmd-linux.html#interface_files .di files are .d files without the function bodies etc. There are issues with templates and auto, but we will eventually have nice solutions for those. R -- Using Opera's revolutionary email client: http://www.opera.com/mail/
May 31 2013
On Friday, May 31, 2013 13:06:13 Regan Heath wrote:.di files are .d files without the function bodies etc. There are issues with templates and auto, but we will eventually have nice solutions for those.The only problem with auto is that the type can't be inferred without the function body. But all of the information is there. So, all you have to do is make it so that the function doesn't return auto (or so that the variable declaration uses the actual type instead of auto). For non-templated functions, that's trivial. .di generation could automate that better, but it's not a big deal. The situation with templates is basically the same as it is with C++. They have to go in the interface/header file and always will. There's no way around that, because the code importing the header/interface file actually needs the full definition. If the compiler supported some sort of intermediate format, then you could provide partially compiled templates, but pretty much all of the information would still have to be there (just in a less human readable format), and you can't even partially compile much of a template without the arguments to instantiate it with anyway. So, you'd pretty much just be putting the same template definition in a binary format instead of text, which wouldn't stop much of anyone from figuring out what they looked like. The reality of the matter is that if you want to hide your implementation, you don't use templates. It's impossible to actually hide them due to the fact that they're merely templates for generating code rather than actual code. - Jonathan M Davis
May 31 2013
On Friday, 31 May 2013 at 15:35:54 UTC, Jonathan M Davis wrote:The only problem with auto is that the type can't be inferred without the function body. But all of the information is there. So, all you have to do is make it so that the function doesn't return auto (or so that the variable declaration uses the actual type instead of auto). For non-templated functions, that's trivial. .di generation could automate that better, but it's not a big deal.During the discussion about increasing attribute inference to auto functions, it was being argued that defining the specific return type for an auto function in the di file is incorrect.
Jun 03 2013
On Friday, 31 May 2013 at 15:35:54 UTC, Jonathan M Davis wrote:The situation with templates is basically the same as it is with C++. They have to go in the interface/header file and always will. There's no way around that, because the code importing the header/interface file actually needs the full definition. If the compiler supported some sort of intermediate format, then you could provide partially compiled templates, but pretty much all of the information would still have to be there (just in a less human readable format), and you can't even partially compile much of a template without the arguments to instantiate it with anyway. So, you'd pretty much just be putting the same template definition in a binary format instead of text, which wouldn't stop much of anyone from figuring out what they looked like. - Jonathan M DavisActually dmd for code importing module doesn't need full definition, it only inserts symbols referring to external object files. This allows to split template declaration and definition with restriction that module with template definition emits referred symbols (which restricts applicability since due to separate compilation model it is impossible to know beforehand template parameters). This also can be viewed as 'linker' template constraint, if you pass not expected parameters you will have link error. import foo; import std.stdio; class Me : BiiA { override void foo() { writeln("main"); } } void main() { BiiA b = new Me; b.foo(); b.get(); } --- foo.di------- template bar(T, U) { U baz(); class A(T) { T t; T get(); void foo(); } } alias bar!(int, int) Bii; alias Bii.A!int BiiA; ---foo.d ---- import std.stdio; template bar(T, U) { U baz(); class A(T) { T t; T get() { writeln("foo"); return t; } void foo() { writeln("foo"); } } } alias bar!(int, int) Bii; alias Bii.A!int BiiA; ----- dmd main.d // Error undefined reference to ... dmd main.d foo.o //works ./main main foo
Jun 03 2013