谈谈编程语言(一)

  

        标题加个(一)是因为可能还有(二),可能。

        外行人恐怕是很难理解程序员们因为编程语言(programming language)而引发的战争(Linus Torvalds炮轰C++是一种糟糕的语言;Paul Graham则认为使用Java的公司不足为惧) 。夸张点的说,有两个人的地方就有政治,有两个程序员的地方就有关于编程语言的争论。我在这儿真真切切发表的纯粹是个人意见,主观看法与客观事实不完全挂钩,因此有什么看法可以交流交流,切勿争论……


 

        C:我觉得C语言的设计是精良的。对机器的抽象恰到好处,又没有什么多余的部分。C非常适合用于设计操作系统,Ken Thompson和Linus Torvalds已经证明了这一点。不过C的现状是被绝大部分(中国的)学校用来作为新程序员蛋子的入门语言,我认为非常不合适。一般来说一个对计算机一无所知的新手能够顺利的接受指针(pointer)的概念吗?我的意见与MIT以前的做法一样,Scheme是个再合适不过的选择,我认为这门语言非常能够让新手们专注于用编程来解决问题,而不是记得在每一条语句后面加个分号。不过MIT最近把训练新手的任务交给了Python,至少比C好。


 

        C++:这东西虽然够强大但很难用好,大多数人(可能除了Scott Meyers)没什么意见吧……我写过的代码中有不少C++的,虽然引用(reference)和能在任何地方定义变量(i不用在循环外定义)确实给我带来不少方便,不过我认为STL给了我更多的便利(有位大哥认为C++如此流行的原因是因为能用//来注释,我跟他可不一样)。C++非常庞大,机制越多,出错的机会也就越多。举个例子

        c = a + b;

        如果在C语言里看到这句话,那么我心里是很有数的,要是这里出错了,无非是溢出了或者类型不太对。如果是C++呢?要考虑的东西可能包括:

        一、ab是自定义类型还是内建类型?

        二、如果是自定义类型,那么重载的+正确定义了吗?会不会抛出异常?

        三、c又是什么?

        四、复制赋值函数正确定义了吗?会不会抛出异常?

        五、有没有发生隐蔽的类型转换?

        六、等等等等

        当然,Scott Meyers会用两本书来告诉你世界上有许许多多C++的高手会妥善地处理好这些问题,我想说的是,对付这些问题难道不会分散程序员的精力吗?C++在抽象性以及提高程序员效率这些方面真的比C高出好几个数量级吗?


 

        Java:所谓树大招风,本人对于Java这棵超级大树的了解是——几乎为零。是的我从来就没有(主动地)用Java写过一行代码,主要原因是我根本就不会,次要原因是我根本就不打算会。而根本不打算会的主要原因是,用Java写个hello world居然要写这么多代码:

public class Hello {

    public static void main(String[] args) {

        System.out.println("Hello, world!");

    }

}


 

        我勒个去,如果随便干点什么都要建个类,真是折煞我也。另外一个原因是,Java对我来说实在不是很有趣,没什么吸引力。不过对于这个热门语言,Joel Spolsky和Paul Graham都有犀利得多的看法。如果这篇文章有(二),我不介意继续谈谈这棵我不懂的大树,因为它实在够大。


 

        Python:现在公认的看法是:程序员的时间比CPU的时间宝贵得多。我想如今大部分的应用都不会对程序的效率达到苛求的地步。这种时候人们应该更看重编程语言对于程序员的效率的影响,而不是CPU的。毫无疑问,我认为用Python能大大提高我的效率,大部分情况下对于程序运行时间是0.001毫秒还是0.1秒,我可不关心。Python的优点还包括不用干什么都建个类,连main都不需要,以及只要我愿意,变量a可以先等于100然后再等于"foobar"用Python编程的时候我感到轻松而好玩~


 

        Scheme:我目前没认为Scheme有什么明显的缺点,而Paul Graham对它的描述是“优雅,但呆板”。优雅?呆板?我确实承认,接触Scheme之前我没见这么优雅的代码,不过可能一个人的脑子灵活到一定程度才会觉得Scheme呆板吧,我还没到那个程度,这也许是个遗憾。在《计算机程序的构造和解释》里我看到的代码给我更多的感觉是“震撼”,居然有这么小的内核,居然有这么干净的代码,居然有抽象级别这么高的语言,居然有组合能力这么强的函数……我始终认为如果一个程序员一辈子都泡在命令式语言(imperative programming)的世界里,每天为了变量的状态而纠结,却完全不知道程序设计的另一个世界,实在是一个莫大的遗憾。


 

        再次声明本文纯属个人喜好……

 

——TT

你可能感兴趣的:(Programming,Language)