此书的作者 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. Python语法基础练习

  2. 【sping揭秘】10、SpringIOC容器扩展

    关于component-scan操作(去除,失效) 这个spring中的配置项,可以扫描我们对应的包下面的类,自动把带上@component,@service,@controller, @reposi ...

  3. POJ 2876

    #include<iostream> #include<string> using namespace std; ]; int main() { //freopen(" ...

  4. Oracle 扩展表空间大小的几种方式

    环境:windows操作系统 增加表空间大小的四种方法Meathod1:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRO ...

  5. Entity framework 预热

    Entity framework  预热 对于在应用程序中定义的每个DbContext类型,在首次使用时,Entity Framework都会根据数据库中的信息在内存生成一个映射视图(mapping ...

  6. mysql基础知识(2)

    十 一.计算字段 计算字段通常需要使用 AS 来取别名,否则输出的时候字段名为计算表达式 select col1*col2 as col12 from mytable concat() 用于连接两个字 ...

  7. 在vue中使用vuex 一个简单的实例

    1.安装vuex:npm install vuex --save 2.在main.js文件中引入vuex (请忽略其它代码) 3.建一个vuex文件夹,然后在建一个store.js(这两个文件名字可以 ...

  8. 跌跌撞撞的看完了《jquery技术内幕》

    今年2月20日买的书,今天是5月26,三个月来,除了周末休息一天,如果没有特殊情况,我都会每晚花两个小时看这本书,以及查各种与jquery源码相关的资料.今天总算是跌跌撞撞的看完了,有点小激动,也有点 ...

  9. 23-hadoop-hive的DDL和DML操作

    跟mysql类似, hive也有 DDL, 和 DML操作 数据类型: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ ...

  10. Nginx性能优化功能- Gzip压缩(大幅度提高页面加载速度)

    Nginx开启Gzip压缩功能, 可以使网站的css.js .xml.html 文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能!  Web网站上的图片,视频等其它多媒体文件以及大文件,因 ...