<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 11 May 2013 16:51, Rel <span dir="ltr"><<a href="mailto:relmail@rambler.ru" target="_blank">relmail@rambler.ru</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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.<br>

<br>
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?<br>

<br>
for testing purposes I made a little programm (I'm building it with '-nophoboslib', '-nostdlib', '-fno-exceptions', '-emain'):<br>
<br>
module main;<br>
<br>
extern (C) void* _Dmodule_ref = null;<br>
extern (C) void puts(const char*);<br>
extern (C) void exit(int);<br>
<br>
extern (C) void main() {<br>
        scope(exit) {<br>
                puts("Exiting!");<br>
                exit(0);<br>
        }<br>
        <br>
        puts("Hello World!");<br>
}<br>
<br>
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?<br>
<br>
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?<br>

</blockquote></div><br><br></div><div class="gmail_extra">-nophoboslib tells the driver not to link to phobos/druntime.<br><br></div><div class="gmail_extra">-nostdlib tells the driver not to link to any C libs.<br><br></div>
<div class="gmail_extra">-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.<br clear="all">
</div><div class="gmail_extra"><br></div><div class="gmail_extra">-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... :)<br>
</div><div class="gmail_extra"><br></div><div class="gmail_extra">_Dmodule_ref should be possible to not define this via a compiler flag, but that has not yet been implemented.<br><br></div><div class="gmail_extra"><br>-- <br>
Iain Buclaw<br><br>*(p < e ? p++ : p) = (c & 0x0f) + '0';
</div></div>