enter image description here

Andrei Alexandrescu

世界顶尖的C++专家,2001年撰写了经典名著《C++设计新思维》(Modern C++ Design),曾荣获2001年最佳C++图书称号,书中所开发的Loki已经成为最负盛名的C++程序库之一。他被认为是新一代C++的代表人物,因为对Template技术的精湛运用,震撼了整个C++社群,开辟了C++编程领域的“Modern C++”新时代。他还与Herb Sutter合著了《C++编程规范》(C++ Coding Standards)。他花了8年的时间攻读机器学习方面的博士学位,专门研究部分自然语言处理结构。自2006年开始,他与D语言的最初设计者及实现者Walter Bright紧密合作,设计和实现D语言及其标准库,他是D语言很多特性的设计者,也是大多数D语言标准库的作者。Andrei Alexandrescu在工业界和学术界都有很高的声誉。现为Facebook研究员。

Walter Bright序

记得很久以前,我读过一本科幻小说,其中有这么一行:科学家在可能拓展其研究领域知识的时候,就应该勇往直前。简单地讲,它揭示了想要成为一名科学家所应具备的潜质。值得一提的是,在物理科学家Richard Feynman的影像资料和著作中,无处不体现着发现的乐趣,而且他对科学的热情也极具感染力和非常迷人。 尽管我不是科学家,但我明白他们的动机。我的动机跟工程师的动机一样——享受创造的乐趣,从无到有把某样东西建造出来。有一本我很喜欢的书The Wright Brothers as Engineers,作者是Wald,书中记录了莱特兄弟在克服一个又一个飞行难题之后逐步前进的过程,同时还记录了他们如何应用这些知识来创建飞行器的过程。

我早期的兴趣与Brinley所著的Rocket Manual for Amateurs开篇中所概述的内容一样:“燃烧与爆炸的事物总是让人激动和着迷”。后来又变成想去构建一些能跑得更快和飞得更高的事物。

不过构建功能强大的机器耗资巨大,于是我发现了计算机。它最神奇的地方在于可以让你轻松地去构建某些事物,又不需要昂贵的制造车间和机械工厂,甚至连一把螺丝刀也不需要。只需要一台花费不多的计算机,你就可以创造世界。

就这样,我开始在电脑里建造虚拟世界。第一个作品便是游戏Empire——世纪之战。由于当时电脑的处理能力实在太弱,这个游戏根本就没办法正常运行,因此我又开始对如何优化程序的性能产生了兴趣。此兴趣让我开始对可以生成代码的编译器进行研究,自然而然便发展到了“我能写出比它更好的编译器”这样一种自负。因迷恋C语言,我迫切希望实现一个C语言编译器。这个也不是太难,大概只用了几年的空余时间。后来我又发现了Bjarne Stroustrup的C++语言,于是我认为再花上几个月的时间应该能够将那些扩展添加到我的C语言编译器里。

十多年后,我仍然在为此努力。在实现这个编译器的过程中,我对C++语言的每一个细节变得非常熟悉。为一个庞大的用户群提供支持意味着能体验到其他人对此种语言的大量的认知:起作用的是什么,而什么是没用的。我不会不加思索地去改进设计。在1999年,我决定将这一想法付诸实践。开始时它叫作Mars编程语言,而我的同事最初是开玩笑地称其为D语言,不过这个名称后来被延用下来,D语言由此诞生。

在撰写本文时,D语言已有十个年头,而且已演变到了第二代,有时也叫D2。在这段时期里,D语言已从由一个人敲打着键盘开发它,发展到由一个全球性的开发者社区来解决它方方面面的问题,以及为库和工具的生态系统提供支持。

D语言自身(本书的焦点所在)已从卑微的初级阶段成长为一门功能非常强大的语言,它擅长从多种角度解决编程问题。据我所知,D语言前所未有地将多种强大的编程范型(programming paradigm)巧妙地集成在一起:命令式(imperative)、面向对象(object-oriented)、函数式(functional)以及元式(meta)。 乍一看,这门语言肯定不简单。的确,D语言不是一门简单的语言。但我认为这是一种错误地看待一门语言的方式。更恰当的方式应该是:这门语言的编程解决方案看起来的样子像什么?D语言程序是复杂愚钝还是简洁优雅呢?

我有一位同事,他有着丰富的企业环境开发经验。他注意到IDE(Integrated Development Environment,集成开发环境)是一个相当重要的编程工具,因为只需单击一下鼠标就会有数百行的样板代码生成。对D语言来说,IDE不是不可或缺的,因为D语言并不依赖基于向导式的样板代码。通过自省(introspection)和生成功能,它让自己不再依赖于使用样板。程序员不必看到样板,负责程序内在复杂性的是语言,而非IDE。 例如,有人想要用更简单一些的语言(对范型没有特别的支持)来进行OOP(面向对象编程)设计。这也是完全可能的,但这种做法糟糕透顶,而且毫无价值。当有一门更为复杂的语言直接支持OOP时,编写OOP程序就会变得简洁优雅。语言越复杂,用户代码就越简单。这才是值得去做的事情。

必须有一种可以支持多范型的语言,才能支持以简洁优雅的方式为各种类型的任务编写用户代码。正确编写的代码在页面上看起来应该是赏心悦目的,说来也奇怪,漂亮的代码往往就是正确的代码。我不确定两者之间存在什么样的联系,但确实如此。与好看的飞机常常都飞得很好是一样的道理。因此,让算法可以以一种漂亮的方式来进行表达,这样的语言特性肯定会是件好事情。

然而,编写代码时的简洁优雅并不是衡量一门程序语言好坏的唯一标准。当前,程序的规模在无止境地迅速增长。随着这种变化,依赖于惯例和编程方面的专长以确保代码的正确性变得越来越不实际;相反,依赖于使用机器进行检查的保证正变得越来越有价值。为此,D语言提供了多种策略,让程序员可以使用它们来实现这类保证。这些策略包括契约(contract)、内存安全(memory safety)、各种函数属性、不变性(immutability)、劫持保护(hijack protection)、作用域守护(scope guard)、纯洁性(purity)、单元测试(unit test)、线程数据隔离(thread data isolation)。

我们并没有忽视性能!尽管有预言说性能不再那么重要,尽管现在计算机的运行速度比我编写第一个编译器时快了上千倍,但对更快速程序的需求却从未改变。D语言是一门系统编程语言。这预示着什么呢?从某种意义上讲,它意味着使用D语言除了能编写设备驱动程序和应用程序外,还可以用来编写操作系统。在更为技术的层面,它意味着D语言程序可以访问机器的所有功能,即可以使用指针、进行指针别名和指针运算、绕过类型系统,甚至可以使用汇编语言编写代码。没有什么是D语言程序员无法访问的。例如,D语言的垃圾回收器实现就完全是使用D语言编写的。

请等等!这怎么可能?一门语言怎么能同时提供可靠的保证和随意的指针操作呢?答案就是这种保证是基于语言所使用的概念。例如,函数属性和类型构造函数可用于实施编译时的保证,而契约和不变量(invariant)则专门用于运行时实施的保证。

D语言的大部分特性都曾以这样或那样的的形式出现在其他语言里。任何特定的单个特性都无法造就一门语言,但它们组合后所产生的作用却能超过单个部分所起作用的总和,D语言的组合造就了一种令人满意的语言,它以优雅和直接的方式来解决各式各样的编程问题。

Andrei Alexandrescu因其不拘一格的编程思想而著名,这些思想已成为新的主流(请参考他的重要著作Modern C++ Design)。Andrei于2006年参与到D编程语言的设计团队。他拥有坚实的编程理论基础,以及无尽创新性的针对编程设计问题的解决方案。D2的成型主要归功于他,本书在许多方面都跟随着D语言一起在演变。在这本关于D语言的著作中,你会欣喜地发现这样一件事件,即其中包含的是很多关于设计选择的原因,而非枯燥乏味的事实陈述。了解一门语言为什么会是这个样子能让人更容易和更快速地理解它,并让程序可以运行得更快。

使用D语言来解决大量基础性的编程问题,Andrei不断地采用这种方式以求阐明其中的原由。因此,他不仅展示了D语言是如何工作的,而且还说明了它为什么会工作以及如何使用它。 正如我已把D语言融入我的生活一样,希望你也能在D语言编程过程中获得乐趣。在Andrei的这本书里,每一页都令人兴奋不已,相信你一定会受益无穷。

Walter Bright

2010年1月

enter image description here

相关阅读:Scott Meyers为Andrei Alexandrescu的《D程序设计语言》作的序