On 11 May 2013 16:51, Rel <relmail@rambler.ru> wrote:
hello! I used to have a bit unusual task: writing pure binary code (without runtime/os dependency, just native x86 and x64 code). Quite similar to the OS kernel development I may say, if it makes the problem clearer for you. I usually wrote such code in C++ with GCC (using '-nostdlib', '-fno-exceptions', '-fno-rtti' and etc), but now I need a good metaprogramming features and complex metaprogramming in C++ makes a brain explode. D metaprogramming and the language in general looks awesome, so I decided to give it a try.

I looked at the XOMB and a few other projects, but it seems they reimplemented quite big part of druntime to make their project work, in fact a lot of stuff reimplemented by them I would consider being actually useless. So my question is: how much of the runtime features I could disable?

for testing purposes I made a little programm (I'm building it with '-nophoboslib', '-nostdlib', '-fno-exceptions', '-emain'):

module main;

extern (C) void* _Dmodule_ref = null;
extern (C) void puts(const char*);
extern (C) void exit(int);

extern (C) void main() {
        scope(exit) {
                puts("Exiting!");
                exit(0);
        }
       
        puts("Hello World!");
}

I had to include '_Dmodule_ref' in the source, it seems that it is used for calling module constructors, I'm not going to use them, can I disable it somehow?

when I added 'scope(exit)' part I got links to exception handling code in object files, I'm not going to use exceptions, so I added '-fno-exceptions' flag, and it seems to work pretty fine. but when I try to add some primitive classese I got a lot of links to the code that seems to be connected with runtime type information, I don't need it so I tried to add '-fno-rtti' flag, but it doesn't work. Is there a way to get rid of runtime type information?


-nophoboslib tells the driver not to link to phobos/druntime.

-nostdlib tells the driver not to link to any C libs.

-fno-exceptions only puts in an error if it encounters a 'throw' statement.  Doesn't actually prevent the front-end from generating throw/try/catch statements on the fly, or do anything that causes an exception to be raised, and I don't think it errors about the use of assert contracts either.  Looking at the above, you use scope() statements.  This really is just a nice way of expressing try { }  catch { } finally { } without all the nested blocks.

-fno-rtti is not adhered to, infact I didn't realise that it was even a common compiler switch  (thought it was only in g++).   This could be added in, not should on how good an idea it would be though... :)

_Dmodule_ref should be possible to not define this via a compiler flag, but that has not yet been implemented.


--
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';