D 语言之父谈 D 语言的诞生

简介: 将Walter Bright带往写一门语言、现在排在前20名的道路是从好奇开始的——也有侮辱。

将Walter Bright带往写一门语言、现在排在前20名的道路是从好奇开始的——也有侮辱。

image.png

我喜欢弄清楚事情是如何运作的,并从非常早期的阶段设计它们(我爱Tom Swift系列的书【注1】)。早期,我知道我自己在设计火车头或施耐德杯赛车。我的学位是机械工程。但是机械工程让我沮丧,因为建造任何东西都有昂贵的代价,以及我的糟糕至极的建造水平。

在另一方面,编程,我可以建造能想象到的最错综复杂的机器,零成本,只需要计算机访问。和很多程序员一样,我开始开发游戏。开发游戏的动机是某种上帝情节——你能够创造完整的、奴隶般地遵守你规则的一个世界。在游戏《Empire》里,我不仅仅创造了这样的世界,而且花了无数小时规划如何让计算机更好地操作敌方军队。甚至到了今天,我仍然在考虑优化的方法。

然而,问题在于计算机策略对计算机性能的渴求远远超过了可用机器的能力,因此我对编译器如何优化代码产生了兴趣。编译器好像喜欢彻底的、充满魔力的设备,它把源代码转化成机器码。这个魔术究竟如何实现的?在《BYTE》杂志把源代码发布到Tiny Pascal之前,这是宇宙中非常神秘的东西。我研究了程序的每一行代码;在掌握之后,我觉得我拿到了通往圣殿的口令。

过了几年。在80年代早期,我发现我自己成为了面向MS-DOS开发软件的开发小组成员。我们都用C,因为它是唯一的高级语言,我们发现它事实上能够在PC上运行。其它语言实现令人难以置信地糟糕。甚至C编译器也是让人讨厌的,但至少它们是可用的。它们产生的代码非常可怕,不存在优化。我产生了一个想法,我自己能够写一个更好的C编译器。

我向一个同事透漏了这个想法,他建议我和他,还有一个当地C的大牛一起吃午餐,该大牛将给我如何开展的一些建议。我们过去了,我的朋友向这位大牛介绍了我的宏大目标。他鄙视我的回答一直刻在我的脑子里,“你到底算老几,你居然认为你能写一个C编译器?”

现在想想我不得不感谢他,因为我发现 向他炫耀的欲望成为了最有力的动机。我开始实现C编译器,也就是广为人知的Datalight C。感谢我在优化上的兴趣,它成为PC上第一个拥有数据流(data-flow)的优化编译器。这样一个概念当时太新了,以致于在PC杂志基准陷入了麻烦,因为编译器认为基准什么也没有做而删除了所有的废弃代码——记者误认为我的编译器有问题,或作假,Datalight C得到了一个负面评论。(当然,这使我更加疯狂,那个年代还没有随处可用的互联网,我无法发表辩驳文章。)

后来被转化为Zortech C。那时候,PC上已经有很多其他的C编译器了(我想那时候有30个)。我调查一番找到了竞争优势,在书店发现了Bjarne Stroustrup的书。我想,“嗯,加一堆新的关键词,数月之内,我将有一个C++编译器!”可能是看轻了那个编程的世纪。如果我知道我面临什么,或许我会相信那个说我做不到的人。

不管如何,80年代末很多人正工作在C的继任者上。

你甚至在那时的新闻组里找到引用叫做“D”的项目。由于各种原因,包括Zortech的一款便宜的C++编译器准备登陆最流行的平台,C++埋葬了其它的语言,并统治了90年代的编程;我深受鼓舞。

随着时间的推移(那时候是90年代),我也写了生成原生代码的Java编译器和一个JavaScript编译器/解释器。这些产品不够成功。我注意到,忙于我需要的东西 要比 忙于我被告知的其他人需要的东西 好一点点。

比如,一天我和一个程序员朋友慢跑时,他说,“世界急切追求的是能生成原生代码的Java编译器。你会因此发大财的!我使用Java,它是真正的必需品。”我告诉他,碰巧了,我写了一个,他马上就可以开始使用。当然,他从来没有用。

我发明了《Empire》游戏是因为它是我想玩的游戏。我开发一个C编译器是因为我需要用来开发《Empire》(和其它项目)的较好的编译器。Java和JavaScript编译器是其他人的想法。不过还是回到D的出处。

没有人工作在编译器上超过15年,而不会产生语言优化的想法。我尝试了C和C++编译器的很多语言优化,它们都太平常了。没有人对语言扩展感兴趣,他们想要标准的可编译的语言,他们是对的。不幸的是,得到能够被标准委员会采用的想法是一个费力的、常年官僚的过程——我忍受不了这个过程。

在1999年,我认为我累了,在我变疯之前我花了6个月看电视。

是时候返回生活了。对于现存语言存在问题的抱怨由来已久了;我决定给机器商店通电。当解决这样的问题时,我总是想起Gimli矮人【注3】:“死亡是一定的,有小的成功机会。我们还等什么?”为什么不是呢?至少我手握长剑,为光荣的战争而战斗。

因此D启程了,踉踉跄跄做为一个独立的项目。如果我没有为某种语言写过编译器,我用它编程就从来不觉得舒服(我知道,又一个怪癖),但是我有足够的经验实现各种语言,以致于我对让D运行起来非常有信心。如今我也充分利用了现存C++编译器生态系统来工作。

数年后,D首次出现在Slashdot,它开始快速地引起了用户和贡献者的注意。事实证明,我在从一种语言想要的东西中,很难成为一个唯一的人!D和全世界的贡献者一道,怀着雄心疯狂地成长。甚至在数月前的Dconf2013大会上,我们才知道彼此是什么样子。(这是互联网革命的最伟大的方面:你能够成功地与其他人协作,而不知道他们的性别、年龄、长相、种族、宗教、语言、文化、残疾、历史等等。它纯洁得像知识界的精英。只有你的想法、贡献以及你如何展示自己。)

就像D的情况,没有互联网它就不能存在。其他完全不具可比性的热心人怎样才能走到一起?像github和bugzilla之类的协作工具的崛起对于D的发展起到了绝对的关键作用(当然,还有开源模式!)。

但是我也不得不学习,经常是痛苦的方式:

  1. 我的天性趋向于单打独斗。我曾经在各种工作得到的绩效考评,通常包含了像“Walter需要学习与其他人更好地工作”之类的话。我一度几近疯狂地急切地想控制D社区的一切,我不得不改变了。
  2. 我不得不学习如何管理都是志愿者参与的项目。既然我不支付给任何人报酬,我就不能要求任何人做任何事情。我不得不找到其它方法。我的性格测试非常靠近“呆子”的排名,因此激励别人于我而言不是自然的。这实际上是一个令人着迷的挑战。
  3. 在D论坛,对新语言特性的建议每天都有。我不得不说太多“不”,真很难说出口,让提建议的人听到也比较痛苦。
  4. 管理是一件苦差,我不太适应。我在Zortech就没有做好这个工作;在各种合作的工作中,我(英明地)从来没有被晋升到管理。但是有了D,这不能回避了——我不得不学习如何管理,因为我想让D走向成功。
  5. 我朋友知道,我热爱辩论。我参与了很多网上的口水战。但是我在D论坛不能那样做,因为根据口水战的结果,没有人曾经改变过他们的想法,不管他们错得有多严重:-)。所有这些经验实际上变成了一个奇妙的优势——我能够分辨出一个交谈帖子在什么时候将开始演变成徒劳的争论,然后采取措施来降温并消除掉。

我仍然不得不与急切的”Shields up! Phasers on vaporize!”愿望战斗。当然,当D论坛的任何人都同意时,这对我就成为一件进行中的工作。D过去是、并继续保持一种令人尖叫的体验,它从很多其它语言借鉴了最好的想法,它也是来自世界各地的很多、很多贡献者的大量的、无私的努力的总和,他们一直只是以他们完成的成就为自豪。

所有这一切产生了一个结果,我特别珍惜,我爱用D编程。它是我希望我能一直拥有的语言。我很开心我没有听唱反调的人、Debbie Downers,当然还有多年前的无名的C大牛,我欠他们一个感谢。

那么,你想编写你自己的语言吗?我所能说的全部就是:死亡是一定的,有小的成功机会。你们还等什么?

注1:Tom Swift:http://en.wikipedia.org/wiki/TomX8XSwift

注2:Computer Strategy Game 战略游戏(也叫策略游戏)是一种广泛存在于图板游戏、电视游戏和电脑游戏的游戏形式。它要求游戏的参与者“拥有”做出决策的能力。在战略游戏中,决策对游戏的结果产生至关重要的影响。战略通常是与运气相对的,然而,很多游戏既包含战略成分又包含运气成分,这给战略游戏的划分带来一定的困难。因此,我们可以用游戏的战略成分来描述这个游戏。

注3:http://zh.wikipedia.org/wiki/矮人_(中土大陸)


相关文章
|
Java PHP 开发工具
编程语言Clojure入门
在众多的编程语言中,不少开发人员熟悉Java、C#、PHP等。但是很早以前,也有一些小众的语言,比如Lisp语言,它是一种适用于符号处理和自动推理的编程语言,内部使用表结构来表达非数值计算。而Clojure语言是在JVM上实现的Lisp风格的语言,语法与Lisp类似,且可以和Java语言进行互操作
1519 0
编程语言Clojure入门
|
消息中间件 监控 算法
高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】
高效排队,紧急响应:RabbitMQ Priority Queue全面指南【RabbitMQ 九】
513 0
|
11月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第6天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django功能全面,适合快速开发;Flask灵活轻量,易于上手;Pyramid介于两者之间,兼顾灵活性和可扩展性。文章分析了各框架的优缺点,帮助开发者根据项目需求和个人偏好做出合适的选择。
237 4
|
10月前
|
SQL 数据可视化 关系型数据库
开源低代码平台推荐!10款优秀的开源低代码平台!
本文介绍了10款免费开源低代码开发平台,包括JeeLowCode、Ample、WaveMaker等,它们通过减少代码编写量,提供高效、灵活的开发工具,帮助企业快速构建复杂应用,支持企业数字化转型。各平台特色鲜明,适用于不同开发需求和应用场景。
|
12月前
|
编译器 C# Android开发
震惊!Uno Platform 与 C# 最新特性的完美融合,你不可不知的跨平台开发秘籍!
Uno Platform 是一个强大的跨平台应用开发框架,支持 Windows、macOS、iOS、Android 和 WebAssembly,采用 C# 和 XAML 进行编程。C# 作为其核心语言,持续推出新特性,如可空引用类型、异步流、记录类型和顶级语句等,极大地提升了开发效率。要在 Uno Platform 中使用最新 C# 特性,需确保开发环境支持相应版本,并正确配置编译器选项。通过示例展示了如何在 Uno Platform 中应用可空引用类型、异步流、记录类型及顶级语句等功能,帮助开发者更好地构建高效、优质的跨平台应用。
485 59
|
Dubbo Java 应用服务中间件
Dubbo日志文件输出到指定目录 如何定义?
Dubbo日志文件输出到指定目录 如何定义?
|
11月前
|
缓存 监控 API
淘宝API接口注意事项及要点
淘宝API接口的使用需注意以下要点:首先注册并认证开发者账号,获取API密钥;深入理解接口文档,确保参数合法准确;遵守调用频率限制,必要时申请提额;确保数据安全与隐私保护;合理处理错误与异常;优化缓存与性能;关注版本更新与兼容性;遵守合规性与法律要求;建立日志记录与监控机制。
|
12月前
|
Java
常用工具类-Collections
本文介绍了Java中Collections工具类的功能和用法,包括对集合进行排序、查找、填充操作,判断集合是否有交集,以及创建不可变集合的方法。通过示例代码展示了如何使用Collections类提供的静态方法,如reverse、shuffle、sort、swap、binarySearch、max、min、fill、frequency、disjoint、emptyList等,突出了Collections类在操作集合时的便利性和实用性。
常用工具类-Collections
|
算法 计算机视觉 Python
一文讲解图像梯度
图像梯度计算的是图像变化的幅度。对于图像的边缘部分,其灰度值变化较大,梯度值变化也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值变化也较小。一般情况下,图像梯度计算的是图像的边缘信息。它在图像处理和计算机视觉中具有重要的应用,常用于边缘检测、特征提取和图像增强等任务。
703 0
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
392 0