The D Programming Language 书评
此书的作者 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 书评的更多相关文章
- iOS Swift-元组tuples(The Swift Programming Language)
iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...
- iOS Swift-控制流(The Swift Programming Language)
iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...
- iOS Swift-简单值(The Swift Programming Language)
iOS Swift-简单值(The Swift Programming Language) 常量的声明:let 在不指定类型的情况下声明的类型和所初始化的类型相同. //没有指定类型,但是初始化的值为 ...
- Java Programming Language Enhancements
引用:Java Programming Language Enhancements Java Programming Language Enhancements Enhancements in Jav ...
- The Swift Programming Language 英文原版官方文档下载
The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...
- The Swift Programming Language 中文翻译版(个人翻新随时跟新)
The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...
- [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01
注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...
- 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 ...
- 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 ...
随机推荐
- elasticsearch+logstash+redis+kibana 实时分析nginx日志
1. 部署环境 2. 架构拓扑 3. nginx安装 安装在192.168.176.128服务器上 这里安装就简单粗暴了直接yum安装nginx [root@manager ~]# yum -y in ...
- Docker三剑客之Docker Machine
一.什么是Docker Machine Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:// ...
- SQLAlchemy的ORM
表关系: 表之间的关系存在三种:一对一.一对多.多对多.而SQLAlchemy中的ORM也可以模拟这三种关系.因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的,所以先来看下一对多的关 ...
- 一道JS面试题引发的血案
刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...
- rubymine debug需要安装依赖
for ruby2.x gem install ruby-debug-ide --pre gem install debase --pregem install debugger2 --pre
- docker内存和cpu调试
本地启动了一个sshd的容器服务,但该容器经常会被重启导致ssh连接失败,使用kubectl describe pod命令查看改命令发现有容器返回值为137,一般是系统环境原因,且一般为内存不足导致的 ...
- 复刻smartbits的国产网络测试工具minismb-操作技巧
复刻smartbits的国产网络性能测试工具smartbits,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此工具测试任何ip网络设备的端口吞吐率,带宽,并发连 ...
- angular ng-repeat点击切换样式,浅谈track by $index
前言 angular ng-repeat点击切换样式,ng-repeat点击切换class样式,巧用ng-repeat track by $index. 1.问题 一个ul包含多个li,li通过ng- ...
- es6学习笔记12--Class
Class基本语法 概述 JavaScript语言的传统方法是通过构造函数,定义并生成新对象.下面是一个例子. function Point(x,y){ this.x = x; this.y = y; ...
- webpack版本兼容性问题错误总结,耽误半天学习
今天看了掘金上的一篇文章(https://juejin.im/post/5bf61082f265da616a474b5c#comment),想搞搞webpack拆分js. 开搞 文章中用了webpac ...