新智元报道
来源:reddit
编辑:小匀
C是程序员之间的通用语。
自1980年代以来,C几乎影响了每一种编程语言的发展。C++、C#和Objective-C,都是C的直接继承者。
而那些精通Java、PHP、Ruby、Python或Perl的程序员,也对理解简单的C不会有什么困难。
但是C语言并不是凭空形成的,它的故事开始于英格兰,艾伦·图灵的一个老友,和一个会下跳棋的程序,为我们的故事,揭开了序幕。
开端:为教电脑下跳棋,图灵老友写下1000条指令程序
你是否听说过克里斯托弗·斯特雷奇(Christopher Strachey)?
虽然,他没有图灵那样赫赫有名,但在《计算机历史年鉴》,他称为「写完美程序的人」。
斯特雷奇出身于一个天才家族,其父在两次世界大战期间都参与了盟军的密码破解活动。
1935年,斯特雷奇进入剑桥大学国王学院就读,最初主修数学,后来转向物理学。在大学第三年时,他因神经衰弱而休学,后来进入了一家电缆公司担任物理学研究员。
1951年,斯特雷奇第一次与计算机打了交道,当时,他被介绍给英国国家物理实验室的迈克 · 伍德格。在那里,他见识到了一个庞然大物:Pilot ACE。
这是一台英国的第一代电子计算机,由英国国家物理实验室于1950年代早期设计制造。
一个坏主意跳进斯特雷奇的脑袋:如何教电脑下跳棋?
他以为这难不倒一个计算机天才,然而,结果让他失望了。
Pilot ACE 根本不具备玩跳棋所需的存储容量!
但谁也不知道,冥冥之中,上帝开了另一扇窗:斯特雷奇对此激发出的兴趣正为后来语言的形成,奠定了基础。
在当时,计算机的价值主要在于它们快速解方程的能力,斯特雷奇对它们执行逻辑任务的能力更感兴趣。
那年春天,他又发现了另一个庞然大物:安装在曼彻斯特大学的 Ferranti Mark i 计算机。
当时,阿兰 · 图灵正笑盈盈地坐在旁边写着程序员手册,他是该实验室的助理主任。这是斯特雷奇的老朋友了,他向他要了一本手册。
图灵(右)
1951年7月,斯特拉奇访问曼彻斯特,他还是对跳棋程序念念不忘。图灵建议,作为第一步,他写一个程序,使Ferranti Mark i 能够模拟自己。因为模拟器可以让程序员一步一步地了解计算机如何执行程序。
要知道,在那个年代,计算机内存和处理器周期都非常昂贵,这样的「跟踪」程序会突出显示程序造成瓶颈或运行效率低下的地方。
斯特雷奇熬了一个通宵!写了个包含一千条指令的跟踪程序。
当程序终止时,它在电脑的扬声器上播放了《上帝拯救国王》(God Save The King)。
图灵是这个程序的第一个用户,只不过,图灵无惊无险地赢了。
但是,这项由业余爱好者完成的成就,让斯特雷奇有了一份体面的工作。
他正是以此身份发现了剑桥的一个项目,该项目由三名名为David的程序员进行。
发展:贝尔实验室的2个新人,将CPL「煮干」,前身B语言诞生
三个David在1962年6月编写了一篇论文,确立了新的编程语言——CPL(剑桥编程语言Combined Programming Language),这是在ALGOL 60语言基础上发展的。
1965年,斯特雷奇离开学校,在麻省理工学院呆了几个月,回来后,他担任了牛津编程研究小组的主任。
1967年,剑桥大学对CPL语言进行了简化,于是产生了BCPL语言。其中,「B」代表「 Basic」。
可以说,BCPL 是一种「引导」语言,因为它的编译器具有自编译能力。实际上,BCPL 编译器的一小部分是用汇编或机器代码编写的,而编译器的其余部分是用 BCPL 的相应子集编写的。
用 BCPL 编写的编译器部分将输入汇编代码编写的部分,生成的编译器程序可用于编译用 BCPL 编写的任何程序。
引导编译器极大地简化了将语言从一台计算机或操作系统移植到另一台计算机或操作系统的过程。只有在特定于该计算机的代码中编写的编译器的相对较小的部分更改,编译器就能够在另一台计算机上运行。
那是GET“ libhdr” LET start()= VALOF {FOR i = 1 TO 5 DO writef(“ fact(%n)=%i4 * n”,i,fact(i))结果0} AND fact(n)= n = 0-> 1,n * fact(n-1)
因为工作上的往来,理查兹与贝尔实验室建立了联系。另一个重要人物出现了,他就是后来的肯·汤普逊,黑客文化圈子通常称他为「ken」,后来的图灵奖获得者,Unix的发明人之一。
汤普逊找到一台老式PDP-7机器,但即使按照那个时代的标准,它也不是特别强大。尽管如此,汤普森还是能够在那台机器上运行第一个版本的 Unix。
PDP-7有8,192个byte的内存,使用了第一个4 k,为运行程序留下了4 k的空间。
汤普逊将BCPL的拷贝进行了进一步压缩,使其能够适应 PDP-7上可用的4k 内存。在这个过程中,他借用了他在加州大学伯克利分校读书时学过的一门语言。这种语言叫「 SMALGOL」, ALGOL 60语言的一个子集,设计用于在功能较弱的计算机上运行。
汤普森最终证明,在 PDP-7上使用的语言,是「具有大量 SMALGOL 语法的 BCPL 语义」 ,意思是它看起来像 SMALGOL,但工作起来也像 BCPL。而且,
由于这种新的语言只包括汤普森认为最有用的 BCPL 的各个方面,而且可以适合于相当狭窄的 PDP-7。
汤普森为它起了一个有趣的名字「B语言」。意思是将CPL语言煮干,提炼出它的精华。并且他用B语言写了第一个UNIX操作系统。
高潮:C诞生,「Unix之父」喜提图灵奖
而在1973年,B语言也给人「煮」了一下。
美国贝尔实验室的丹尼斯 · 里奇在B中添加了「输入」变量的能力。
由于 PDP-7有一个由18位单词组成的内存,B可以通过将每个变量视为内存中的一个单词或按照其在系统内存中的位置引用的一系列单词来进行简化。没有定点或浮点小数、整数或字符串。
坐:肯·汤姆逊;站:丹尼斯·里奇
这种方法在内存很少、用户数量很少的机器上很是奏效,但在更复杂的系统、程序和很多用户上,这可能导致低效的内存。
它被安装在默里山计算中心的大型机上,整个贝尔实验室的用户都可以使用它。
就这样,美国贝尔实验室的丹尼斯 · 里奇在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
而后,我们也普遍认为,C语言诞生于贝尔实验室。
而丹尼斯 · 里奇也被认为是真正C语言的缔造者,被称为「C语言之父」。
可以说,在1980年代,有Unix系统的地方必有C语言在编译,而有C语言的地方必然装着Unix。
1983年,汤姆逊和里奇由于Unix操作系统,共同获得了图灵奖。
无处不在的C,化身350万行代码飞向火星
为了使UNIX操作系统推广,1977年丹尼斯·里奇发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
后来由美国国家标准协会(American National Standards Institute)在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。
1988年,随着微型计算机的日益普及, C语言出现了许多版本。
由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言标准3.C语言的主要特点。
C对世界的贡献是无法估量的。
刚刚登上火星盖尔陨石坑的好奇号探测车,上面至少有350万行代码是用C语言写的。
而
像C++、java这些当今流行的语言,则 都是C的衍生语言;还有 Windows、MacOS、Linux,这些主流操作系统,都曾经或仍然以C语言作为开发语言。
2000年下半年,汤普逊离开贝尔实验室,后来在2006年谷歌,开始开发Go语言至今仍在工作。而丹尼斯·里奇则跟着贝尔实验室,从AT&T,到朗讯科技,直到2007年退休。
2011年10月12日,丹尼斯·里奇在新泽西州的家中去世。
这里还有一个有趣的插曲:
有一次,一个程序员问里奇: 一个程序员从新手成长为精通C语言的开发者,并能写出优秀的代码,据您的经验需要多长时间?
他回答:我不知道,我不需要学习C语言。
C语言是他创造的,当然,他不用学习了。
参考链接:
https://arstechnica.com/features/2020/12/a-damn-stupid-thing-to-do-the-origins-of-c/