ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

听故事学语言 · 序章:用故事讲 C 语言

听故事学语言 · 序章:用故事讲 C 语言 听故事学语言 · 序章用故事讲 C 语言《听故事学语言》系列 · C 语言篇读者对象零基础学习者。这一章没有一行代码。它讲的是一门语言的出生证明。从一个游戏说起1969 年美国贝尔实验室。一位叫肯·汤普逊Ken Thompson的工程师遇到了一件烦心事他参与的大型分时系统项目 Multics 宣告失败项目组解散。这意味着他失去了一直使用的编程环境更实际的问题是他在那台系统上写了一个游戏叫 Space Travel太空旅行现在没地方跑了。汤普逊在实验室的库房里翻找找到一台过时的、几乎无人使用的小型机 PDP-7把游戏移植了过去。游戏跑起来了但这台孤零零的机器没有像样的操作系统存取数据都很麻烦。于是汤普逊做了一件后来影响整个计算机世界的事他花了一个月为这台机器写了一个简化的操作系统。同事布莱恩·柯林汉Brian Kernighan开玩笑把这个系统命名为 Unics意思是阉割版的 Multics。这个玩笑的名字后来演化为 UNIX。UNIX一个改变了整个计算机历史的操作系统最初的动机是为了跑一个游戏。给 B 加上类型汤普逊并不满足。他使用的系统语言是 B 语言它从英国剑桥大学的 BCPL 语言简化而来而 BCPL 的前身 CPL则试图把当时所有的编程思想装进同一门语言复杂到根本无法实现。这条谱系一路向上追溯源头是 1960 年的国际委员会作品 ALGOL 60它第一次用数学化的方式严格定义了一门语言的语法是此后几乎所有语言的共同祖先。C 语言的血统就从这条线上来。B 语言有两个特点第一没有类型所有数据就是一个机器字不分整数还是字符第二它是解释执行的速度慢。在老的 PDP-7 机器上这些缺陷无所谓。但 1970 年实验室购置了新的 PDP-11 机器B 语言当场撞上了墙新机器是按字节寻址的内存的最小单位从字变成了字节而 B 语言的世界里只有字指针应当指向一个字还是一个字节运算时该跳过几个字节B 语言完全无法回答。接手解决这个问题的人是丹尼斯·里奇Dennis Ritchie。他的方案史称给 B 加上类型为数据引入大小与解读方式的概念。这门改进中的语言一度被称为 NBNew B1972 年定名C取的正是 B 的下一个字母。这里有一个值得标记的事实C 的类型系统不是学术设计的产物而是硬件逼出来的方案。今天每一个初学者都要学的变量类型int 是整数、char 是字符在 1972 年的答案分别是给计算用的字和给字节用的单位。char 这个类型就是为字节而生的。1973 年UNIX 的内核用 C 语言完成了重写。这是操作系统历史上第一次用高级语言而非汇编编写内核。从此UNIX 可以被移植到任何一台机器上只需要一个 C 编译器。操作系统的可移植时代从这一年开始。一条禁令的意外馈赠这段故事还有一个常被忽略的背景。贝尔实验室属于 ATT当时的电话垄断巨头。1956 年为了反对垄断美国政府与 ATT 达成和解ATT 因此被禁止进入计算机商业领域。这条禁令的直接后果是UNIX 和 C 在最初年代被当作电话公司的非商业副业以近乎免费的方式散发给各大学并且附带完整可读的源代码。一个旨在限制垄断的判决意外地成为了开放传播的起点。UNIX 和 C 能在七十年代的大学里生根发芽让一代学生读懂了操作系统的每一行代码这条禁令功不可没。历史的第一次反讽来得毫无痕迹。hello, world 与三个老家伙1978 年里奇与柯林汉合著了《The C Programming Language》即程序员口中的 KR。这本薄薄的书成为了 C 语言事实上的标准而全书的第一个示例程序就是那行著名的printf(hello, world\n);注意原版的细节全小写无感叹号。今天流行的 Hello, World! 是后来以讹传讹的版本。这个考据是本章送给读者的第一份礼物它说明连第一个程序的样子也是历史塑造的。三位主角的分工耐人寻味汤普逊负责造他后来还参与了 Go 语言的设计里奇负责完善沉默的学者1983 年与汤普逊同获图灵奖柯林汉负责讲出去天生的教育家。一个造得出、一个补得全、一个讲得清缺了谁C 都不会是后来的 C。2011 年 10 月里奇去世。同一周史蒂夫·乔布斯也去世了。全世界的媒体版面都在悼念乔布斯里奇的讣告几乎无人问津。当时的网络上流传着一句话后来被无数程序员引用乔布斯给了我们窗口里奇给了我们窗口下面的一切。凡是用过智能手机、电脑、路由器、汽车电子系统的人都活在他参与缔造的语言之上。从故事回到手边C 的故事讲完了一段。现在把目光拉回到学习者的手边。面前的键盘第一排字母 Q、W、E、R、T、Y。它为什么是这样排列的原因并不是这样排列打字最快。这个布局称为 QWERTY以第一排前六个键命名设计于十九世纪七十年代机械打字机的时代。流传较广的解释是这一布局用于防止机械打字机卡壳将英语中常连用的字母拆开避免相邻的金属杆高速敲击时相互缠绕。关于这段历史的具体细节史学层面尚有争论但结论是一致的它不是为打字最快设计的。值得深思的是卡壳问题早已随机械打字机一同消失这个并非最优的布局却统治了世界一百五十余年。期间并非没有人发明更合理的布局但均告失败原因在于所有人都已习惯 QWERTY没有人愿意为一个更优的方案重新学习打字。连键盘都是历史的遗留。键盘、C 语言、UNIX、打孔卡身边和远处的每一样工具都是历史的遗留。这门要学的语言也一样它的每一条语法规则都有一段出生的故事。而学习这门语言的第一步恰恰发生在这块键盘上。多数初学者尚未掌握盲打而这一步本来就应该在学习过程中完成。从下一章开始每章的代码都需要逐字键入不要复制粘贴一个字母一个字母地敲。完成前三章之后手指会自然记住每个键的位置。手指记住的不是键盘而是亲手写过的程序。熟悉键盘布局、练习打字是学习语言的必要步骤。故事之后正题之前C 诞生了但它只是回答了这门语言从哪来。还有一条更大的线索没有展开计算机原本只懂 0 和 1它是怎么一步步学会类人的表达的从打孔卡到助记符到类英语的高级语言再到今天对 AI 说一句话就能生成程序这条让计算机说人话的进化线才是理解 C 语言位置的完整地图。下一章就讲这条线。序章完。学习任务从今天起练习打字每天十五分钟坚持到第三章届时速度将成为顺手而来的副产品。参考文献本章史料经 AI 查证与人工复核主要来源如下。Ritchie, D. M.The Development of the C Language. Bell Labs / ACM History of Programming LanguagesC 起源的一手史料B 语言的局限、PDP-11 字节寻址、NB 到 C 的演变、1973 年 UNIX 内核重写。Thompson, K. Ritchie, D. M. 1983 年 ACM 图灵奖获奖记录ACM 官方。Kernighan, B. W. Ritchie, D. M.The C Programming Language, 1st ed., 1978hello, world 原版全小写无感叹号的出处。1956 年美国司法部与 ATT 和解令贝尔实验室被限制进入计算机商业领域的历史背景。QWERTY 键盘布局起源关于「防机械打字机卡杆」的流传解释与史学争议综合见相关打字机史研究结论「并非为打字最快而设计」为学界共识。Dennis Ritchie1941-2011与 Steve Jobs1955-2011逝世时间线2011 年 10 月。
返回列表