【C语言拾遗】从“打游戏”到“统治底层”:一文搞懂 C 语言的前世今生
前言很多刚接触 C 语言的小伙伴往往第一天就被printf、scanf和搞不懂的指针劝退。你可能会抱怨“为什么这门语言语法这么怪为什么没有现成的便捷工具”其实语言的语法结构是由它的诞生使命决定的。了解 C 语言的历史能让你从“被动背语法”变成“主动理解设计者用意”。今天就让我们穿越回 20 世纪 60 年代末看看这门传奇语言的诞生故事。一、 溯源为了“打游戏”而诞生的 UNIX 与 B 语言1969年故事的起因非常接地气程序员也想打游戏。1969 年美国贝尔实验室的程序员肯·汤普森Ken Thompson写了一款名为《太空旅行》Space Travel的电脑游戏。为了能更流畅地运行这个游戏他找来了一台被闲置的 PDP-7 计算机。在当时想在这台机器上写程序只能使用汇编语言。汇编语言极其贴近硬件但有两个致命痛点代码极难维护漏写一个符号系统直接崩溃毫无可移植性换一台不同型号的电脑所有代码必须全部重写。为了提高效率汤普森基于当时的 BCPL 语言简化出了一门新的语言——B 语言取自 BCPL 的首字母并用 B 语言编写了著名的UNIX 操作系统的初代原型。二、 诞生丹尼斯·里奇与 C 语言1972–1973年B 语言虽然比汇编语言好写但它有一个致命缺陷没有“数据类型”的概念而且无法高效直接地操作物理内存。这时汤普森的同事——被称为“C 语言之父”的丹尼斯·里奇Dennis Ritchie出场了。里奇在 B 语言的基础上做了革命性的改良引入了明确的数据类型如int、char等设计了指针Pointer让高级语言也能像汇编一样直接读写内存地址编写了高效的 C 语言编译器。因为这门新语言是 B 语言的下一代里奇顺理成章地将其命名为C 语言。/* 这就是 C 语言的设计初衷既有高级语言的结构又有直接操作内存的能力 */inta10;int*pa;// 指针直接指向内存地址 改变计算机历史的时刻1973年1973 年里奇与汤普森做出了一个震撼全行业的决定用 C 语言重新编写整个 UNIX 操作系统内核在当时大家都认为操作系统这种核心软件必须用汇编语言写。但 UNIX 的成功证明了C 语言既有接近硬件的运行效率又拥有跨平台移植的能力。这举动彻底奠定了 C 语言在操作系统界的统治地位。三、 规范从 KR C 到 ANSI C 标准1978–1989年随着 UNIX 的风靡全球程序员开始狂热使用 C 语言但也带来了混乱各个厂家开发了自己的编译器导致在一个平台写的 C 代码到另一个平台就跑不通了。为了解决标准不一的问题C 语言经历了两次重要标准化1. KR C1978年丹尼斯·里奇与布莱恩·柯林汉Brian Kernighan合著出版了经典巨著《The C Programming Language》简称 KR。这本书成为了全球程序员的“圣经”。趣闻你在第一天学习编程时写的Hello, World!就是在这本书里首次亮相并传遍全球的#includestdio.hintmain(){printf(hello, world\n);return0;}2. ANSI C / C891989年美国国家标准协会ANSI在 1989 年发布了官方标准称为ANSI C或 C89。这是现代 C 语言最稳定、最核心的基石。此后又陆续演进出了C99增加了//注释等、C11和C17/C23。四、 总结了解这段历史对我们初学者有什么用回顾 C 语言的发展史我们可以得出三条对学习至关重要的启示理解指针的本质指针不是为了刁难初学者而发明的是因为 C 语言一开始就是为了写操作系统而生的。操作系统必须直接管理内存所以指针是它天生最锋利的武器。掌握编程语言的“母语”后来的 C、Java、C#、JavaScript、Go 等语言它们的语法结构如{}花括号、if/else、for循环全都继承自 C 语言。学好 C 语言再学其他语言就是顺水推舟。感受底层的力量直到今天你手机里的 Android / iOS 内核、电脑上的 Windows / macOS 系统、汽车里的嵌入式芯片依然是由 C 语言在底层默默支撑。写在最后作为一名 C 语言初学者不要害怕报错和踩坑。50 年前里奇和汤普森也是在解决一个又一个报错中创造出这门伟大的语言的。如果这篇文章对你有启发欢迎点赞、收藏加关注我们一起在 C 语言的学习路上并肩前行