UNIX、BSD 与 Linux 的爱恨情仇

本文目标

  • 熟悉 UNIX 作业系统的发展
  • 认识自由软件运动与 GNU 计画
  • 了解 C 语言是被设计来解决什麽样的问题

UNIX 的前世今生

在聊到 UNIX 之前,我们先来认识 UNIX 的前身: Multics

多工资讯与计算系统

MULTiplexed Information and Computing System,简称 Multics,这个计画於 1964 年启动,由贝尔实验室、麻省理工学院以及美国奇异公司参与研发。该计画志在打造出一个分时多工的作业系统,然而,由於其开发进度缓慢,该计画於 1969 年被终止。

可以说是早有预谋,亦或是一时兴起,让我们谈谈工程师的玩物: UNIX。

Multics 原本在一台型号为 GE-645 的电脑上开发,在该计画结束後,Ken Thompson 在 GE-645 上开发了一套带有档案系统与记忆体分页机制的 Emulator。不只如此,他也开发了一个名为 B 语言的程序语言并利用它撰写一款太空旅行游戏。
GE-645

这个几乎占满整个空间的厚重机器,就是用来开发 Multics 的电脑。

巨大的计算机带来了惊人的耗电量,Ken 每次运行他自干的太空旅行游戏就会花费 75 元美金,不久後,GE-645 也被收走了。
无奈之下,Ken 在实验室找到了几台没有人使用的旧电脑: DEC PDP-7,并且,Ken 开始尝试用 PDP-7 的组合语言重新撰写太空旅行这款游戏。

是的,PDP-7 我本人啦。

随後,Ken 找来了 Multics 计画的原班人马以及新夥伴 Rudd Canady,开始尝试为 PDP-7 打造一款专属的作业系统。
在开发期间内,Ken 发现要编写驱动程序来驱动档案系统进行测试并不容易,於是开发出了壳(shell)与部分驱动程序,做出了作业系统的雏形。
Multics 的许多功能都被沿用并且重构,最後,开发团队做出了一个分时多工的作业系统,成为第一版的 UNIX。

因为Multics来自「MULTiplexed Information and Computing System」的缩写,在 1970 年,那部 PDP-7 却只能支援两个使用者,彼得·纽曼(Peter G. Neumann)戏称他们的系统其实是:「UNiplexed Information and Computing System」,缩写为「UNICS」。於是这个专案被称为 UnICS(Uniplexed Information and Computing System)。
-- wikipedia

因为 PDP-7 的效能不佳,开发团队决定将 UNIX 移植到 PDP-11/20 上,开发第二版 UNIX。在效能提升後,团队才将 UnIcs 正名为 UNIX

学生们的恶梦: C 语言

最初,UnICS 的一些应用是由 B 语言和组合语言混合撰写的。考量到平台的可移植性,Ken 与 Ritchie 对其进行改造并於 1971 年共同发明了 C 语言。
此外,Ken 和 Ritchie 在 1973 年用 C 语言重构了 UNIX,该版本作为第三版的 UNIX。在当时,考虑到效能问题,系统程序都是由组合语言编写的,Ken 和 Ritchie 的举动可以说是跨时代的创举。用 C 语言编写的 UNIX 有着代码简洁、易移植、易读、易修改的优点,为 UNIX 的发展奠定了优良的基础。

一篇论文,声名大噪。

在 1974 年,Ken 与 Ritchie 在 ACM 投稿了一篇关於 UNIX 的论文: The UNIX TimeSharing System。该篇论文让外界认识了 UNIX,也是从这时开始,UNIX 被教育机构以及公家机关所采纳。
1975 年,UNIX 陆续发布了 4 、 5 、 6 版,在 1978 年时,全球已经有 600 多台运行 UNIX 作业系统的装置。
80 年代开始,UNIX 8 、 9 、 10 版只授权给了少部分的大学作为教育与研究用途。

System V UNIX 的结束

2005 年 8 月,贝尔实验室中,当年负责研发 UNIX 与维护工作的 1127 部门正式宣告解散。Ken 选择退休并居住在加州,Ritchie 则转调至别的部门,System V UNIX 也随着 1127 部门关闭而停止更新。

分道扬镳,BSD 的诞生

1982 年,AT&T 基於 UNIX 7 开发了 UNIX System Ⅲ 的第一个版本,这是一个仅供贩售目地的商业版本。
在当时为了解决 UNIX 版本混乱的情况,AT&T 综合了其他大学和公司开发的各种 UNIX,释出了 UNIX System V Release 1。
也因为 UNIX System V Release 1 不在包含先前 UNIX 的原始码,让 UC Berkeley 选择继续开发 BSD UNIX 将其作为 UNIX System III 和 V 的替代品。

TCP/IP 的领跑者: BSD

TCP/IP 绝对是 BSD 为作业系统发展带来的最大贡献,没有之一。

BSD 有 8 个主要的发行版中包含了 TCP/IP: 4.1c 、 4.2 、 4.3 、 4.3-Tahoe 、 4.3-Reno 、 Net2 、 4.4 以及 4.4-lite。这些发布版中的 TCP/IP 代码几乎是现在所有系统中 TCP/IP 实现的前辈,包括 AT&T System V UNIX 和 Microsoft Windows。
-- wikipedia

NET2 与官司问题

继 NET1 版本後,BSD 开发团队开始将 BSD 中大量关於 AT&T 的代码移除,像是重新撰写了 Vi 编辑器: NVi。开发团队於 1991 年 6 月发布了 BSD NET2,其原始码仅剩部分核心文件保留了 AT&T 的程序码。

Net/2 成为 Intel 80386 构架上两种移植版的主要组成部分,包括由 William Jolitz 负责,自由的 386BSD ;以及专属的 BSD/OS,由 Berkeley Software Design(BSDi)负责。 386BSD 本身虽然短命,但在不久之後成为了 NetBSD 和F reeBSD 原始代码的基础。
--wikipedia

这桩诉讼案推迟了两年才在 1994 年 1 月了结,判决结果对 UC Berkeley 有利。柏克莱套件的 18000 个档案中,只有 3 个档案被要求删除、 70 个档案被要求修改并标明 USL 的着作权说明。
这项调解还要求,USL 不得对之後的 4.4BSD 的使用者和开发者提起诉讼。

BSD 的开枝散叶

1994 年 6 月,4.4BSD 以两种形式发布:

  • 可自由再发布的 4.4 BSD-Lite
    4.4 BSD-Lite 不包含 AT&T 的原始码。
  • 4.4 BSD-Encumbered
    与先前版本一样,遵照 AT&T 的授权条款。

UC Berkeley 的最终版本是 1995 年发布的 4.4 BSD-Lite Release 2,随着 CSRG 解散,在 UC Berkeley 的 BSD 开发也告一段落。也是基於 4.4 BSD 的套件,让 BSD 的诸多分支 ( FreeBSD 、 OpenBSD 和 NetBSD )得以继续维护。

图为 UNIX 谱系,取自维基百科。

自由软件运动与 Linux 的诞生

在谈 Linux 之前,我们必需要先知道伟大的自由软件运动

自由软件运动与 Richard Matthew Stallman

自由软件运动是一个推广使用者有使用、复制、研究、修改和分发软件等权利的社会运动。接近和相关的运动包括开放原始码运动及自由软件的开放原始码运动。这运动跟 1970 年代的骇客文化有渊源,而理察·斯托曼是该运动的主要发起人以及精神领袖。

谈到自由软件运动,就一定要知道在该运动底下催生的 GNU 计画
GNU 计划是由 Richard Matthew Stallman 在麻省理工学院的人工智慧实验室发起。其中,理查希望发展出一套完整的开源作业系统来取代 UNIX,该作业系统被称为 GNU。

理想与现实的差异

可惜,现实与理想总是会有一些差别,在现实生活中,GNU 作业系统的开发时程缓慢,多半使用 Linux 以及 FreeBSD 作为作业系统的核心。
不过,GNU 计画仍大大的影响我们的开发者世界,不止有有作业系统,GNU 计画由多个工具所组成,像是:

  • GNU 编译器套装 GCC
  • GNU 的 C 函式库 glibc
  • GNU 核心工具组 coreutils
  • GNU Debugger: GDB

等等,并且大部分的工具都被移植到了其他作业系统上,在开发者圈中发光发热。

一场官司,成就 Linux

在前面提到,USL 以及 UC Berkeley 的法律诉讼长达 2 年才以和解收场,这也让自由软件的开发延迟了两年,进而让没有法律问题的 Linux 核心获得了极大的支援。
Linux 跟 386BSD 的开发几乎同时起步( Linux 於 1991 年开发),作者 Linus 更是这麽说过: 当时如果有基於 80386 平台的自由类 UNIX 作业系统,他可能就不会打造出 Linux 了。
就技术上来看,Linux 是一个符合 POSIX 标准的作业系统核心。它提供了一套完善的 API 给开发者使用,让使用者能透过介面程序与核心及硬体互动。

GNU Linux 与 Linux 作业系统的命名争议

除了上面提到的 Linux 核心,还有一套以 Linux Kernel 为核心打造的作业系统: Linux 作业系统。开发者圈也为了 Linux 作业系统应该叫 GNU Linux 还是 Linux 而大动肝火。

GNU / Linux 这一名称是由自由软件基金会的创立者与 GNU 计划的发起人 Richard Matthew Stallman 所提出的。 GNU 的开发者与其支持者,希望以该名称来作为此作业系统的正式名称。他们认为,此作业系统,包括了 GNU 系统软件套件与 Linux 核心,使用 GNU / Linux 这个名称,可以良好概括它的主要内容。况且,GNU 计画原本就是以发展一个自由的作业系统为远程计画,但迟迟没有完成。而 Linux 核心的出现刚好可以补足这个缺口。
-- wikipedia

然而,Linux 核心并不是 GNU 计划的一部份,所以 GNU Linux 这个名称在 Linux 社群中并没有得到一致认同。有趣的是,Linux 核心专案的发起人 Linus Torvalds 偏好於使用 Linux,但对於 GNU / Linux 这个名字并不抱有反感。

这可以说是粉丝比偶像本人还生气吗 XD

总结

笔者希望能够藉由本篇文章让大家知道生活中常用到的 GCC,甚至是大家口中的类 UNIX 系统是什麽。
或许,在阅读这些历史後,学习 C 语言时会比较不感到枯燥乏味(?)

如果觉得冗长的文字过於枯燥,大家也可以参考交大学生制作的影片

经过漫长的铺陈,明天就会开始进入作业系统实作的部分啦!读者们可以期待一下 XD

Reference


<<:  Day-15 转职中最困难的地方是什麽?

>>:  [Day18]-档案读取

Day 10 : 存放资料的收纳库-串列资料(下)

今天继续来补足Python的其他存放资料的办法: tuple tuple跟list很相似,差别差在t...

[PHP]透过[jquery] 以 [Ajax]方式使用[Stored Procedure]取得[MSSQL]资料

网上找到的参考有点混乱,因此统整一下 使用环境: XAMPP 3.2.4 jquery.min.js...

Day 29 「Try it!」单元测试与软件工程

国内饮料大厂有句广告标语:「Try It!」笔者还蛮喜欢的。 图片截自网路 从小在父母的保护下长大,...

Day 16 - UML x Interface — TextField

今天的 TextField 和明天的 FormControl 都是在介绍跟表单有关的介面和元件,而...

Day 29 - 用Mixins来共用方法

相信经过了前面二十几天的洗礼,小夥伴们应该都对Vue有了一定的掌握度了吧~ 今天要来提到的是Vue的...