视频加载失败

C 语言发展史

2697 字
13 分钟
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 发布 C89C 语言的第一个正式标准
1990 年ISO 发布 C90将 C89 纳入国际标准体系
1995 年发布 C95 修订案增强宽字符和多字节字符支持
1999 年发布 C99语言功能和标准库得到大幅扩展
2011 年发布 C11引入原子操作、线程和泛型选择等功能
2018 年发布 C17主要修正和澄清 C11
2024 年ISO/IEC 9899<2024> 正式发布通常称为 C23,是当前主要标准版本

【三】K&R C 与标准化#

1978 年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇合著的《C 程序设计语言》(The C Programming Language)第一版出版。

《C 程序设计语言》封面
《C 程序设计语言》封面

书中描述的 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>。
  • 两者在技术内容上基本相同,通常合称为 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>,因此也经常被称为 C18。

它没有加入重要的新语言特性,主要用于修正 C11 中的缺陷、歧义和规范表述问题,是对 C11 的维护性更新。

【6】C23#

C23 在开发阶段曾被称为 C2X,最终标准文件为 ISO/IEC 9899<2024>。虽然正式文件于 2024 年发布,业界通常仍将这一版本称为 C23。

代表性变化包括:

  • 增加 nullptr 和 nullptr_t。
  • 增加 typeof 和 typeof_unqual。
  • 支持 constexpr 对象。
  • 支持二进制整数字面量和数字分隔符。
  • 增加 _BitInt 位精确整数类型。
  • 引入 #embed 预处理指令。
  • 改进枚举、属性和类型推导能力。
  • 将 bool、true、false 纳入语言本身。
  • 删除部分过时的旧式语法。

C23 较新,不同编译器对各项特性的支持程度可能不同。使用前应查看具体编译器版本的说明。

【五】各版本对比#

版本发布时间定位代表性变化
K&R C1978 年事实规范描述标准化以前的经典 C 语言
C89/C901989/1990 年首个正式标准函数原型、类型限定符、标准库
C951995 年C90 修订案宽字符、多字节字符
C991999 年大规模功能扩展//、inline、VLA、stdint.h
C112011 年现代化更新原子操作、线程、泛型选择、静态断言
C172018 年维护性版本修正和澄清 C11
C232024 年正式发布当前主要标准版本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 实现的运行时组件。

【九】常见认识误区#

  1. C 语言不是在 1972 年某一天突然完成的。
    它是在 1971—1973 年间逐步设计和完善的。

  2. K&R C 不是正式标准。
    它是 C89 出现以前被广泛采用的事实规范。

  3. C89 和 C90 不是两个差异明显的版本。
    二者技术内容基本相同,只是发布组织和年份不同。

  4. C17 和 C18 通常指同一代标准。
    C17 是常用名称,正式标准文件发布于 2018 年。

  5. C2X 已经不再是“计划中的标准”。
    它最终发展为 C23,并以 ISO/IEC 9899<2024> 的形式正式发布。

  6. 可移植性不等于完全与平台无关。
    编写可移植程序仍需避免未定义行为和平台相关假设。

【十】总结#

C 语言的发展可以概括为:

使用接近高级语言的结构化表达方式,获得接近底层硬件的控制能力。

它诞生于 UNIX 操作系统的开发需求,经过 K&R C、C89/C90、C99、C11、C17 和 C23 等阶段不断完善。虽然现代编程语言不断涌现,C 语言仍然是操作系统、嵌入式开发、编译器和高性能基础软件领域的重要工具。

学习 C 语言不仅是学习一种语法,更是在理解内存、数据表示、编译过程及计算机系统的基本工作方式。

【十一】延伸阅读#

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Profile Image of the Author
Dream
Hello, I'm Dream.
公告
欢迎来到我的博客!爱学习爱进步。
分类
标签
最新动态
站点统计
文章
11
分类
1
标签
26
总字数
23,674
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录