D vs 其他语言
下表给出了 D 同其他经常提到的语言在各个特征上的粗略的比较。尽管各个语言的标准库中也提供了很多功能,但这张表格只考虑内建到语言核心中的特征。我们只考虑官方的标准特征,不考虑被提议的特征、测试版的特征或者非标准的扩展特征。而且,如同所有其他的语言比较一样,提到什么特征、忽略什么特征以及我对这些特征的解释都是带有偏向性的。
特性 | D | C | C++ | C# | Java |
---|---|---|---|---|---|
垃圾收集 | Yes | No | No | Yes | Yes |
函数 | |||||
函数委托 | Yes | No | No | Yes | No |
函数重载 | Yes | No | Yes | Yes | Yes |
传出(out)函数参数 | Yes | Yes | Yes | Yes | No |
嵌套函数 | Yes | No | No | No | No |
函数文字量 | Yes | No | No | No | No |
动态闭包 | Yes | No | No | No | No |
数组 | |||||
轻量数组 | Yes | Yes | Yes | No | No |
变长数组 | Yes | No | No | No | No |
位数组 | Yes | No | No | No | No |
内建字符串 | Yes | No | No | Yes | Yes |
数组切片 | Yes | No | No | No | No |
数组边界检查 | Yes | No | No | Yes | Yes |
关联数组 | Yes | No | No | No | No |
强类型定义 typedef | Yes | No | No | No | No |
字符串 switch 语句 | Yes | No | No | Yes | No |
别名 | Yes | Yes | Yes | No | No |
OOP | |||||
面向对象 | Yes | No | Yes | Yes | Yes |
多重继承 | No | No | Yes | No | No |
接口 | Yes | No | Yes | Yes | Yes |
运算符重载 | Yes | No | Yes | Yes | No |
模块 | Yes | No | Yes | Yes | Yes |
动态类装入 | No | No | No | Yes | Yes |
嵌套类 | Yes | Yes | Yes | Yes | Yes |
内部(适配器)类 | No | No | No | No | Yes |
协变返回型别 | Yes | No | Yes | No | No |
属性 | Yes | No | No | Yes | No |
性能 | |||||
内联汇编 | Yes | Yes | Yes | No | No |
直接访问硬件 | Yes | Yes | Yes | No | No |
轻量对象 | Yes | Yes | Yes | Yes | No |
显示内存分配控制 | Yes | Yes | Yes | No | No |
独立于虚拟机 | Yes | Yes | Yes | No | No |
直接生成本地代码 | Yes | Yes | Yes | No | No |
泛型编程 | |||||
模板 | Yes | No | Yes | No | No |
混入 | Yes | No | No | No | No |
typeof | Yes | No | No | Yes | No |
foreach | Yes | No | No | Yes | No |
约束 | Yes | No | No | No | No |
可靠性 | |||||
契约式编程 | Yes | No | No | No | No |
单元测试 | Yes | No | No | No | No |
静态构造顺序 | Yes | No | No | Yes | Yes |
确保初始化 | Yes | No | No | Yes | Yes |
RAII(自动析构函数) | Yes | No | Yes | Yes | No |
异常处理 | Yes | No | Yes | Yes | Yes |
try-catch-finally 基本块 | Yes | No | No | Yes | Yes |
线程同步原语 | Yes | No | No | Yes | Yes |
兼容性 | |||||
C风格语法 | Yes | Yes | Yes | Yes | Yes |
枚举型别 | Yes | Yes | Yes | Yes | No |
支持所有 C 型别 | Yes | Yes | No | No | No |
80 位浮点数 | Yes | Yes | Yes | No | No |
负数和虚数 | Yes | Yes | No | No | No |
直接访问 C | Yes | Yes | Yes | No | No |
使用现有的调试器 | Yes | Yes | Yes | No | No |
结构成员对齐控制 | Yes | No | No | No | No |
生成标准目标文件 | Yes | Yes | Yes | No | No |
宏文本预处理器 | No | Yes | Yes | No | No |
其他 | |||||
条件编译 | Yes | Yes | Yes | Yes | No |
Unicode源代码 | Yes | Yes | Yes | Yes | Yes |
注记
-
C 语言规范
- ANSI/ISO/IEC 9899-1999 (a.k.a. C99) C++ 语言规范
- ISO/IEC 14882-1998 (a.k.a. C++98) C# 语言规范
- ECMA-334 Java 语言规范
- "The Java Language Specification" by Gosling, Joy, and Steele, Addison-Wesley, ISBN 0-201-63451-1 面向对象
- 这意味着支持类、成员函数、继承和虚函数分派。 内联汇编
- 许多 C 和 C++ 编译器支持内联汇编,但这并不是语言标准的一部分,并且各种实现的语法和质量都有很大差别。 接口
- C++ 对接口的支持是如此不完善,以至于专门发明了 IDL(接口定义语言)弥补这个不足。 模块
- 许多人指出 C++ 并不真正支持模块,他们是对的。但是 C++ 的名字空间和头文件一起可以实现模块的许多特征。 垃圾收集
- Hans-Boehm 垃圾收集器可以成功的用于 C 和 C++ ,但是这并不是语言标准的一部分。 契约式编程
- Digital Mars 的 C++ 编译器的一个扩展支持 契约式编程 。可以对比一下实现契约式编程的 C++ 技术 和 D 支持的契约式编程。 变长数组
- C++ 标准库中有一部分是用于实现变长数组的,但是,它们并不是核心语言的一部分。一个符合标准的独立的 C++(C++98 17.4.1.3)实现并不必须提供这些库。 内建字符串
- C++ 标准库中有一部分是用于实现字符串的,但是,它们并不是核心语言的一部分。一个符合标准的独立的 C++(C++98 17.4.1.3)实现并不必须提供这些库。这有关于 C++ 字符串和 D 内建字符串的一个 比较 。 强类型定义 typedef
- 强类型定义 typedef 在 C/C++ 中可以通过将一个类型用一个结构封装来模拟。如果要采用这种方式,会使编程工作十分繁琐,所以它并不被人支持。 使用现有的调试器
- 采用这种方法意味着使用那些能够处理嵌入到常见可执行文件格式中的调试数据的常见调试器。不必编写一个只能用于某种语言的调试程序。 结构成员的对齐控制
- 尽管许多的 C/C++ 编译器包括指定结构对齐方式的编译器指令,但对此并没有一个标准,而不同编译器的做法通常是不兼容的。关于结构成员对齐,C# 标准 ECMA-334 25.5.8 只提到: “成员在结构中的顺序是未指定的。出于对齐的目的,可以在结构的开头、中间或者结尾处加入匿名填充。填充值是未定义的。”因此,尽管 Microsoft 可能进行扩展以支持特定的成员对齐方式,但它们不是 C# 官方标准的一部分。 支持所有 C 类型
- C99 添加了 C++ 部支持的许多新类型。 80 位浮点数
- 尽管 C 和 C++ 标准规定了 long double 类型,很少有编译器(除了 Digital Mars C/C++)真正实现了 80 位(或更长)的浮点类型。 混入
- 在不同的程序设计语言中,混入有许多不同的意义。D 的混入 是指将任意的声明序列插入(混入)到当前作用域中。混入可以在全局、类、结构或者局部级别使用。 C++ 混入
-
C++ 混入指的是另一套技术。其一同 D 的接口类是同类的东西。其二是指创建一个下述形式的模板:
template <class Base> class Mixin : public Base { ... 混入过程体 ... }
D 的混入与此不同。
同 Ada 的比较
- James S. Rogers 编绘了 同 Ada 的比较图 。 内部(适配器)类
- 嵌套类 是定义在另一个类作用域内的类。 内部类 是能够引用外部类的成员和域的嵌套类;你可以把它们看作是拥有指向包含它们的外部类的‘this’指针的类。