工具其实都在其次,一切慢慢都会好起来的。

作者:梁川
链接:http://www.zhihu.com/question/21017354/answer/16905837

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

没有用Python写过一行生产代码,现在用Python写快排还是二把刀的水平。本来我根本不适合回答这个问题的。不过那群组里的讨论,涉及到了很多语言的历史。我觉得可以从其他语言的角度来讲讲。早期的语言,没有那么强大的编译器,不足以做出那么多的静态检查,所以从汇编到高级语言这一步,有大量的黑客工程师下了苦功来制造工具链。他们针对高级语言的种种遐想,实际上是他们受尽了之前的语言的苦楚的产物。

肯汤普森最早趁老婆回娘家的时候写Unix原型的时候用的是汇编,对他来说当然绰绰有余,但是汇编的抽象能力不足,于是他用发明的B语言又重写了一遍。在这一步,B语言胜过汇编的就是它的优美。但是B语言是动态语言,性能很差,于是里奇加入以后,在它的基础上再发明了C语言,性能得到了很大的提升。在这一步,又是对性能考量起了很大的作用。

后来本贾尼因为剑桥念书的时候用动态语言BCPL毛骨悚然的经验,在强类型弱检查的C语言基础上发明了C++。他似乎认为足够强的语法检查就足以应付软件工程的复杂度。事实证明他错了,在大型项目上C++是个烂语言的呼声比Python不知道早了多少年。

后来有了Java。它并不是C++加上些语法糖的产物,这个我就不说了。Java能胜过C++而大行其道,就是因为它语法足够优美。事实就是,如果我们不写战斗机的火控系统,不写操作系统,我们为什么要那么在乎性能?Java火了以后,之前的Python和之后的Ruby都渐次火了起来,Web时代到来,PHP也火了起来,后来JavaScript也火了起来。这些语言都不那么看重性能,似乎现在就是一个语法优美的时代了。因为现在程序员的时间已经比机器的时间要贵重了。

那么我们来探讨几个问题:

1 性能有那么重要吗?
现在好像除了超大型互联网公司需要静态语言来省电以外,没有听说过多少因为语言速度慢而出现的软件问题。何况现在慢的程序,以后未必就慢了。可是程序员的速度,可是一直很难提起来。没有银弹啊。

2 程序规模变大以后,真的那么需要编译期的静态检查来排错吗?
无论多么严格的检查都无法阻止程序员写出垃圾来。C的检查比C++弱,但是它在TIOBE上排得比C++要靠前。里奇相信程序员能够做好自己的事情所以没有做出过多的假定,C++看起来严格遵守了很多编程范式,其实过于复杂,直到今天,C++的编译器也不能明确地解决它最复杂的内存泄露问题,这个检查有等于没有。

没有静态编译而扩展成大型工程,请看PHP。请看RoR。更不用说保罗格兰汉姆以前用Lisp曾经开过一个作坊似的公司做出了世界第一流的大型软件。这就是程序良好的风格比什么都重要的一个好例子。动态语言看起来抛弃了静态的类型检查,但是得到了灵活的类型机制,有得有失,在现在看来,是一个很好的趋势。用过动态语言再回去看某些静态类型语言,看多了眼睛流血,写多了手流血。

3 语言一定要依赖于开发工具吗?
我不知道真正的语言开发工具指的是什么。事实上除了PHP,现在各大脚本语言的开发工具都只是半斤八两,Python还是其中发展最快的了。我觉得好的语言并不应该依赖于技术体系,现在MIT里还是朝圣一样使用Lisp和emacs。emacs很好排错吗?emacs很方便部署吗?emacs很方便做性能基准测试吗?这会影响到Lisp这门语言烂不烂吗?C++倒是什么工具都有,这让它变好了吗?

工具其实都在其次,一切慢慢都会好起来的。

每一门语言的设计,都有它的权衡。到底它是设计者怎样的愿景,其实像我这样的低手是很难搞明白的。但是如果它让学生们第一印象很好,那就是一门很棒的语言,绝不会烂。

说两个就近的题外话:
1 好奇号宇宙飞船的两百五十万行的代码,大部分都是用Python生成C的方式写出来的。不知道这算不算一个超过十万行的项目?
2 MIT的计算机第一门课一直在灌输两个道理:
计算机程序是写给人看的,恰好能够运行。
软件设计其实就是对于抽象复杂度的控制。

这两个观念完全与性能、静态检查和开发工具无关。这门课许多年一直用scheme教,前两年突然换Python了。