更新 (2020/03/22):

时隔两年,学习了更多编程语言领域的知识之后,对本书的认识也有了一定的转变:覆盖面很广,一路从语言设计,编程范式讲解到编译器实现;不过正如标题“Pragmatics”所指,本书侧重在语用学,关注实际语言特性的分析、运用与实现,对语法学也有一定涉及,但是对语义学涉及甚少。不过对于非编程语言领域的程序员来说,语用学的知识正是最需要,收益最大的部分。


本来是想写一篇对Scott的Programming Language Pragmatics第三版的书评,发表在豆瓣上。写着写着夹杂了很多对于为什么要了解编程语言的设计与实现的一点想法,也好。


这不是一本讲某种具体编程语言的书,看完也不会对你的编程能力有什么立竿见影的提效,但是这仍然是一本所有程序员都值得一看的书。

编程语言不仅仅是程序员与电脑之间沟通的媒介,它同时也是程序员对真实世界问题建模的工具。不同的编程语言提供了不同的思考方式来解决真实世界问题,而这个世界的复杂性决定了我们往往需要不同的思维方式来解决不同类型的问题,这也是如此种类繁多的编程语言得以被开发和运用的原因。这意味着作为一名程序员,我们不仅仅需要具备快速学习和合理运用多种不同风格的编程语言的能力,还应具备在必要的时候开发专用的领域语言来解决特定问题的能力。

这本书正提供了培养这两方面能力的必备知识。通过对一系列语言设计的核心要素(命名与作用域,控制流,类型,控制抽象,数据抽象与面向对象)的讨论,辅之以各种具体编程语言的实例,本书不仅从高视角揭示了编程语言运作的基本原理,同时也以低视角深入具体编程语言的种种设计选择背后的取舍。通过对各类编程范式(过程式,面向对象式,函数式,逻辑式,以及脚本语言和并发编程)的概览,本书阐明了各种范式在对问题建模时的不同思路和由此带来的语言特性上的差异与解决问题效率上的不同。由此,读者将加深对已经学会的编程语言的认识,并学习到合理选择不同的编程语言及和相应的语言特性来解决实际问题的能力,在需要学习一门新的语言时也能更快更从容地学习。除此之外,本书还提供了对语言实现细节(编译原理及运行时系统)的详细介绍,提供了开发专用的领域语言的必要知识之余也有助于从底层实现角度加深读者对语言特性的理解。

纵然世间的编程语言种类繁杂,各具特点,然而其底层的设计原理是相通的。它们间的不同除了来自于设计者的能力限制之外,更多的来自于因设计目标的不同而导致的对问题的思考方式不同和在性能与语言表达能力间的取舍。而这本书正提供了对不同编程语言设计与实现上同与异的详细论述,进而帮助程序员们从一个更高的视角认识手中的工具,用好手中的工具,乃至开发一个新的工具来更好的解决问题。在近来编程语言逐渐变得多范式融合(Scala试图融合面向对象式和函数式,Java等主流语言纷纷引入函数式特性,语言的并发特性也得到不断重视)以更好地解决生产实际中的复杂问题的背景下,这样的能力显得愈发重要。

当然,这本书只是在编程语言设计与实现上开了个头,更深入的对语言设计理论及编译原理的讨论还需要阅读其他更深入的教材。

最后是一些关于阅读本书的建议:首先,最好在掌握一门高级编程语言(如Java),并对其他编程范式和操作系统基本原理有一定了解的基础上阅读本书。其次,由于本书的内容颇为繁杂,在阅读时可以有一定的取舍,比如可以先只关注语言设计的部分而适当忽略语言实现的部分。