Compiler: Size of generated executable file

Walter Bright newshound1 at digitalmars.com
Mon Jan 11 19:24:06 PST 2010


dsimcha wrote:
> Vote++.  I'm convinced that there's just a subset of programmers out there that
> will not use any high-level programming model, no matter how much easier it makes
> life, unless they're convinced it has **zero** overhead compared to the crufty old
> C way.  Not negligible overhead, not practically insignificant overhead for their
> use case, not zero overhead in terms of whatever their most constrained resource
> is but nonzero overhead in terms of other resources, but zero overhead, period.
> 
> Then there are those who won't make any tradeoff in terms of safety,
> encapsulation, readability, modularity, maintainability, etc., even if it means
> their program runs 15x slower.  Why can't more programmers take a more pragmatic
> attitude towards efficiency (among other things)?  Yes, noone wants to just
> gratuitously squander massive resources, but is a few hundred kilobytes (fine,
> even a few megabytes, given how cheap bandwidth and storage are nowadays) larger
> binary really going to make or break your app, especially if you get it working
> faster and/or with less bugs than you would have using some cruftier, older, lower
> level language that produces smaller binaries?


I agree that a lot of the concerns are based on obsolete notions. First 
off, I just bought another terabyte drive for $90. The first hard drive 
I bought was $600 for 10Mb. A couple years earlier I used a 10Mb drive 
that cost $5000. If I look at what eats space on my lovely terabyte 
drive, it ain't executables. It's music and pictures. I'd be very 
surprised if I had a whole CD's worth of exe files.

Next, even a very large executable doesn't necessarily run any slower 
than a small one. The reason is the magic of demand paged virtual 
memory. Executables are NOT loaded into memory before running. They are 
memory-mapped in. Only code that is actually executed is EVER loaded 
into memory.

You can actually organize the layout of code in the exe file so that it 
loads very fast, by putting functions that call each other next to each 
other, and grouping rarely executed code elsewhere. Optlink has the 
features necessary to do this, and the -profile switch can output a file 
to drive Optlink to do the necessary layouts.

Other languages do appear to have smaller executables, but that's often 
because the runtime library is dynamically linked, not statically 
linked, and is not counted as part of the executable size even though it 
is loaded into memory to be run. D's runtime library is still statically 
linked in for the pragmatic reason that static linking avoids the "dll 
hell" versioning problem for your customers.

And lastly, it *is* possible to use D as a "C compiler" with the same 
overhead that C has. All you need to do is make your main a "C" main, 
and not link in Phobos. In fact, this is how I port dmd to new platforms 
before Phobos is built. Stick with "C" constructs (i.e. no dynamic 
arrays!) and it will work just like C does.



More information about the Digitalmars-d mailing list