C 语言发展史
C 语言发展史
C 语言由丹尼斯·里奇(Dennis Ritchie)于 20 世纪 70 年代初在贝尔实验室主持设计。它最初服务于 UNIX 操作系统开发,核心目标是在运行效率、底层控制能力和源代码可移植性之间取得平衡。
【一】C 语言诞生的背景
早期操作系统主要使用汇编语言编写。汇编语言执行效率高,也能直接控制硬件,但它与具体处理器紧密相关:更换硬件平台后,程序往往需要大幅重写。
高级语言虽然更容易编写和移植,当时却难以同时满足系统软件对运行效率和底层操作的要求。C 语言正是在这一矛盾中逐步形成的。
其演进关系可以概括为:
BCPL(1967) ↓B 语言(1969) ↓C 语言(约 1972)【1】BCPL 语言
1967 年,马丁·理查兹(Martin Richards)设计了 BCPL。它是一种结构简单、便于编写编译器的无类型语言,对后来的 B 语言产生了直接影响。
【2】B 语言
1969 年前后,肯·汤普森(Ken Thompson)在贝尔实验室以 BCPL 为基础设计了 B 语言,并将其用于早期 UNIX 系统的开发。
B 语言采用“无类型”的设计,适合当时字长固定的计算机,但在 PDP-11 等新硬件上逐渐暴露出数据类型不足、运行效率不高等问题。
【3】C 语言诞生
1971—1973 年间,丹尼斯·里奇对 B 语言进行改进,逐步加入字符、整数、指针、数组和结构体等机制。改进后的语言最初被称为“New B”,后来正式命名为 C。
1973 年,UNIX 内核的大部分代码被改用 C 语言编写。这一实践证明:操作系统并非只能使用汇编语言开发,也使 UNIX 更容易被移植到不同的计算机平台。
【二】重要发展时间线
| 时间 | 事件 | 意义 |
|---|---|---|
| 1967 年 | BCPL 语言诞生 | 为 B 语言提供设计基础 |
| 1969 年 | 肯·汤普森设计 B 语言 | 用于早期 UNIX 开发 |
| 1972 年前后 | 丹尼斯·里奇设计 C 语言 | 加入数据类型等重要机制 |
| 1973 年 | UNIX 内核大部分改用 C 编写 | 验证了 C 语言的系统编程能力和可移植性 |
| 1978 年 | 《The C Programming Language》第一版出版 | K&R C 成为事实上的语言规范 |
| 1983 年 | ANSI 成立 X3J11 委员会 | C 语言标准化工作正式展开 |
| 1989 年 | ANSI 发布 C89 | C 语言的第一个正式标准 |
| 1990 年 | ISO 发布 C90 | 将 C89 纳入国际标准体系 |
| 1995 年 | 发布 C95 修订案 | 增强宽字符和多字节字符支持 |
| 1999 年 | 发布 C99 | 语言功能和标准库得到大幅扩展 |
| 2011 年 | 发布 C11 | 引入原子操作、线程和泛型选择等功能 |
| 2018 年 | 发布 C17 | 主要修正和澄清 C11 |
| 2024 年 | ISO/IEC 9899<2024>2024> 正式发布 | 通常称为 C23,是当前主要标准版本 |
【三】K&R C 与标准化
1978 年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇合著的《C 程序设计语言》(The C Programming Language)第一版出版。

书中描述的 C 语言后来被称为 K&R C。它不是由标准化组织发布的正式标准,但在 C89 出现以前长期被视为事实上的规范。
随着 C 语言不断普及,不同编译器对语言的实现逐渐产生差异。为了提高程序的兼容性和可移植性,美国国家标准协会(ANSI)于 1983 年成立 X3J11 委员会,并在 1989 年发布第一个正式标准 C89。
【四】C 语言标准演进
【1】C89 与 C90
- C89:ANSI X3.159-1989。
- C90:ISO/IEC 9899<1990>1990>。
- 两者在技术内容上基本相同,通常合称为 ANSI C 或 C89/C90。
- 引入函数原型,完善类型检查。
- 标准化
void、const、volatile等类型和限定符。 - 系统定义标准头文件和标准库。
- 明确预处理、类型转换和程序行为规则。
【2】C95
C95 并不是一次完整重写的语言标准,而是对 C90 的修订,正式形式为 C90 的 Amendment 1。
主要变化包括:
- 加强宽字符和多字节字符支持。
- 增加
<wchar.h>和<wctype.h>。 - 增加用于替代部分特殊字符的双字符组(digraph)。
【3】C99
C99 是 C 语言历史上一次重要更新,代表性变化包括:
- 允许使用
//单行注释。 - 允许在语句之间声明变量。
- 允许在
for初始化部分声明变量。 - 增加
long long、_Bool和复数类型。 - 引入
inline和restrict。 - 支持可变长度数组(VLA)。
- 支持指定初始化器、复合字面量和柔性数组成员。
- 增加
<stdint.h>等标准头文件。
从 C11 开始,可变长度数组变为实现可选功能,并不是所有编译器都完整支持。
【4】C11
C11 更关注并发编程、类型安全和现代硬件支持,代表性变化包括:
- 引入
_Atomic和原子操作。 - 增加
<threads.h>线程库。 - 引入
_Generic泛型选择。 - 引入
_Static_assert静态断言。 - 支持匿名结构体和匿名联合体。
- 增加对齐控制功能。
- 改进 Unicode 字符支持。
线程和原子操作在部分实现中属于可选功能,实际使用时需要检查编译器及标准库支持情况。
【5】C17(C18)
C17 的正式标准编号为 ISO/IEC 9899<2018>2018>,因此也经常被称为 C18。
它没有加入重要的新语言特性,主要用于修正 C11 中的缺陷、歧义和规范表述问题,是对 C11 的维护性更新。
【6】C23
C23 在开发阶段曾被称为 C2X,最终标准文件为 ISO/IEC 9899<2024>2024>。虽然正式文件于 2024 年发布,业界通常仍将这一版本称为 C23。
代表性变化包括:
- 增加
nullptr和nullptr_t。 - 增加
typeof和typeof_unqual。 - 支持
constexpr对象。 - 支持二进制整数字面量和数字分隔符。
- 增加
_BitInt位精确整数类型。 - 引入
#embed预处理指令。 - 改进枚举、属性和类型推导能力。
- 将
bool、true、false纳入语言本身。 - 删除部分过时的旧式语法。
C23 较新,不同编译器对各项特性的支持程度可能不同。使用前应查看具体编译器版本的说明。
【五】各版本对比
| 版本 | 发布时间 | 定位 | 代表性变化 |
|---|---|---|---|
| K&R C | 1978 年 | 事实规范 | 描述标准化以前的经典 C 语言 |
| C89/C90 | 1989/1990 年 | 首个正式标准 | 函数原型、类型限定符、标准库 |
| C95 | 1995 年 | C90 修订案 | 宽字符、多字节字符 |
| C99 | 1999 年 | 大规模功能扩展 | //、inline、VLA、stdint.h |
| C11 | 2011 年 | 现代化更新 | 原子操作、线程、泛型选择、静态断言 |
| C17 | 2018 年 | 维护性版本 | 修正和澄清 C11 |
| C23 | 2024 年正式发布 | 当前主要标准版本 | nullptr、typeof、constexpr、#embed |
【六】C 语言的主要特点
【1】运行效率高
C 语言提供较少的运行时抽象,程序通常可以被编译成高效的机器代码,因此适合对性能和资源占用要求较高的场景。
【2】具备底层控制能力
指针、位运算和内存操作使 C 语言能够直接处理内存地址、寄存器及硬件资源。
【3】源代码可移植性较好
符合标准且避免依赖平台特性的 C 程序,通常只需少量修改或重新编译,就能运行在不同平台上。
“可移植”并不意味着所有 C 程序在任何平台上都会得到完全相同的结果。数据类型长度、字节序及实现定义行为等仍可能存在差异。
【4】语言核心精简
C 语言的语法和核心机制相对精简,许多功能通过标准库或第三方库提供。这种设计带来了灵活性,也要求程序员主动管理资源。
【5】需要关注内存安全
C 语言允许直接操作内存,但不会自动进行边界检查或垃圾回收。数组越界、空指针、悬空指针和内存泄漏都是常见风险。
【七】主要应用领域
- 操作系统与内核:UNIX、Linux 内核及部分 Windows 系统组件。
- 嵌入式系统:单片机、汽车电子、工业控制和物联网设备。
- 驱动程序与固件:需要直接操作硬件和寄存器的程序。
- 编译器与运行时:编译器、解释器及语言运行库。
- 数据库与基础软件:数据库、网络服务和高性能基础组件。
- 跨语言接口:C ABI 简单而稳定,许多语言通过 C 接口调用系统库。
【八】C 语言的影响
C 语言对后来的编程语言产生了深远影响。C++ 和 Objective-C 直接建立在 C 的基础上;Java、C#、JavaScript 等语言也借鉴了大量 C 风格语法。
更重要的是,C 语言及其 ABI 已成为操作系统、硬件和高级编程语言之间的重要接口。即使应用程序并不直接使用 C 编写,其底层往往仍依赖 C 标准库、系统调用或由 C 实现的运行时组件。
【九】常见认识误区
-
C 语言不是在 1972 年某一天突然完成的。
它是在 1971—1973 年间逐步设计和完善的。 -
K&R C 不是正式标准。
它是 C89 出现以前被广泛采用的事实规范。 -
C89 和 C90 不是两个差异明显的版本。
二者技术内容基本相同,只是发布组织和年份不同。 -
C17 和 C18 通常指同一代标准。
C17 是常用名称,正式标准文件发布于 2018 年。 -
C2X 已经不再是“计划中的标准”。
它最终发展为 C23,并以 ISO/IEC 9899<2024>2024> 的形式正式发布。 -
可移植性不等于完全与平台无关。
编写可移植程序仍需避免未定义行为和平台相关假设。
【十】总结
C 语言的发展可以概括为:
使用接近高级语言的结构化表达方式,获得接近底层硬件的控制能力。
它诞生于 UNIX 操作系统的开发需求,经过 K&R C、C89/C90、C99、C11、C17 和 C23 等阶段不断完善。虽然现代编程语言不断涌现,C 语言仍然是操作系统、嵌入式开发、编译器和高性能基础软件领域的重要工具。
学习 C 语言不仅是学习一种语法,更是在理解内存、数据表示、编译过程及计算机系统的基本工作方式。
【十一】延伸阅读
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!














