[翻译]C的影响力

(译者注:这是非常好的一篇短文,是我见过的论述C语言影响力最好的文章,特此翻译过来,和大家一起分享。同时也作为我写的书中第一章的一部分。 原文见:http://ripplingbrainwaves.blogspot.com/2007/07/c-reflections.html

[做人要厚道,转载请指明出处!]

C在我的记忆中占据着重要的地位,因为它是我学过的真正通用而且具有专业扩展性的语言之一。我被一些人的想法吓到了,他们说希望学习计算机编程的诫条和技巧,但除了C的名气外却对它一无所知。

让那种想法变得吓人的原因是C持续增长的至关重要性。就像人类历史是当前文明和文化成型的看不见但又普遍的因素一样,C(尤其是用C/C++写的软件)是当前软件开发生态系统中看不见但又普遍的内在因素。给我一个操作系统,编译器,集成开发环境,Java虚拟机,设备驱动程序,我会给你指出C的影响力。

C的集中性和有效性直接来自于它的这种能力——不仅能那么紧密地映射到执行它的机器,而且能让程序员从极痛苦的实际硬件(寄存器,内存分段,字节序,操作码)的细节中抽象出来。实际上,C/C++编译器在弥补这个缺口上已经变得非常成熟了,一个不专业的程序员尝试自己去做这些甚至会降低优化的水平。我知道C的替代品已经出来了(通常和C差别并不大),但C自身的成功看起来已经把它固定为其生境中默认的选择了。

然而,用C/C++做实际的工作经常要当心机器结构和问题领域结构之间的平衡。考虑到“我需要密切地贴近机器工作”,因此选择C/C++;或者,考虑到“啊,把全部这些步骤都写出来太气人了”,因此逃离标准库或者众多其它的库中的一个,这都不需要花多长时间。我很惊讶,完善的内置字符串支持究竟缺乏到何种程度才导致某种用途的C的替代语言崛起。还有,缺乏成熟的内置数据结构,比如链表和映射,它们应该太广泛了,以至于不该提起。我陷入丢失堆栈跟踪,因为一些未捕捉的异常,甚至一些异常抛出。一些库或工具包为程序员提供了如此全面的函数和宏的封装,以至于感觉结果好像是一种方言(智能指针?向量?),这并不让人惊讶。

自然而然,折衷就是任何给定的程序中都不要使用这些外部的库或者语言特性,开销和复杂度也不是强制性的。而且,使用把程序员和机器联系起来的一种语言在某些方面是令人满意的。这种语言有大量的根据证明程序是为计算机,不是“理论的图灵机”,而写的:指针——只不过是有组织的一组变量单元的结构体,引用内存地址而不是对象的变量,以多种方式解释内存内容的能力,作弄内存的void*函数。它当然可能诡异,而且有时甚至很容易导致错误,但是“无用信息输入,无用信息输出”的原则始终适用。很多人在这方面比我更有经验,更熟练。

对我来说,C是象征性的编程语言,因为它巧妙地连接了人类思想和机器计算。那些能编写高效C代码的人也是能跨越两个领域的人。过分尝试让C代码更像人类思维,程序就可能会运行很糟糕。过分尝试为机器而裁减C代码,程序就可能变成难以扩展的,魔鬼般地神秘的一团。去学C/C++吧!人们喜欢说Lisp是如何激发灵感的。思想和机器在C代码中的混合可能会产生相似的灵感。至少,你可能会更加感激编译器/解释器实际上在为你做的工作。如果没有别的,只有读通C/C++的能力也是务实的,因为它仍然存活在企业和遗留的代码中。C/C++在开源世界中碰巧也是非常重要的,多亏了gcc这个东西,你可能听说过它(在我使用Gentoo的时候,gcc可能是CPU周期的最大消耗者)。