Julian Salazar wrote:
Hi, I'm new here to the community but I've been using D for a while now, and I have to say that it's a great programming language. I'd like to get involved in this community and help shape this language.

Welcome!


I'm just wondering about a minor issue: why are conditional blocks invalid within expressions such as enum and asm? I mean, in trivial cases it's fine, but in instances where code duplication is a big maintainability nightmare, making conditional compilation more flexible would have benefits for developers.

The request to do it for enums has been thrashed about before. Essentially, version works at the declaration and statement level, not at the expression level or in between tokens, etc. The reason for this is to encourage a more modular approach to versioning than the typical C method of doing it at the lowest level.


Something like (I know it's a trivial example, but you get the point):

asm {
   version(x86) mov EAX, 1;
   else version(x86_64) mov EAX, 2;
}

would trigger an error. Also, though I know enum qualifies as a constant/datatype cross, structs and classes are perfectly fine with conditional compilation. Couldn't the lexical stuff be changed to support it for enum and asm as well?

Let me illustrate by a current example. The linker (optlink) is written 100% in assembler. This makes it rather intractable. It's also loaded up with line-by-line nested conditional assembly (and a lot of macros). It's so hard to see what is *actually* being compiled that I'll assemble it, run OBJ2ASM on the output, and work off of the disassembled code.

So, in essence, the idea is to push conditional compilation to higher levels, not lower levels. Ideally, versioning would be done by abstracting all the version differences into an interface implemented by different modules.


Also, I noticed that there is no formal specification page for x86-64 inline assembly. You define a predefined version identifier such as D_InlineAsm_X86_64, but you don't define registers and instructions pertaining to it. In GDC for example, using the RAX register in the D inline ASM syntax is invalid. Not sure what the case is in LDC (they probably do implement it for x86-64), and I know DMD does not have a 64-bit version, but the spec should at least have a definition for compilers that do implement 64-bit support.

The first approximation to the definition is to use the Intel asm syntax as outlined in their processor data sheets. I haven't written a spec more detailed than that because it's a lot of work and I'm lazy, and such work is not terribly exciting. But if you'd like to help with that, I'd welcome it.

Reply via email to