此书的作者 Andrei Alexandrescu 作为前 C++ 社区的一朵奇葩,因为实在是不满 C++ 标准委员会的官僚作风,跳槽到了 D 社区,成为了 D 发明人 Walt Brightman 的好基友,最终写出了这本神奇的 The XXX Programming Language 居然不是语言发明人本人写的书。

先谈谈历史,D 语言最早从 1999 年就开始开发了,掐指算算,到现在(2013 年)为止已经过去十多年了,十多年啊,结果到现在还是一种烂泥巴扶不上墙(请原谅我的法语)的状态,最终沦为了几个社区大拿的玩具。

然后我介绍下 D 语言的发明人 Walter Brightman:WB 先生本身是一个注重实践、比较内向的大龄 geek,我无意冒犯,但是这样性格的人并不适合运作一个开源社区。虽然开源社区最终都需要一个像 Linus 那样的独裁者来做最终决定,但是 WB 的控制欲让他很难让其他水平比他低的人参与到 D 的设计与开发工作中来。

还有当年的大分裂——D2,跟 Python 没人用 3.x 的情况一样,D 1.x 与 D 2.x 之间语言的巨大改变是造成 D 社区失和的重要原因。D 出现的早期,社区里一大拨人因为不满意 D1 的简陋标准库 Phobos,决心为 D 开发一套类似 .NET 或 Java 的标准库 Tango,因为闹革命推翻 WB 写的标准库,自然得不到编译器的支持,不跟编译器一起发布的“标准库”也就“标准”不起来了。再加上没有个稳定可用的编译器,开发 Tango 库的牛人们最终纷纷离开了社区,Tango 库项目也就不了了之了,到现在只留下了一本遗作:《Learn To Tango With D》(豆瓣有,自己搜下)。

这里要谈谈开源软件的通病:人人都想去实现酷炫的新特性而不是静下心来解决 bugs。D2 刚开始开发,WB 的重心就转向忙着实现 D2 的新特性而不是清理现有 D1 的 bugs。一个有不少 bug 的编译器恐怕是谁都不敢拿来正式用的,因此形成了恶性循环,让 D 这个很有潜力的语言变成了玩具项目。

最后就是 WB 先生太过于执着把 D 设计成世界上最强大的语言,却又单凭一己之力无法实现因此造成 D 语言的 spec 里引入了太多复杂的特性,现有特性也非常粗糙,比如:

1. 函数指针有 function 和 delegate 两种,分别用两个关键字来声明,文档里承诺将整合成统一的形式,结果到现在十多年都没实现。

2. 常量里的 const 与 immutable:D2 引入了各种常量形式,比 C++ 的前置后置 const 还要复杂的排列组合大大增加了学习与使用的心智负担。

3. 在语言里堆砌了太多的特性,比如契约式设计、单元测试等等这些本来应该用库实现的东西,造成语言本身过于复杂,难以完全掌握。由于契约式设计不是强制的,标准库里也没有完全采用,给人一种半成品山寨的感觉。

4. 21 世纪了,成功的语言都需要有大的、方便的标准库,用 Python 的话来说就是“自带电池”。发展了十多年的 D 作为开源的编程语言及其参考实现居然没有个包(库)管理器,人家才出来的 Node.js 都有了 npm 了好吗?!在目前标准库跟 C++ 一个水平(但是 C++ 积累了这么多年有无数第三方的库,比如 Qt)的情况下,除了语言爱好者以外就很难吸引到其他的使用者。

最后,WB 先生太执念于上个世纪他为 Symantec C++ 编译器写的后端了,官方的参考编译器实现的后端到现在都没切换到业界的事实标准 LLVM。这样一来,为了真正能够弄个靠谱的编译器,社区又得从头实现基于 LLVM 的编译器。

The D Programming Language 书评的更多相关文章

  1. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

  2. iOS Swift-控制流(The Swift Programming Language)

    iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...

  3. iOS Swift-简单值(The Swift Programming Language)

    iOS Swift-简单值(The Swift Programming Language) 常量的声明:let 在不指定类型的情况下声明的类型和所初始化的类型相同. //没有指定类型,但是初始化的值为 ...

  4. Java Programming Language Enhancements

    引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...

  5. The Swift Programming Language 英文原版官方文档下载

    The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...

  6. The Swift Programming Language 中文翻译版(个人翻新随时跟新)

    The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...

  7. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01

    注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...

  8. Questions that are independent of programming language. These questions are typically more abstract than other categories.

    Questions that are independent of programming language.  These questions are typically more abstract ...

  9. What is the Best Programming Language to Learn in 2014?

    It’s been a year since I revealed the best languages to learn in 2013. Once again, I’ve examined the ...

随机推荐

  1. POJ 2560

    #include<iostream> #include<algorithm> #include<cmath> #include<iomanip> #de ...

  2. Python中对矩阵的洗牌操作

    [code] import numpy as np # 创建随机交换的索引 permutation = list(np.random.permutation(3)) # 创建矩阵X,Y X = np. ...

  3. IIS:IIS 8.5下设置404错误页

    IIS版本:IIS 8.5 问题描述 搭建一个测试网站,总共就2个页面(index.php和404.php),默认首页为:index.php 当访问index.php和404.php的时候,IIS服务 ...

  4. ActiveMQ配置高可用性的方式

    当一个应用被部署于生产环境,灾备计划是非常重要的,以便从网络故障,硬件故障,软件故障或者电源故障中恢复.通过合理的配置ActiveMQ,可以解决上诉问题.最典型的配置方法是运行多个Broker,一旦某 ...

  5. php -- 正则替换

    ----- 019-regex_replace.php ----- <!DOCTYPE html> <html> <head> <meta http-equi ...

  6. 阿里2015校招面试回忆录(成功拿到offer)

    1. 引言 继上次“百度2015校园招聘面试题回忆录(成功拿到offer)”文章过后,大家都希望除了题目之外,最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有参考价值. 嗯,建议的很对, ...

  7. Java 使用gson 解析 Json

    json数据 { "resultcode": "200", "reason": "successed!", " ...

  8. elasticSearch6源码分析(3)cluster模块

    1. cluser概述 One of the main roles of the master is to decide which shards to allocate to which nodes ...

  9. ajax传递数组到后台,js传递数组到后台

    用angular做商品搜索功能,后台接口那边过滤条件必须传递数组过去,结果比较尴尬的事情发生了,每次传递数组过去,查看请求发送的数据,自动被转成了对象,很头疼. 数据传递前 传递后我查看了请求的数据 ...

  10. 搜索过滤Tip : title,site(搜标题和搜网站)

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~拿老东家作例子了.........