On 11 May 2013 16:51, Rel <relm...@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';