此书的作者 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. elasticsearch+logstash+redis+kibana 实时分析nginx日志

    1. 部署环境 2. 架构拓扑 3. nginx安装 安装在192.168.176.128服务器上 这里安装就简单粗暴了直接yum安装nginx [root@manager ~]# yum -y in ...

  2. Docker三剑客之Docker Machine

    一.什么是Docker Machine Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:// ...

  3. SQLAlchemy的ORM

    表关系: 表之间的关系存在三种:一对一.一对多.多对多.而SQLAlchemy中的ORM也可以模拟这三种关系.因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的,所以先来看下一对多的关 ...

  4. 一道JS面试题引发的血案

    刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...

  5. rubymine debug需要安装依赖

    for ruby2.x gem install ruby-debug-ide --pre gem install debase --pregem install debugger2 --pre

  6. docker内存和cpu调试

    本地启动了一个sshd的容器服务,但该容器经常会被重启导致ssh连接失败,使用kubectl describe pod命令查看改命令发现有容器返回值为137,一般是系统环境原因,且一般为内存不足导致的 ...

  7. 复刻smartbits的国产网络测试工具minismb-操作技巧

    复刻smartbits的国产网络性能测试工具smartbits,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连 ...

  8. angular ng-repeat点击切换样式,浅谈track by $index

    前言 angular ng-repeat点击切换样式,ng-repeat点击切换class样式,巧用ng-repeat track by $index. 1.问题 一个ul包含多个li,li通过ng- ...

  9. es6学习笔记12--Class

    Class基本语法 概述 JavaScript语言的传统方法是通过构造函数,定义并生成新对象.下面是一个例子. function Point(x,y){ this.x = x; this.y = y; ...

  10. webpack版本兼容性问题错误总结,耽误半天学习

    今天看了掘金上的一篇文章(https://juejin.im/post/5bf61082f265da616a474b5c#comment),想搞搞webpack拆分js. 开搞 文章中用了webpac ...