从“编码”(コーディング)到“编程”(プログラミング),这个名词的小小改变,其实凝结了人类的许多智慧和心血。而这其中最重要的大发明,就是程序语言。人类擅长的是用语言交流,所以发明了各种各样的语言,这么一来人类就可以用自己熟悉的语言来编写程序,而不必直接去编写只有机器才能识别和执行的代码了。

编程语言发展到今天,已经经历了好几代,从种类上看更是有数千之众。这些语言当然不可能都为着同样的目标而被设计出来,所以它们之间的差异还是非常大的。这些差异性体现在诸多方面,语法的差异非常显著,而相似的语法背后的语义差异则更是无形而且微妙。如果考虑到语言的运行环境、应用领域,还有语言之上建立的方法论,更是让人感觉:难道在程序语言这个完全由人类创造的领域,也要出现像自然语言一样的,把程序员分成无数宗派甚至族群的“巴别塔”了吗?

其实不然,程序语言毕竟是工程学产物,它的发展其实是有着统一的计算模型作为背景的,因而可以视为一种“约束下的发展成果”。计算模型落实为实际计算机的体系结构,种类并没有很多。因此,建构在其上的程序语言,由于最终还是要落实为在这些体系结构之上执行的代码,结构和实现上不会完全失控。但话说回来,要写作一本关于程序语言的通识读本,能够在一本书里讲清楚程序语言的共性,并能够指导具体语言的学习,这件事还是很困难的。很容易就会写成建立在编译原理基础之上的大部头,这么一来对读者的要求就非常高了。还容易写成各种语言混在一起的大杂烩,把读者搞得晕头转向。更何况,如果真拿具体的语言来讲,现在的语言版本更新迭代速度很快,写成的书很快就过时了。

但是本书就很不一样,它抓的点非常好,是一些通用但是不会过时的点。这些点从程序结构来说,包括了名字和作用域(哪种语言会没有名字和作用域呢?)、函数、类型、异常处理;在库的方面,讨论了字符串和容器;从运行环境来说,讨论了并行处理;从方法论的角度,讨论了至今仍然是主流的OOP和类继承。每个主题都是既深入浅出,不停留在概念层面,又点到即止,避免纠缠技术细节,显示了日本工业界务实而又认真的做事态度,以及不俗的技术实力和表达能力。

我尤其喜欢第一章提出的两种程序语言的学习思路:在比较中学习,在历史中学习。从每种语言的独特语法结构中,我们能够体会到这种语言针对的特定问题领域的难点和特色,这也引导着我们提出新的问题,或者在不同领域的问题之间建立关联。而从那些从属于不同时代语言的代际比较,我们更可以同时体会到早期语言的强大和不足之处,以及新生语言做了哪些取舍(一定有舍,不可能只有改进,因为结果是一样的)来向哪些方面做了妥协。其实在学习自然语言的时候,这两个办法也是非常管用的,只是学习多种程序语言的人比学习多种自然语言的人要多得多而已。一开篇就开宗明义地提出语言学习方法,这也决定了本书的高度。

总之,本书是一部非常好的程序语言通识读本,向所有同行推荐。