脚本之力
——《精通Perl》书评
文/假洋鬼子
说点什么呢,说点关于语言的事吧。空气中已经弥满了火药味,但这不是战争,这是节日带来的欢庆气氛,央视的大楼也被点着了,更使这节日的气氛中平添了一点黑色幽默。索绪尔,一百年前,在日内瓦的大学课堂上,提出了他的语言能指理论,据后来人讲,索绪尔是个独来独往、郁郁寡欢的人,他一天到晚沉思语言学问题,却没时间把自己的想法写成书。在他死后,他的学生整理出版了那本著名的《普通语言学教程》。他认为语言不是事物的命名集合。它们是符号,符号的能指,代表了符号可能具有的意义,它们通常是随意的。在法国是arbor,在英国可能是tree,虽然它们的所指都是树。那是一个战火纷飞的年代,中国的外交家们正忙着签订一个又一个不平等条约,列宁坐上一辆从芬兰开出的火车,到达彼得堡,苏维埃革命就成功了,一切反革命都被枪毙。肺病流行,那时还是不治之症。当然,我的文章不是讨论列宁的,也不是讨论央视大楼的。索绪尔最后死于肺癌,年仅56岁。在另外一场战争之后,申农发表了他的论文《通讯的数学理论》与《噪声下的通讯》,这两篇文字被视为信息学的开端。申农定义了信息量,并且讨论了通讯的效率问题。令人有些惊讶的是,如果我们把信息源看成所指,而把成功传递的信息看成能指,那么能指与所指的差异,与通讯的效率将非常相似。故事没有完,1950年代,Fortran 之父巴克斯,和冯诺依曼发生了一个争论,这争论因常被当成名人轶事传播,而忽略了它所具有的深刻意义。即是否需要设计出一种接近人类的程序语言。争论的结果,我们都知道,这一次上帝没有站在天才的冯诺依曼一边,巴克斯是正确的。Fortran非常成功,而这以后,又产生了形形色色的接近人类的程序语言,比如Basic,比如Lisp。巴克斯应该获得更多的声誉,因为他提出了计算机科学至关重要的问题,就像申农的通讯理论和图灵机模型一样,如果我们的程序都是汇编写的,那么计算机系统软件的构成,就有些像只有单细胞生物的地球了。
不过在1970年以后,事情又发生了变化,不能说冯诺依曼完全失败,天才毕竟是天才,C/C++的巨大成功,似乎使我们相信只有面向机器(C的指针是对内存的映射),才能成为真正的万能语言。这么说,世界真的是平的了。接着是另外一个万能语言Java。伟大的巴克斯,在发明Fortran 之后,致力于函数式语言研究,并在1977年图灵奖获奖发言中,阐述了BNF范式,在理论上梳理了程序语言语法范式,他一生都在摸索理想的计算机语言。
后来Perl 出现了,这是一个叫Larry Wall的语言学家兼系统管理员发明的,很难说他的哪个身份起到了决定性作用,在Perl里面你可以发现这样的句子:@x=1..11; 这是将一组数读到一个数组里,一点都不面向机器,与C的指针式思维不同,与繁文缛节的Java也不相同。后来又有了Python,这是一个要求左对齐的语言,看上去有些怪异,但这怪异也隐示了思想,我倒不以为面向对象是Python的主要特色。松本行弘,Ruby的发明者,在他的《代码如散文》一文中,特别谈到了语言的冗余。或许这些,都不能说明什么,最近Perl 6准备增加一个Say 语句,(不是print!),如果这样的话,我们中国程序员就应该需要:说(),或者打印()这样的语句。难道这只是关涉到一些小特性?即便后来有了Python、Ruby,我以为Perl的出现,仍具有着里程碑的意义,它让我们再次反思,回到巴克斯,回到申农,甚至回到索绪尔。
博文视点最近出了一本书《精通Perl》(从O’Reilly引进),作者是一位老练的程序员,如果你想体会一下脚本语言的威力,这正好是个机会。如果你确实想成为Perl 的大师,则要亲自动手实践,实践是最重要的。但是,但是,我突然发现我走题了,我应该谈谈列宁和央视大楼着火的事,只好下次了。
发表自《程序员》杂志,2009年第4期
“创业&升职”,请看《走出软件作坊》;
“求职&面试”,请看《编程之美——微软技术面试心得》