D语言查看源代码讨论查看历史
D语言,一种通用计算机程序语言,威力强大、功能丰富,支持多种编程范式,例如面向对象。D语言最初由Digital Mars公司就职的Walter Bright于2001年发布,意图改进C++语言。最新D语言被简称为D2。最主要的D语言的实现是DMD。
D 语言源自C/C++,借鉴了众多编程语言的特色和现代编译器技术,融会贯通了设计者丰富的实践经验,使之具备了非凡的威力--既有 C/C++ 语言的强大威力,又有 Python 和 Ruby 的开发效率。它集众多系统级编程所需的功能于一身,例如垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内建基本运行时信息。[1]
D 语言在C++的基础上有一定的扩展,同时还保持了生成高效代码以及直接访问操作系统API和硬件的能力。D 很适合于编写从中等规模到团队合作完成、数百万行代码规模的各种程序。
D 易于学习,为编程者提供了各种便利,采用了各种野心勃勃的编译器优化技术。D 不是一种解释型语言,所以不需要虚拟机。它是给实际的编程者使用的实用的计算机程序语言,帮助程序员快速、可靠地完成易于维护、易于理解的代码。
D 是数十年来实现多种语言编译器的经验的积累,是用那些语言构造大型工程的尝试的积累。D 从那些语言(主要是 C++ )那里获得了灵感,并使用经验和现实世界中的实用性来驯服它。
为什么需要D语言
自从 C++ 语言被发明以来,许多新的概念加入了 C++ ,但同时维护了于C 的兼容性,包括兼容了原始设计中的所有的弱点。有很多修正这些弱点的尝试,但是兼容性是最大的困扰。同时,C 和 C++ 都在不断引入新的特性。这些新特性必须被小心的加入到现有的结构中,以免重写旧的代码。最终导致了十分复杂的语言规范—— C 标准近 500 页,C++ 标准超过750 页!C++ 实现起来既困难又代价高昂,导致各种实现之间都有差别,因此很难写出完全在不同实现之间可以移植的 C++ 代码。
C++程序员倾向于使用语言中的孤岛来编程,也就是说,他们倾向于十分精通语言中的某个特性而避免使用其他特性。尽管代码通常在编译器之间是可移植的,但在程序员之间移植就不那么容易了。C++ 的一个长处是它支持很多根本上不同的编程风格——但从长远来看,互相重复和互相冲突的风格会给开发带来妨碍。
C++ 在标准库而不是语言核心中实现了可改变大小的数组和字符串拼接等。不在语言核心中实现这些功能造成了几种不太理想的结果。是否能把 C++ 的能力释放、重新设计并重铸到一门简单、正交并实用的语言中呢? 这种语言是否能做到易于正确实现,并使编译器有能力有效地生成高度优化的代码呢?
现代编译器技术已经取得了很大的进步,有些原来用作原始编译技术的补充的语言特性已经可以被忽略了(一个这样的例子是 C 语言中的‘register’关键字)。我们可以依赖现代编译器的优化技术而不是使用语言特性(如同原始的编译器所做的那样)来获得可以接受的代码质量。
通过加入已经被证明的能够提高生产力的特性、调整语言特性以避免常见但耗费精力的bug的出现,至少减少软件开发成本10%。使代码易于在编译器之间、在机器之间、在操作系统之间移植。
支持多种编程范式,也就是至少支持命令式、结构化、面向对象和范型编程范式。对于熟悉 C 或者 C++ 的人来说,学习曲线要短。提供必要的低级访问能力。
要使 D 的编译器从根本上易于实现(相对于 C++ 来说)。要同本机的C语言应用程序二进制接口相兼容。语法要做到上下文无关。对编写国际化的应用程序提供便利的支持。同时支持契约式编程和单元测试方法论。能够构建轻量级的、独立的程序。
适合于
经常使用lint或者类似的代码分析工具以期在编译之前减少 bug 的程序员。
将编译器的警告级别调到最高的人和那些告诉编译器把警告作为错误的人。
不得不依靠编程风格规范来避免常见的 C bug 的编程部门经理们。
认定 C++面向对象编程所允诺的功能由于 C++ 太复杂而不能达到的人。
沉溺于 C++ 强大的表达力但是被显式内存管理和查找指针 bug 折磨得精疲力尽的人。
需要内建的测试和验证机制的项目。开发百万行规模的程序的团队。
认为语言应当提供足够的特征以避免显式处理指针的程序员。编写数值运算程序的程序员。D 拥有众多直接支持数值计算的特征,例如直接提供了复数类型和拥有确定行为的NaN和无穷大。(这些都被加进了最新的 C99 标准,但是没有加进 C++ 中。)
D 的词法分析程序和解析程序完全互相独立,并且独立于语义分析程序。这意味着易于编写简单的工具来很好地处理 D 源码而不用编写一个完整的编译器。这还意味着源码可以以记号的形式传递个某个需要它的程序。
项目管理
版本控制
D 对从同一份源码生成多个版本的程序提供了内建的支持。它替代了 C 预处理程序的 #if/#endif 技术。
废弃
随着代码不停的演进,一些旧的库代码会被更新,更好的版本代替。同时旧的版本必须可用以支持旧的客户代码,旧的版本可以被标记为废弃的 。可以通过编译器的一个选项来判断使用废弃版本代码的版本是否是合法的,这样一来负责维护的程序员就可以更为轻松的判断哪里是依赖于已经被废弃的特征的。
没有警告
D编译器不会为可疑的代码生成警告。代码要么可以被编译器接受,要么不能被编译器接受。这样就不会引起有关哪些警告确实是错误而那些不是的争论,也就没有如何处理它们的争论了。对编译器警告的需求本身就是不好的语言设计的表现。