第5集:历史上的编译器传奇

学习目标

通过本集的学习,你将能够:

  • 了解第一个编译器是如何诞生的
  • 理解 Fortran 在历史上的重要地位
  • 明白 C语言与 UNIX 的相互成就
  • 知道 LLVM 是如何崛起的

5.1 第一个编译器的故事

在编译器出现之前,编程是什么样子的?

黑暗时代(1940s-1950s)

  • 程序员直接写机器语言(0和1)
  • 或者写汇编语言,然后手工汇编
  • 效率极低,极其容易出错
  • 写一个简单的程序可能需要几周时间

想象一下
你要写一个计算 1+2 的程序,得写成这样:

10111000 00000001 00000000 00000000
00000101 00000010 00000000 00000000
10001001 00000101 00000000 01000000

写错一个位,程序就崩溃了!

Grace Hopper 与第一个编译器

时间:1952年
地点:美国
人物:Grace Hopper(格蕾丝·霍珀)
成就:开发了第一个编译器 A-0

Grace Hopper 的贡献

  • 她相信可以用"类似英语"的语言来编程
  • 开发了 A-0 系统,这是历史上第一个编译器
  • 后来又开发了 Flow-Matic,影响了 COBOL 的设计
  • 被称为"COBOL 之母"

趣闻

  • 她也是"调试"(debug)一词的发明者
  • 传说她的计算机里飞进了一只蛾子,导致故障
  • 她把蛾子贴在日志里,标注"第一个实际发现的 bug"

但是...

A-0 虽然是第一个编译器,但并没有广泛使用。
真正改变世界的,是下一个传奇...

5.2 Fortran 的诞生

时间:1957年
地点:IBM
人物:John Backus(约翰·巴克斯)团队
成就:Fortran(Formula Translation)

为什么需要 Fortran?

  • 当时的科学计算主要用汇编语言
  • 写一个矩阵乘法可能需要几千行汇编
  • IBM 704 计算机问世,但缺少好用的语言

John Backus 的抱怨

1954年,Backus 向 IBM 经理抱怨:

"编程是一件令人沮丧、浪费时间的苦差事。"

经理问:"那你有什么办法?"
Backus 说:"让我做一个项目吧。"

于是,Fortran 项目启动了。

Fortran 的革命

  • 第一个被广泛使用的高级语言
  • 专门为科学计算设计
  • 生成的代码效率极高(甚至比手工写的汇编还快!)
  • 至今仍在高性能计算领域使用

一句话评价

Fortran 证明了编译器可以生成高效的代码,从此高级语言不再是"玩具"。

时间线

1954年:项目启动
1957年:Fortran I 发布
1958年:Fortran II(增加了子程序)
1962年:Fortran IV
1978年:Fortran 77
1991年:Fortran 90(巨大改进)
2004年:Fortran 2003
2010年:Fortran 2008
... 至今仍在发展

5.3 C语言与 UNIX 的革命

让我们把时间快进到 20 世纪 70 年代...

背景

  • 1960年代,Multics 项目失败(一个过于复杂的操作系统)
  • 贝尔实验室的 Ken Thompson 和 Dennis Ritchie 很失落
  • 他们想做一个简单的操作系统自己玩

UNIX 的诞生

1969年:Ken Thompson 在 PDP-7 上写了 UNIX
       用的是汇编语言

问题来了

UNIX 用汇编写的,想移植到新机器?

  • 得全部重写!
  • 这太痛苦了...

C语言的诞生

Dennis Ritchie 说:"我们需要一个高级语言来写 UNIX!"

1970年:B 语言(基于 BCPL)
1972年:C 语言(Dennis Ritchie 设计)
1973年:UNIX 用 C 语言重写

这是一个里程碑

  • UNIX 成为第一个用高级语言写的操作系统
  • 从此,操作系统可以轻松移植到新机器
  • C 语言和 UNIX 相互成就,一起改变了世界

C语言的设计哲学

Keep It Simple, Stupid!(保持简单!)
  • 语言核心很小,功能靠库实现
  • 信任程序员,给程序员最大的自由
  • "你可以做任何事,但后果自负"

影响

  • C 语言成为系统级编程的"通用语言"
  • 后来的 C++、Java、Go、Rust 等都受 C 影响
  • UNIX 衍生出 Linux、BSD、macOS 等
  • 整个互联网的基础设施,很大一部分建立在 C 和 UNIX 之上

一句话评价

C 语言和 UNIX 是软件开发历史上最重要的革命之一。

5.4 GCC 的崛起

让我们继续前进到 20 世纪 80 年代...

背景

  • UNIX 很贵,是商业软件
  • Richard Stallman 很不满
  • 他想要一个完全自由的操作系统

GNU 计划

1983年:Richard Stallman 宣布 GNU 计划
       (GNU's Not Unix)
目标:创建一个完全自由的类 UNIX 系统

需要什么?

  • 编辑器(Emacs)
  • 工具链(make, debug...)
  • 编译器!

GCC 的诞生

1987年:GCC 1.0 发布
       (GNU Compiler Collection)
作者:Richard Stallman

GCC 的特点

  • 完全自由、开源
  • 支持多种语言(C, C++, Objective-C, Fortran, Java, Go...)
  • 支持多种硬件平台
  • 代码质量极高

GCC 的影响

  • Linux 用 GCC 编译
  • 几乎所有自由软件都用 GCC
  • 成为开源世界的标准编译器
  • 推动了开源运动的发展

一句话评价

如果没有 GCC,开源运动可能不会有今天的成功。

5.5 LLVM 的崛起

让我们来到 21 世纪...

问题

GCC 很强大,但也有问题:

  • 代码库很老,难以修改
  • 模块化不够好
  • 很难扩展新功能
  • 很难用于 IDE 的实时分析

LLVM 的诞生

2000年:Chris Lattner 在 UIUC 读研究生
       开始写 LLVM
       (Low Level Virtual Machine)
2003年:LLVM 1.0 发布
2005年:Apple 雇佣 Chris Lattner
       LLVM 成为 Apple 的官方编译器基础设施

LLVM 的设计理念

  • 高度模块化
  • 库化设计(每个部分都是独立的库)
  • 优秀的中间表示(IR)
  • 可以用于 JIT、静态编译、代码分析等

Clang

2007年:Clang 发布
       LLVM 的 C/C++/Objective-C 前端
优势:
- 比 GCC 快
- 内存占用更小
- 错误提示更友好
- IDE 集成更好

Apple 用 Clang 替换了 GCC!

LLVM 生态

现在 LLVM 被广泛使用:

  • Apple 的 Swift 语言
  • Rust 语言
  • Julia 语言
  • 很多 JIT 引擎
  • 各种静态分析工具

一句话评价

LLVM 是编译器基础设施的现代典范,影响深远。

5.6 时间线总览

让我们用一张图来回顾编译器的历史:

1950年代
   │
   ├─ 1952: Grace Hopper 的 A-0(第一个编译器)
   │
   └─ 1957: Fortran I(第一个成功的高级语言)
   │
1960年代
   │
   └─ 1960s: ALGOL, COBOL, BASIC
   │
1970年代
   │
   ├─ 1972: C 语言诞生
   │
   └─ 1973: UNIX 用 C 重写
   │
1980年代
   │
   ├─ 1983: C++ 诞生
   │
   └─ 1987: GCC 1.0 发布
   │
1990年代
   │
   ├─ 1991: Python 诞生
   │
   ├─ 1995: Java, JavaScript 诞生
   │
   └─ 1990s: Just-in-Time (JIT) 编译兴起
   │
2000年代
   │
   ├─ 2000: LLVM 项目开始
   │
   ├─ 2007: Clang 发布
   │
   └─ 2009: Go 语言诞生
   │
2010年代
   │
   ├─ 2010: Rust 1.0 发布
   │
   ├─ 2014: Swift 诞生
   │
   └─ 2010s: ML 在编译器中的应用
   │
2020年代
   │
   └─ 继续发展中...

5.7 从历史中学习

编译器的历史给我们什么启示?

1. 简单往往战胜复杂

  • Fortran 简单实用,成功了
  • C 语言保持简单,成功了
  • 复杂的设计往往难以维护

2. 实用主义很重要

  • 不要追求"完美设计"
  • 先解决问题,再改进
  • " Worse is Better "(更差即是更好)

3. 生态系统很重要

  • 好的语言需要好的工具链
  • 好的工具链会吸引更多用户
  • 形成正反馈循环

4. 开源改变了世界

  • GCC 推动了开源运动
  • LLVM 的开源模式促进了创新
  • 站在巨人的肩膀上

5.8 自测一下

问题 1

历史上第一个编译器是?
A) Fortran
B) A-0 (Grace Hopper)
C) GCC
D) LLVM

问题 2

Fortran 诞生于哪一年?
A) 1952
B) 1957
C) 1972
D) 1987

问题 3

C语言和UNIX的关系是?
A) 没关系
B) C语言用来写UNIX
C) UNIX用来写C语言
D) 同时诞生的

问题 4

LLVM 的作者是谁?
A) Grace Hopper
B) John Backus
C) Dennis Ritchie
D) Chris Lattner


答案

  1. B
  2. B
  3. B
  4. D

5.9 启蒙篇总结

恭喜!你已经完成了启蒙篇的学习!

我们学到了:

  1. 什么是编译器,以及为什么需要它
  2. 计算机是如何执行程序的
  3. 编程语言的家族树
  4. 编译器的工作流程
  5. 历史上的编译器传奇

你现在已经有了坚实的基础!

5.10 下一篇章预告

下一篇章,我们将进入:编程语言基础篇

我们会学习:

  • Python 快速入门(我们的实现语言)
  • 理解编程语言的语法
  • 上下文无关文法
  • 语言设计原则
  • 以及更多...

准备好了吗?我们下一篇章见!


参考资料

  • 《Programming Language Pragmatics》
  • 《The C Programming Language》(K&R)
  • GCC 历史文档
  • LLVM 历史文档
  • 《Coders at Work》(编程人生)
« 上一篇 编译器的工作流程概览 下一篇 » 为什么要学习编译原理?