在准备对Brian W. Kernighan的访谈时,发现一篇很有意思的旧访谈,其中谈程序设计语言的部分尤有启发性,于是节译如下。

问:很多人都是因那本C语言的书而知道你,所以我自然想问几个关于C语言的问题啦。C无疑是影响深远,你觉得C语言中最有价值的是哪些特性呢?

**答:**C是我所见过的能力与表现力的最佳平衡。我们能够以相对直观的编程方式使用它完成几乎一切任务,同时拥有明晰的心智模型来掌握机器正在做什么。我们可以合理地预测程序运行的速度、理解运行的状况,并完全自由地编程实现所有事情。C不会约束你的实现方法,也不会强迫你使用特定的编程风格。另一方面,C没有提供数之不尽的工具,也没有庞大的库。不过,要不太费力地能把事情做好,我是至今为止都还没见到比它更好的工具。诚然,其他语言会擅于完成某些应用,但如果被流放到荒岛上,只给我一个编译器的话,我希望那是C编译器。

问:其实C也是我最喜欢的编程语言,我用C写了大量程序。但坦白说,自从开始为C语言编写编译器,我就没那么喜欢它了,因为有些东西非常难以优化。能不能跟我们说一下,从你的角度看,哪些是C里面比较差的特性呢?

答:我不认为有哪些是“比较差的”。要知道,C语言完全是Dennis Ritchie的作品,而我仅仅是推广者,更加无法说得出C里面哪些是容易或难以编译的。C里面有些无伤大雅的小错误:switch的语法还有改进的空间、某些操作符的优先级有误,不过那些都是无关紧要的,大家完全能习以为常。我觉得C里面真正算得上问题的是它并没有提供足够的机制来让用户规划真正大型的程序,或者让用户在程序中创建“防火墙”以保持各部分的独立。我不是说用户无法用C来做这些事情,只是无法像面向对象编程那样做。我们还是可以模拟这样的做法,只不过编译器、C语言本身不起任何作用而已。但是,要知道这是30年前发明的语言(译注:采访于2000年),那时候的机器跟现在的相比是小巫见大巫的。C真可谓久经考验,是令人叹为观止的作品,我也无法再挑剔其他地方了。

有时候,我还真的用C++而不是C来写程序。基本上,我认为C++是一门庞大的语言,尽管它的几乎每一个特性都算得上有的放矢。要是我写C程序的话,不管程序规模大小,我最终很可能都会用到75%、80%甚至90%的语言特性。换句话说,C语言的大部分特性在几乎所有类型的程序中都是常用的。然而,如果写的是C++程序,很可能我都用不到语言中的10%特性,而另外那90%的特性我真的不是太懂。在这种意义上,我会认为C++过于庞大了,不过C++确实提供了在编写大型程序时需要的东西:用户可以创建对象、可以保护数据的内部表现而让其他人无法看到“门后的秘密”。C++拥有大量很有用的机制,而这些是C所没有提供的。

问:在研究语言设计的时候,我有个疑问。很有趣的事实是,Java被极度夸大了,开发社区因语言中的优缺点而划出楚河汉界。这门语言本身确实因领域专家的提议而拥有一些很好的特性(例如垃圾收集),而专家们也指出了它的一些不足(例如数组不应该是协变的)。对当今的编程语言,其实都有整套的研究结果;对函数式编程语言,也出现了非常有意思的研究。不过,我们看到这些研究并没有对现实世界起到任何影响,也就是说,人们并不会将这些结果应用在实际的语言设计中。相反,各种特定语言如Perl或Python之类的纷纷出现。你觉得问题在哪里呢?

答:很不幸,这是个非常好的问题。在贝尔实验室,大力支持函数式编程语言和大量使用特定功效的语言的群体之间有过很多讨论。坦白说,我真的不知道为什么函数式语言没有成功。我们就说ML语言吧,它可能是两种语言的最佳结合,照理说是最应该成功的:尽管它是设计得非常优秀的语言,经过众多高手的深思熟虑,并吸收了编辑器技术的大量新进展,但看来也没有得到广泛的应用。我觉得大家唯一使用ML的机会就是编写ML编译器了。这样说可能太武断,很可能还冒犯了我的那些朋友们。(笑)

我有点言过其实了,但确实有那么点意思,而原因我真的不知道。从自己的角度出发,我觉得各种函数式编程语言、特别是ML没有能被广泛采用的部分原因,在于它们的目标用户是有数学严密性的、能以抽象方式思考的,除外的其他人,包括我自己,用起来都有点困难。反之,像C这样的语言是操作性很强的,用户可以非常直观地把程序中的每一部分对应到机器的运行情况。如果是在不同的时空下成长,那我说不定会对ML如鱼得水,而觉得C不太安全、有点危险、表达力也不足。总之,我的感觉是,函数式语言来自于更偏向数学化的社区,要求一系列相应的逻辑数学能力,而这样对普通人来说是有点困难了。

问:我猜,对那些研究者而言,你的建议是不是放下语言的层次之争,而设法提升优良品质呢?

答:我前面并没有回答你那问题的另一部分:为何对语言的研究并没有起到应有的效果。我认为它其实在诸如语法分析器技术、代码生成等方向是有效果的。对所有的语言,这些研究在建立语言工具方面都影响巨大,而对语言本身的设计的影响则会小一些。

成功的语言都很注重实效,常常还有点不择手段,因为它们试图解决的是实际问题。要说有严重缺陷的语言,C++可算很好的示例。其中一个缺陷就是它不顾一切地要跟C兼容:在对象层面要兼容、在源代码层面也要密切兼容。因此,语言中就会有些很别扭的地方:古怪的句法问题、异常的语义行为等。在某种意义上这是不好的,没有人想这样做。但是,C++成功的其中一个原因恰好就是与C的兼容性:可以使用C的库、现成的C程序员群体都懂得用C++,因此大家都会来使用,而且是不需要重新学习开发的新方法就能高效地使用。ML就不是这样,它几乎在同一时间、同一地点完成,但却以完全不同的视角看待世界。作为注重实效的产物,C++非常成功,但也因要与已有语言兼容而付出了相当代价。


相关阅读:

“图灵访谈”系列的更多精彩内容