D
程序设计语言
· 介绍
· 概览
· 词法
· 模块
· 声明
· 类型
· 属性
· 特征
· 编译器指令
· 表达式
· 语句
· 数组
· 结构/联合
· 类
· 接口
· 枚举
· 函数
· 运算符重载
· 模板
· 混入
· 契约
· 版本控制
· 错误处理
· 垃圾收集
· 内存管理
· 浮点
· 内联汇编
· 对 C 的接口
· 移植性指南
· 在 HTML 中嵌入 D
· 应用程序二进制接口
· Phobos(运行时库)
· Win32 平台下的 D
· 转换 C .h 文件为 D 的模块
· FAQ
· 编程风格导引
· 示例:wc
· D 编译器
· 未来
· D 修改日志
· 致谢
--------------------------------------------------------------------------------
对比
· D vs C/C++/C#/Java
· 将 C 转换为 D
· 将 C++转换为 D
· C 的预处理程序 vs D
· D 的字符串 vs C++ std::string
· D 的复数 vs C++ std::complex
· D 的契约式编程 vs C++
--------------------------------------------------------------------------------
简单地说,D 语言是一门新的编程语言,包含了 C++、C# 跟 Java 的长处,补充了它们的
不足。
D 语言的作者 Walter Bright (就一个人哦,暴强!!!)是大名鼎鼎的 Symantec C++ compiler 的
作者,所以这门语言还是值得期待的。
目前的版本是 D 0.141,dec 05, 2005.
其主页上介绍的特性很多,在我看来,主要还是其垃圾回收机制:
与 C++相比,D 语言采用了垃圾回收机制(GC),将程序员从指针堆里解放出来;
与 C#/Java 相比,其垃圾回收机制不需要虚拟机,运行速度提高,依赖性降低;
是 C/C++的高效性与 JAVA 的安全性之结合。
D 语言与其他语言功能比较表:
D 程序设计语言
"
在我看来绝大多数“新的”编程语言都可以被分成两类:那些来自学院、拥有激进编程范型
的语言,以及那些来自大公司、关注
RAD
和
web
的语言。也许是实现一门经过实践检验
的新语言的编译器的时候了。
" -- Michael
"
太好了,正是我所要的,又一个
D
语言。
" -- Segfault
这是 D 编程语言的参考文档。有关 D 的最初想法始于 1999 年十二月,我的目标是使之成
为 C 和 C++ 的接班人,之后在它成长和进化的过程中,我的许多朋友和校友提供了许多有
用的建议和意见。尽管有人告诉我新语言没有机会等等,但我还是坚持设计这样一种语言
看看这份文档,你自己决定吧!
看看 D 与 C、C++、C# 和 Java 之间的简要比较吧。
D 的新闻组 news.digitalmars.com 是我们的讨论区。欢迎提供建议、批评、褒奖、争论等。
你还可以登录 D forum 。还可能有你本地社区的 D 用户组(如果没有,你可以自己建立一
个!)。
下载 Win32 平台和 x86 Linux 平台上的最新版编译器并尝试一下!
David Friedman 编写了 GCC 的 D 前端.
这份文档的其他版本:
语言规格的 pdf 版 。
Kazuhiro Inaba 准备了一份 日语版 。
在 SDWest 2004 上我给出了一个 D 的演示 。
注意:所有下载并使用 D 或者阅读 D 技术规格的 D 用户都被认为阅读过并明确地同意所
有 Digital Mars 投递的邮件或回执中的有关智能财产产权的声明(包括版权或专利通告)。
-Walter
概览
什么是 D 语言?
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’关键字,一个更为微妙的例子
是 C 中的宏预处理程序)。我们可以依赖现代编译器的优化技术而不是使用语言特性(如
同原始的编译器所做的那样)来获得可以接受的代码质量。
D 的主要目标
通过加入已经被证明的能够提高生产力的特性、调整语言特性以避免常见但耗费精力
的 bug 的出现,至少减少软件开发成本 10%。
是代码易于在编译器之间、在机器之间、在操作系统之间移植。
支持多种编程范式,也就是至少支持命令式、结构化、面向对象和范型编程范式。
对于熟悉 C 或者 C++ 的人来说,学习曲线要短。
提供必要的低级访问能力。
要使 D 的编译器从根本上易于实现(相对于 C++ 来说)。
要同本机的 C 语言应用程序二进制接口相兼容。
语法要做到上下文无关。
对编写国际化的应用程序提供便利的支持。
同时支持契约式编程和单元测试方法论。
能够构建轻量级的、独立的程序。
从 C/C++保留而来的特征
粗看上去 D 就像 C 和 C++ 。这样一来学习以及将代码移植到 D 就很容易。从 C/C++ 转
向 D 应该很自然。程序员不必从头学起。
使用 D 并不意味着程序员会如 Java 或者 Smalltalk 那样被严格的限制在某一个运行时 vm
(虚拟机)上。D 没有虚拟机,编译器直接生成可连接的目标文件。D 如同 C 那样被直接
连接到操作系统。通常那些你熟悉的工具如 make 同样适用于 D 的开发。
D 将很大程度上保留 C/C++ 的 观感 。它将使用相同的代数语法,绝大多数的相同表
达式和语句形式,以及总体的结构。
D 程序既可以采用 C 风格的 函数和数据 范式,也可以采用 C++ 风格的 面向对象 范式,
或者它们两者的混合。
编译/链接/调试 的开发模型将会被继承下来,但是把 D 编译成为字节码然后解释执行
也不会有任何问题。
异常处理 越来越多的使用经验显示,异常处理是比 C 传统的“出错代码/全局 errno 变
量”模型更为高级的错误处理模型。
运行时类型识别 C++ 部分地实现了这个功能,而 D 更进一步。对运行时类型识别的完
全支持将使垃圾收集运行的更好,会使调试器的功能更强,会使对自动持久化的支持
更好等等。
D 维持了同 C 调用惯例 的兼容。这样就能够使 D 程序直接访问操作系统的 API 。程
序员有关现有 API 和编程范例的知识和经验可以继续在使用 D 时使用而只需付出很少
的努力。
运算符重载 D 支持对运算符的重载,这样就可以用用户定义的类型扩展由基本类型构
成的类型系统。
模板 模板是实现范型编程的一种手段。其他的手段包括使用宏或者采用协变数据类型 。
使用宏已经过时了。协变类型很直接,但是低效且缺少类型检查。 C++ 模板的问题是