以C的精神
Greg Colvin
6,21, 2004
翻译:小刀人
摘要:
富有经验的开发者Greg Colvin以更好的未来为视角回溯了C, C++ 和Java的发展历程。
正文:
是否在何种意义上C, C++, 和Java可以共用同一精神来描述?从最表面的层次上,它们看起来是相似的。举个例子,下面的代码片断,如果放入一个适合的上下文中,在所有这3种语言中它们都将用Euclid算法计算最大公约数
int gcd(int m, int n) {
while( m > 0 ) {
if( n > m ) {
int t = m; m = n; n = t;
}
m -= n;
}
return n;
}
但是当我们谈共享同一精神时我们就要谈它们的一些本质上的共同点,超出纯粹的语法。在研究那些本质时,让我们先来看看第一个ANSI C标准的理论基础:
保持这个委员会的主要目标是保护C 的传统精神。C的精神有很多方面,但是其本质是一个委员会关于C语言基于的根本原则的观点。关于C的精神的一些方面可以被概述成短句如下:
相信程序员。
不要阻止程序员做那些需要去做的。
保持语言短小精干。
一种方法做一个操作。
使得它运行的够快,尽管它并不能保证将是轻便的。
最后一句箴言需要一点解释。潜在的高效率的代码生成是C最为重要的力量。为帮助确保没有代码爆炸发生在它们看起来是一个非常简单的操作上,一些操作被解释成目标机器的硬件如何做它而不是以一个常规的抽象规则。
在很多方面B程序设计语言是这个精神的真切的化身,和其以后的发展可以被视为在上面这5个方面中的交替。更多的是后者。
“20年的学校教育并且他们让你日复一日地工作” (Bob Dylan)
首先说说我自己和C的一段恋爱史。回到1983年,作为一个刚刚获得学位的心理学博士,我加入了我的导师Peter Ossorio的人工智能的研究。我被安排做语言分析,但是当到那里后我很快就明白了最需要做的工作是编程。公司有一个合同要交付一个运行于当时最新的VAX计算机的文本分析和检索系统,并且只有一个用FORTRAN编写的原型系统。并且不是那时能被VMS编译器接受的这个相当标准的FORTRAN,而是一个更老的,并大量扩展的方言不再被支持。我们的常驻数学家,正当我在对原型代码进行纠错时,他进来了,坚决地说是用C来重编这个软件的时候了。“为什么用C?”我问。“因为”,他仍然简洁地说,并给我一个Kernigan & Ritchie的拷贝。
我们当时太穷了而不能再租借一台VAX,因此我们不得不共享一台PC克隆机。它有128K的内存和两个320K的硬盘,一个装着Lattice C编译器和库,另一个装着所有我们的代码,它无论如何得运行在64K内存下,因为MSDOS要用掉另外64K。现在回想起来当时的8088的CPU时钟频率是令人捧腹的4.77MHz。现在回头看看就很清楚了除了一个小而简单的语言没有什么可以在那样的环境下工作。因此,用手里的K&R和硬盘中的C编译器,我们开始了工作。当我不费力气地实现我的矩阵代数代码(真正的程序员可以用任何语言写出FORTRAN)并且我们数学家将他的模式匹配理论变成递归集的密集指针算法时,C的重要能力很快变得明显。C的高效这时已变得非常突出,因为我们所有的代码与存储器的协调和运行速度之快超过了我们所有可能的期望。当我们对我们已有了正确的代码有信心时,我们计划借用附近大学的VAX用两周的时间来移植到VMS。它只化了两天时间,并只有两个bug,原因是我认为int只能有16位。我在那个大学计算机中心第二天快结束的时候,我想起来当时有个学生打量着我的肩膀说:“这是什么?”“C 代码,”我说。“什么是C?”他问。“轻便的结构汇编语言,”我说。“这正是这个世界所需要的,”他说,而我当时也不能肯定他是认真的还是讽刺。但是我已爱上了C,并且义无反顾。
需要是母(佚名)
那么称作C的这个不平凡的工具来自何处?在1969年Ken Thompson与Dennis Ritchie, Doug McIlroy和其他人开始为建立于他的PDP-7的Unix操作系统写一个FORTRAN编译器,正如Ritchie 所述:
正如我回想的,用Fortran 的念头持续了一个星期。取而代之的是他所制造的全新语言B的一个定义和一个编译器。B受到BCPL语言的很多影响,其他的影响是Thompson对斯巴达式语法的体验,并且编译器很适合非常小的空间运行。
像BCPL一样,B 是一个无类型语言有着丰富的各种操作于机器字,它可以有整数,位模式,字符,数据地址,和函数地址。我们可以很容易地将最大公约数的例子改写为B代码:
gcd(m, n) {
while( m > 0 ) {
if( n > m ) {
auto t = m; m = n; n = t;
}
m = m - n;
}
return n;
}
B是如何很好地体现这个精神的呢?几乎完美的,以我的观点。“相信程序员”和“不要阻止程序员做那些需要做的事”是一个无类型语言的明显特征。一个8千字节的空间限制和Thompson的斯巴达体验共同造就了“保持语言小而简单”—auto说明符正是仅有的语法cruft。用那么少的语法人们甚至幸运地找到“一种方法做一个操作”,并且只通过操作本地机器的字,对于一个快速执行这里没有障碍。
那么既然B(语言)是正好是来自天堂的,还有什么可以发展的呢?