正如 C 语言的诞生与 Unix 的诞生一样,第一个 C 语言编译器可以追溯到 20 世纪 70 年代初。我在上一篇文章《追溯历史:从电话到 Unix》中详细介绍了 C 语言的历史:

由于 Unix 是在 PDP-10/11 上创建的,因此第一个 C 语言编译器也是为 PDP-11 而创建的。这通常被称为 PDP C 编译器。这个编译器的源代码的最早版本仍然可以在这里查看,它是计算机历史上一个有趣的时间胶囊。

贝尔实验室的斯蒂芬-约翰逊(Stephen C. Johnson)开发的便携式 C 编译器接替了它的位置,它也是最早能够生成独立于机器的 C 代码的编译器之一。在 Bjarne Stroustrup 题为 "兄弟阋于墙 "的文章第 2.1 节中,他详细介绍了 C 和 C++ 的主要区别:C 和 C++》一文的第 2.1 节中,他详细介绍了该编译器的主要方面,以及它为何如此重要。

便携式 C 编译器随 Unix 第 7 版一起发布,这是 Unix 商业化之前发布的最后一个版本。由于其先行者的优势,以及它可以为不同的体系结构生成汇编,这意味着它在 C 语言刚刚兴起的年代获得了巨大的成功。

但它并不是当时唯一出现的编译器。20 世纪 70 年代,罗恩-凯恩还创建了 Small-C 编译器。它是 C 语言的简约子集,可以在 8 位微机上运行。现在很难相信计算机曾一度难以编译 C 代码,更不用说它的子集了,但事实确实如此。开发 C 语言的 PDP-11 是一台 16 位的扫帚柜大小的计算机,它仍然比当时的 8 位家用电脑强大得多。这就是为什么那个时代的程序通常用汇编、Basic 和 Pascal 而不是 C 编写的原因。PDP 11-40 的照片,拍摄者:Stefan_Kögl这一时期出现的另一种商业编译器是 Lattice C 编译器,它是最早为 IBM 个人电脑编写的 C 编译器之一。该编译器由 Lifeboat Associates 开发,零售价为 500 美元(按现在的价格计算为 1628 美元),可在 PC-DOS 和 MS-DOS 上运行。微软以此为基础开发了微软 C 编译器 (MSC)。在此期间,许多编译器相继问世,包括 Mark Williams 编译器、Green Hills 编译器、Aztec C 编译器等。它们都以布莱恩-克尼根(Brian Kernighan)和丹尼斯-里奇(Dennis M. Ritchie)于 1978 年 2 月 22 日出版的《C 编程语言》一书为基础。最终发布的 C89 或 C90 标准为该语言带来了亟需的统一性和清晰度。1988 年 4 月出版的该书第 2 版的序言强调了其重要性。

随着该标准的发布,C 语言成为了一种在不同环境下编程更加一致的语言。

时至今日,GNU 编译器集 (GCC) 不仅支持多种平台,还支持多种语言,是编译器发展的见证。我最喜欢计算机传说的一点是,许多最有贡献的人至今仍然健在,我们仍然有他们创造历史的记录。对于 GCC 来说,这也不例外,我们还保留着理查德-斯托尔曼(Richard Stallman)在 87 年介绍 GCC 测试版的文字。

日期Sun, 22 Mar 87 10:56:56 EST

发件人:rms (Richard M. Stallman)

GNU C 编译器现在可以通过 ftp 从文件/u2/emacs/gcc.tar on prep.ai.mit.edu。其中包括机器描述(internals.texinfo、internals.dvi 和 Info文件 internals)。

还包括 ANSI 标准(86 年 11 月)C 预处理器和 30 页的参考手册。

该编译器在 68020 上能正确编译,最近在 vax 上也能正确编译。

最近在 vax 上也是如此。它最近在68020 上编译了 Emacs,还编译了 tex-in-C 和 Kyoto Common Lisp。不过,它可能仍有许多 Bug,我希望你能帮我找出来。

我将离开一个月,所以现在报告的 Bug 在我回来之前不能被处理。

如果您不能使用 ftp,可以向自由软件基金会订购编译器 beta 测试磁带。自由软件基金会订购编译器 beta 测试磁带,价格为 150 美元(在马萨诸塞州加 5%的销售税,如果要空邮,海外加 15 美元)。

自由软件基金会
1000 Mass Ave
Cambridge, MA 02138

对我来说,这就像是计算机考古学。

今天,GCC 不仅仅是一个 C 编译器。它是一个编译器合集,支持这些编程语言:C、C++、Objective-C、Objective-C++、Fortran、Ada、D 和 Go。在当今所有编译器中,它支持最多的平台和最多的 CPU 架构,而且仍在积极开发中。看看这些编译器!但 GCC 并不是唯一的跨平台工业级编译器。LLVM 也提供了很好的体验,并得益于编译器构建方面数十年的后见之明。LLVM 由 Vikram Adve 和他的博士生 Chris Lattner 于 2000 年在伊利诺伊大学香槟分校创建。它最初是一个研究项目,当时克里斯正在放寒假。在接下来的一年里,Chris 和 Vikram 一直在研究这个编译器,然后发表了第一篇题为《Automatic Pool Allocation for Disjoint Data Structures》的论文。虽然他们当时并不知道,但他们正在创造历史。

  1. LLVM IR
  2. 基于模块化库的设计
  3. 可重定向代码生成器

最后,它比 GCC 年轻 13 岁,无需支持那么多体系结构。这意味着,加上 LLVM 的模块化特性,LLVM 的代码库比 GCC 小 3.5 倍(500 万行代码比 160 万行代码)。虽然这些数字看似惊人,但与拥有 1.5 亿行代码的强大福特 F150 相比,还是相形见绌。

照片:FourFour on Unsplash

不过,虽然 LLVM 可能比较新,但它仍然面临着来自 GCC 的激烈竞争。GCC 和 LLVM 都支持许多现代 C 和 C++ 标准,而且它们都有一套庞大的工具来处理输出结果。在 Jeremy Bennett 撰写的题为《编译器的成本是多少?一文中,我们看到了这些编译器带来的众多工具,以及创建配套软件套件所需的数十万行代码: