池建强的公开课

讲讲咱互联网行业自己的故事

个人成长,观点,认知, 软技能

池建强 极客时间创始人、墨问西东创始人

第133期 | “老而不死”的C语言

讲述:池建强 大小:9.23MB 时长:00:09:36
00:00
1.0×

你好,这里是卖桃者说。今天和你聊聊最古老的编程语言之一——C 语言。

我们常用“生而千年不死,死而千年不倒,倒而千年不朽”的胡杨来比喻生命力顽强,在编程语言中,也有一棵胡杨,它就是即将迎来 50 岁生日的 C 语言。

近几年经常会出现批评 C 语言的声音,有观点认为 C 语言已经死了,因为它的安全性让人担忧。一项针对编程语言漏洞的研究报告显示,在过去 10 年里最常用的 7 种编程语言中,C 语言的漏洞总量最多。没有人愿意编写有漏洞的代码,软件工程师乔·伊凡斯(Jon Evans)甚至认为“C 语言已经不再适合它所构建的这个世界了”。

C 语言之所以成为漏洞榜第一名,很大程度上是因为它太老了。和榜单里的其他编程语言相比,C 语言的使用时间更长,编写的代码数量也最多,与此同时,C 语言还是主流基础设施如 OpenSSL 和 Linux 内核使用的语言之一。WhiteSource 公司认为,数量之多和集中程度之高是 C 语言中出现最多开源漏洞的原因。

但是我们不能单单因为安全性就给 C 语言判了死刑,毕竟安全无关语言,怎么使用才是最重要的。更何况,C 语言的应用实在太过广泛,它构成了今天所知的软件世界的基础,我们使用的各种操作系统和系统软件大部分都是由 C 语言实现的,这也是 C 语言在今天还活得滋润的原因。在 TIOBE 编程语言排行榜中,C 语言曾在数十年里独领风骚,即便在今天,也占据了排行榜第二的位置。不管开发人员多么讨厌它,也没办法在几年内就把它抛弃掉。

其实,最初的 C 语言是为 Unix 操作系统设计的,后来随着微型计算机不断发展,C 语言开始移植到其他环境中,并逐步成为独立的程序设计语言。C 语言之父和 Unix 之父都是丹尼斯·里奇(Dennis Ritchie)与肯·汤普森(Ken Thompson),这俩人还在 1983 年一起获得了图灵奖。为了方便,接下来我会称呼他们为里奇和汤普森。

故事还得从上世纪 60 年代末说起。1966 年,汤普森在加州大学伯克利分校教授埃尔文·波利坎普的推荐下进入贝尔实验室,次年,从哈佛大学博士毕业没多久的里奇也加入该实验室。

当时,贝尔实验室接了一个开发 Multics 系统的项目,这个项目由美国通用电气公司提供硬件设施,贝尔实验室和麻省理工学院负责开发软件。Multics 是一个多用户分时系统,在编写 Multics 时,汤普森还创造出了 Bon 编程语言。但据汤普森本人回忆,Multics 患上了糟糕的“第二系统综合征”,分时共享的理念中一次性添加了太多的新东西。1969 年,出于开发周期长、成本高等方面考虑,贝尔实验室决定退出这个项目。

项目虽然黄了,但并不是毫无收获。在开发 Multics 的时候,汤普森利用业余时间为这个操作系统写了个《星际旅行》的小游戏,这款游戏模仿了行星和月球的运动,玩家可以通过输入指令游弋太空,甚至能在行星上着陆。

《星际旅行》在计算机科学研究人员中极受欢迎,同事里奇也是这款游戏的玩家之一。退出 Multics 项目后,汤普森为了可以继续玩这个游戏,他找来里奇,俩人一起在过时的小型计算机 PDP-7 上重写游戏代码。1969 年夏天,汤普森在 PDP-7 上为这款游戏写了个操作系统,并在 BCPL 语言的基础上做了进一步简化,设计出了简洁明了的 B 语言,用来编译第一版 Unix 系统。随后,里奇也一同投入到新系统的创建中。

从一定程度上来说,汤普森和里奇这两个游戏爱好者正是在业余兴趣的带领下,开启了 Unix 时代的。说到游戏,我想起了暴雪副总裁杰夫·卡普兰(Jeff Kaplan),他也是一名游戏爱好者。在加入暴雪前,卡普兰成天宅在家里写作、打游戏,和许多年轻人一样,卡普兰在游戏中也是个戾气重的人,他不仅吐槽队友,还吐槽游戏厂商,经常在网上发表自己的观点,比如这个玩法不好,那个设计有问题等等。卡普兰的一系列吐槽引起了暴雪公司的注意,凭借对游戏设计独到的见解,他顺利成为暴雪的一员,并制作了《守望先锋》等多款热门游戏。现在的很多年轻人都爱玩游戏,但能让这个爱好发光发热,创造更大价值的人却少之又少,更多时候,玩游戏只是为了打发时间而已。所以说,能把兴趣爱好做到极致,还做出一番成就,才是真正的厉害角色。

说回正题。汤普森和里奇借鉴 Multics 的设计思路,一起在 PDP-7 上创建 Unix。多年后回忆那段往事时,里奇还感慨地说“Unix 就诞生在这样一个破的让人不敢相信的硬件上面”。其实在贝尔实验室退出 Multics 项目时,二人就曾向公司申请购买新型 PDP-10 计算机用来创建自己的分时系统,不过这个提议被管理层拒绝了。

也许是因祸得福,硬件的掣肘确保了 Unix 的精致、紧凑和简单,在 1973 年对外展示 Unix 时,里奇和汤普森这样描述道:“也许 Unix 最重要的成就在于,它表明一个强大的交互应用操作系统既不需要在设备上,也不需要在人力上花费高昂的代价,它可以在价值仅为 4 万美元的廉价硬件上运行,而且主要的系统软件只花费了两个人不到一年的时间。”

开发 Unix 时,里奇还在 B 语言的基础上设计出了 C 语言,这门新语言既保留了 BCPL 和 B 语言精练、接近硬件的优点,又克服了它们过于简单、数据无类型的缺点。C 语言和 Unix 有相同的设计理念,它们都是一种简约的工具,并依靠熟练的专业知识设计而成。

1973 年初,C 语言基本完成,里奇和汤普森用它重写了 Unix,并安装在 PDP-11 计算机上。二十世纪八十年代,Unix 成为当时最主要的操作系统,C 语言让 Unix 更容易被人接受,也更容易编程,Unix 也让 C 语言得到更广泛的传播。里奇和汤普森共同成为 C 语言之父和 Unix 之父:C 语言是里奇在汤普森的帮助下创造的,Unix 是汤普森在里奇的帮助下创造的。两个人彼此成就,汤普森甚至认为他和里奇一起工作的成果,远远超出了各自工作所做的贡献。

长久的合作得益于两人拥有相同的编程理念,那就是保持简单,这一点从他们共同创造的 Unix 和 C 语言就能看出来。里奇甚至将 Unix 的设计原则定为“保持简单和直接(Keep it simple stupid)”,也就是后来著名的 KISS 原则。汤普森则以快速、简洁和富有想象力而闻名,他的同事兼前任老板麦克罗伊评价说,“汤普森的代码读起来令人愉悦,十分简洁,很明显是经过深思熟虑,而不是靠改正缺陷得到的。”当有解决问题的好办法出现时,汤普森会从头开始编写代码,而不是去做些修修补补的工作。此外,汤普森也会尽量避免使用宏命令、图形辅助代码书写等编程捷径,他编写的代码简洁明了,甚至很少有注解。

最后,分享几个里奇给程序员们的建议:

  1. 如果你想成为擅长编写出色软件的人,你需要时刻保持好奇心;
  2. 建立更多的项目,了解更多的业务;
  3. 和你认为更专业,更有经验的人待在一起;
  4. 解决问题。

今天的话题就先聊到这儿,最后给大家留个小作业,你认为 C 语言前景如何?你还在使用 C 语言编程吗?欢迎在留言区给出你的看法。

卖桃者说,明天见。

(编辑:凌敏)