On Saturday, 23 May 2015 at 10:57:22 UTC, Suliman wrote:
Every D program is started as if it were a C program.
Why is so necessary?

It's not actually necessary. You could implement the `_start` function in your D program. Here's a D program without any C runtime, D runtime, or main.

long __d_sys_write(long arg1, in void* arg2, long arg3)
{
    ulong result;

    asm
    {
        "syscall"
        : "=a" result
        : "a" 1,
        "D" arg1,
        "S" arg2,
        "m" arg2,
        "d" arg3
        : "memory", "cc", "rcx", "r11";
    }

    return result;
}

extern(C) void __d_sys_exit(long arg1)
{
    asm
    {
        "syscall"
        :
        : "a" 60,
        "D" arg1,
        : "memory", "cc", "rcx", "r11";

    }
}

extern(C) void _start()
{
    // you could put this in a main function and
    // call main() from here.
    auto text = "Hello, World!\n";
    __d_sys_write(1, text.ptr, text.length);

    __d_sys_exit(0);
}

Compile with:
gdc -fno-emit-moduleinfo -nostartfiles test.d

This produces a 733 byte "Hello World" binary. -fno-emit-moduleinfo will prevent the compiler from generating a lot of auxiliary code that's not needed for this program. -nostartfiles will prevent the C runtime from being linked in.

This is a nice little experiment, but once you start trying to use structs, classes, arrays, exceptions, or any other feature of D, you will need more and more of the D runtime.

There may also be some things generated by GDC that get called implicitly by the C runtime's initialization procedures (e.g. _init, _fini, etc..) but I'm not that knowledgeable about the compiler's codegen.


What about C++ and other languages? Does they have more then one main?

C++ is a superset of C, so in my experience, C++ only needs C main. However, C++ has static constructors that get called by some of the initialization procedures in the C runtime before actually calling main. I wonder if C++ free functions mangled in C++...I'm not sure.


Why it's more than one main is needed? Why D apps can't start with single main?

I don't think the current implementation is necessary. There are probably many different ways to implement D program initialization. I don't see why D runtime couldn't just implement _start, omit the C runtime altogether, and do everything in D, but I trust the compiler implementers have their reasons.

If you're interested in digging deeper, you'll probably have to ask questions on D.GNU to get the attention of the compiler implementers.

Mike

Reply via email to