dmd -betterC

Mike via Digitalmars-d digitalmars-d at puremagic.com
Mon Jun 19 23:28:04 PDT 2017


On Tuesday, 20 June 2017 at 01:51:26 UTC, Walter Bright wrote:
> Is getting a whole lot better:
>
> https://github.com/dlang/dmd/pull/6918
>
> You can now build D executables that do not link in anything 
> from Phobos - only from the standard C library.

While it's encouraging to see some attation given to this 
feature, I think the fundamental premise motivating -betterC is 
misguided.

Rather than requiring a switch that bluntly disables certain 
features of the language, the compiler and/or linker should 
simply not require implementations that aren't explicitly or 
implicitly used.  For example, if one is not doing any dynamic 
casting or other runtime inspection, the toolchain should not 
throw any errors about a missing TypeInfo implementation, and the 
toolchain certainly shouldn't add automatically generated 
TypeInfo implementations to the binary that have no hope of every 
being referenced or executed.

As I understand it, this requires some cooperation between the 
compiler and the linker.  For example, the compiler may not be 
able to determine whether or not a certain language feature or 
implementation is required, so it will include a link to it 
anyway in the intermediate object file, but the linker will be 
able to see that there is no possible logic path to that code in 
the final binary, and can strip it out rather than generate an 
unresolved symbol error.  GCC's 
-ffunction-sections/-fdata-sections and ld's --gc-sections do 
this quite well, though better implementations may also be 
possible with LTO features.

I think all features of D have their place even in bare metal and 
resource constrained microcontroller programming.  For example, 
despite the disdain from others, I use C++ exceptions in much of 
my microcontroller programming because it makes the "happy path" 
a little bit faster at the expense of making the "unhappy path" 
(whose performance doesn't matter) much slower.  It also makes my 
code much easier to reason about, and escape out of when 
something goes wrong.

Similarly, I can also see TypeInfo and ModuleInfo being useful 
for certain applications.  For example, ModuleInfo and module 
constructors may be a good way to initialize peripherals before 
calling main().  However, the toolchain shouldn't require 
TypeInfo and ModuleInfo to always be there just to get a build 
when they have no chance of ever being referenced or executed in 
the final binary.

If one wanted to avoid certain druntime dependencies, they should 
be able to simply avoid those features of D in their source code 
for which there is no runtime implementation (e.g. exceptions, 
classes, AAs, etc...) or provide their own implementation 
embedded in their code that overrides the druntime implementation.

On a system with a full desktop-like operating system it would be 
convenient to automatically link in druntime and maybe Phobos, 
but that should be done on a platform-by-platform basis in either 
a dmd.conf, linker script, or some other similar configuration 
file that is distributed with the toolchain's package.

I think it would be better to refactor the DMD and druntime 
implementations to reduce their coupling and improve their 
cooperation with the linker and LTO features.  In doing so, a 
-betterC switch would be rendered redundant and ultimately 
needless.

Mike


More information about the Digitalmars-d mailing list