www.digitalmars.com
Last update Tue Jun 6 16:38:20 2006

D vs Other Languages

To D, or not to D. -- Willeam NerdSpeare

This table is a quick and rough comparison of various features of D with other languages it is frequently compared with. While many capabilities are available with standard libraries, this table is for features built in to the core language itself. Rationale. Only official standardized features are considered, not proposed features, betas, or extensions. And, like all language comparisons, it is biased in terms of what features are mentioned, omitted, and my interpretation of those features.

D Language Feature Comparison Table
Feature D C C++ C# Java
Garbage Collection Yes No No Yes Yes
Functions
Function delegates Yes No No Yes No
Function overloading Yes No Yes Yes Yes
Out function parameters Yes Yes Yes Yes No
Nested functions Yes No No No No
Function literals Yes No No No No
Dynamic closures Yes No No No No
Typesafe variadic arguments Yes No No Yes Yes
Arrays
Lightweight arrays Yes Yes Yes No No
Resizeable arrays Yes No No No No
Built-in strings Yes No No Yes Yes
Array slicing Yes No No No No
Array bounds checking Yes No No Yes Yes
Associative arrays Yes No No No No
Strong typedefs Yes No No No No
String switches Yes No No Yes No
Aliases Yes Yes Yes No No
OOP
Object Oriented Yes No Yes Yes Yes
Multiple Inheritance No No Yes No No
Interfaces Yes No Yes Yes Yes
Operator overloading Yes No Yes Yes No
Modules Yes No Yes Yes Yes
Dynamic class loading No No No Yes Yes
Nested classes Yes Yes Yes Yes Yes
Inner (adaptor) classes Yes No No No Yes
Covariant return types Yes No Yes No Yes
Properties Yes No No Yes No
Performance
Inline assembler Yes Yes Yes No No
Direct access to hardware Yes Yes Yes No No
Lightweight objects Yes Yes Yes Yes No
Explicit memory allocation control Yes Yes Yes No No
Independent of VM Yes Yes Yes No No
Direct native code gen Yes Yes Yes No No
Generic Programming
Class Templates Yes No Yes Yes Yes
Function Templates Yes No Yes No Yes
Implicit Function Template Instantiation No No Yes No No
Partial and Explicit Specialization Yes No Yes No No
Value Template Parameters Yes No Yes No No
Template Template Parameters Yes No Yes No No
Mixins Yes No No No No
static if Yes No No No No
is expressions Yes No No No No
typeof Yes No No Yes No
foreach Yes No No Yes Yes
Implicit Type Inference Yes No No No No
Reliability
Contract Programming Yes No No No No
Unit testing Yes No No No No
Static construction order Yes No No Yes Yes
Guaranteed initialization Yes No No Yes Yes
RAII (automatic destructors) Yes No Yes Yes No
Exception handling Yes No Yes Yes Yes
Scope guards Yes No No No No
try-catch-finally blocks Yes No No Yes Yes
Thread synchronization primitives Yes No No Yes Yes
Compatibility
C-style syntax Yes Yes Yes Yes Yes
Enumerated types Yes Yes Yes Yes Yes
Support all C types Yes Yes No No No
80 bit floating point Yes Yes Yes No No
Complex and Imaginary Yes Yes No No No
Direct access to C Yes Yes Yes No No
Use existing debuggers Yes Yes Yes No No
Struct member alignment control Yes No No No No
Generates standard object files Yes Yes Yes No No
Macro text preprocessor No Yes Yes No No
Other
Conditional compilation Yes Yes Yes Yes No
Unicode source text Yes Yes Yes Yes Yes
Documentation comments Yes No No Yes Yes

Notes

C Language Specification
ANSI/ISO/IEC 9899-1999 (a.k.a. C99)

C++ Language Specification
ISO/IEC 14882-1998 (a.k.a. C++98)

C# Language Specification
ECMA-334

Java Language Specification
"The Java Language Specification" by Gosling, Joy, and Steele, Addison-Wesley, ISBN 0-201-63451-1

Object Oriented
This means support for classes, member functions, inheritance, and virtual function dispatch.

Inline assembler
Many C and C++ compilers support an inline assembler, but this is not a standard part of the language, and implementations vary widely in syntax and quality.

Interfaces
Support in C++ for interfaces is weak enough that an IDL (Interface Description Language) was invented to compensate.

Modules
Many correctly argue that C++ doesn't really have modules. But C++ namespaces coupled with header files share many features with modules.

Garbage Collection
The Hans-Boehm garbage collector can be successfully used with C and C++, but it is not a standard part of the language.

Implicit Type Inference
This refers to the ability to pick up the type of a declaration from its initializer.

Contract Programming
The Digital Mars C++ compiler supports Contract Programming as an extension. Compare some C++ techniques for doing Contract Programming with D.

Resizeable arrays
Part of the standard library for C++ implements resizeable arrays, however, they are not part of the core language. A conforming freestanding implementation of C++ (C++98 17.4.1.3) does not need to provide these libraries.

Built-in Strings
Part of the standard library for C++ implements strings, however, they are not part of the core language. A conforming freestanding implementation of C++ (C++98 17.4.1.3) does not need to provide these libraries. Here's a comparison of C++ strings and D built-in strings.

Strong typedefs
Strong typedefs can be emulated in C/C++ by wrapping a type in a struct. Getting this to work right requires much tedious programming, and so is considered as not supported.

Use existing debuggers
By this is meant using common debuggers that can operate using debug data in common formats embedded in the executable. A specialized debugger useful only with that language is not required.

Struct member alignment control
Although many C/C++ compilers contain pragmas to specify struct alignment, these are nonstandard and incompatible from compiler to compiler.
The C# standard ECMA-334 25.5.8 says only this about struct member alignment: "The order in which members are packed into a struct is unspecified. For alignment purposes, there may be unnamed padding at the beginning of a struct, within a struct, and at the end of the struct. The contents of the bits used as padding are indeterminate." Therefore, although Microsoft may have extensions to support specific member alignment, they are not an official part of standard C#.

Support all C types
C99 adds many new types not supported by C++.

80 bit floating point
While the standards for C and C++ specify long doubles, few compilers (besides Digital Mars C/C++) actually implement 80 bit (or longer) floating point types.

Mixins
Mixins have many different meanings in different programming languages. D mixins mean taking an arbitrary sequence of declarations and inserting (mixing) them into the current scope. Mixins can be done at the global, class, struct, or local level.

C++ Mixins
C++ mixins refer to a couple different techniques. The first is analogous to D's interface classes. The second is to create a template of the form:
template <class Base> class Mixin : public Base
{
    ... mixin body ...
}
D mixins are different.

Static If
The C and C++ preprocessor directive #if would appear to be equivalent to the D static if. But there are major and crucial differences - the #if does not have access to any of the constants, types, or symbols of the program. It can only access preprocessor macros. See this example.

Is Expressions
Is expressions enable conditional compilation based on the characteristics of a type. This is done after a fashion in C++ using template parameter pattern matching. See this example for a comparison of the different approaches.

Comparison with Ada
James S. Rogers has written a comparison chart with Ada.

Inner (adaptor) classes
A nested class is one whose definition is within the scope of another class. An inner class is a nested class that can also reference the members and fields of the lexically enclosing class; one can think of it as if it contained a 'this' pointer to the enclosing class.

Documentation comments
Documentation comments refer to a standardized way to produce documentation from the source code file using specialized comments.

Errors

If I've made any errors in this table, please contact me so I can correct them.