第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-0Grace 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 StallmanGCC 的特点:
- 完全自由、开源
- 支持多种语言(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
答案:
- B
- B
- B
- D
5.9 启蒙篇总结
恭喜!你已经完成了启蒙篇的学习!
我们学到了:
- 什么是编译器,以及为什么需要它
- 计算机是如何执行程序的
- 编程语言的家族树
- 编译器的工作流程
- 历史上的编译器传奇
你现在已经有了坚实的基础!
5.10 下一篇章预告
下一篇章,我们将进入:编程语言基础篇!
我们会学习:
- Python 快速入门(我们的实现语言)
- 理解编程语言的语法
- 上下文无关文法
- 语言设计原则
- 以及更多...
准备好了吗?我们下一篇章见!
参考资料
- 《Programming Language Pragmatics》
- 《The C Programming Language》(K&R)
- GCC 历史文档
- LLVM 历史文档
- 《Coders at Work》(编程人生)