如果你在 Linux 论坛上潜伏的时间足够长,你会听到诸如“Systemd 不遵循 Unix 哲学”或“Gitlab 已放弃 Unix 哲学”之类的说法。 但用户不断提到的这种 Unix 哲学到底是什么。 在本文中,让我们解构长期存在的 Unix 哲学概念。
Unix 哲学史
Unix 是贝尔实验室的 Ken Thompson 和 Dennis Ritchie 于 1969 年开发的专有操作系统。 Unix 哲学 是从这些 Unix 开发人员的经验中得出的一套原则,这些原则有助于 构建最小的,模块化的, 和易于使用的软件. 虽然它们最初是由 Ken Thompson 作为一些非正式规范提出的,但随着时间的推移,随着多个开发人员试图用文字表达它们,它们变得更加成熟。 后来的操作系统,如 GNU/Linux 和 FreeBSD 接受了这套规范,并在构建自己的软件时使用它们。
第一次偶然提到 Unix 的设计考虑是在 1974 年 Ritchie 和 Thompson 写的一篇论文中,他们指出 软件应该易于编写、测试、运行; 互动和优雅。
然而,在 1978 年,Douglas McIlroy 在贝尔实验室的期刊上正式记录了 Unix 哲学。 这些笔记随后在 Peter Salus 的书《A Quarter Century of UNIX》中以这三个简单的点进行了总结。
- 编写只做一件事并做好的程序。
- 编写程序以协同工作。
- 编写程序来处理文本流,因为这是一个通用接口。
随着时间的推移,像 Eric Raymond 这样的许多开发人员已经略微添加或改变了这一理念,但这些仍然是核心原则。 在下一节中,我将讨论构成当今开发人员所考虑的 Unix 哲学的规则/规范/租户。
Unix哲学的租户
这里讨论的所有租户都有一个目标, 使软件开发、调试和维护尽可能简单. 它们并没有得到普遍认可,因为每个人都有自己的解释; 然而,我将在这里讨论的基本原则仍然被广泛认为是这一哲学的核心。
1. 模块化和组合
模块化是将一个巨大的软件分成小部分的艺术,这些小部分通过干净的接口连接起来。 自从有了计算的概念以来,我们一直试图将系统的复杂性保持在尽可能低的水平。 构建一个整体软件,其中每个部分都集成并依赖于另一个部分,这使得管理和调试软件变得困难。 除此之外,模块化还为最终用户提供了更多选择。
例如,在 Windows 中,操作系统的所有组件都是相互集成的。 没有单独的 Windows 内核,没有单独的 Windows UI,也没有单独的 Windows 菜单栏,因为它们都是一样的。
然而,基于 Linux 的操作系统就像一个乐高积木。 您可以运行内核本身,无需 GUI。 如果你想要 GUI,你可以在 Linux 内核之上开发一个 GUI 服务器(比如 X11)。 之后,您可以在多个窗口管理器和桌面管理器中进行选择,以便在您的 GUI 服务器上工作。 系统的每个部分,甚至是启动系统的 init 系统(systemd、iniv 等)都是独立的可替换实体,与操作系统本身无关。 虽然这为最终用户提供了更多选择和自由,但它也确保了如果系统的任何组件发生故障,整个操作系统都不会面临风险。
2. 组成和可扩展性
这个规范直接来源于我们上面的观点。 您应该始终编写可以与其他程序一起使用的程序 因为如果程序不相互交互,我们最终会得到单体软件。 我们必须像乐高积木一样将程序放在一起,其中一个程序的输出是另一个程序的输入,使用这些简单的构建块,我们将构建复杂的软件。 这也有助于 可扩展性. 如果您编写可以构建其他程序的程序,它们可以被后代进一步扩展。 所有经典的 Unix 时代软件都遵循这条规则,无论是 Vim、Emacs、Bash 等,它们如今都因其可扩展性而蓬勃发展。
3. 做一件事并做好
由于我们正在构建一个模块化程序,每个小组件都应该有一个单独的任务,并且应该尽可能高效、优雅和健壮地完成这个小任务。 这些小程序易于处理、维护和调试。
4.清晰和简单
正如 Eric Raymond 在他 2003 年的书中所提到的,清晰胜于聪明。 程序应该对用户简单明了。 他们应该沟通后台发生的任何事情,并在失败时给出清晰、详细的错误消息。 用户界面应该不足为奇。 这并不是说它必须平淡无奇,而是它一直可用、清晰且最重要的是简单。 程序中实现的算法也应该尽可能简单。 仅在确实需要时才实施花哨的复杂算法。
注意:这不是对 Eric Raymond 的种族主义政治信仰的认可
5. 可移植性高于效率
虽然从纯粹主义者的角度来看,最快、最高效的软件很酷,但速度稍慢但 更可移植的代码通常更实用。 虽然我们应该 使软件尽可能节省内存 (由于当时内存有限),我们必须提防这些对程序速度的“微优化”,因为最有效的方法是特定于硬件的,因此不可移植。 这并不意味着我们的软件应该又慢又笨重,这只是意味着它应该在不牺牲可移植性的情况下尽可能快。
结论
Unix 哲学简而言之是“KISS:保持简单愚蠢“。 所有这些租户都致力于制作最小、简单、清晰、无臃肿的软件。 这种理念虽然仍在一些程序员的实践中,但由于具有几乎无限内存的机器的出现而被推到了一边。 使用这样的机器,您不必提高内存效率或简单。 要了解有关 Unix 哲学和 Unix 本身的更多信息,请阅读 Peter Salus 的 A Quarter Century Of UNIX。 玩得开心,继续探索!