GNU 项目
作者:Richard Stallman第一个软件共享社区
1971 年,当我开始在麻省理工学院人工智能实验室工作时,我成为了一个已经存在多年的软件共享社区的一员。软件共享并不局限于我们特定的社区;它和计算机一样古老,就像食谱的共享和烹饪一样古老。但我们比大多数人做得更多。
人工智能实验室使用一种名为ITS(不兼容分时系统)的分时操作系统,该系统由实验室的黑客人员设计并用汇编语言为当时的的大型计算机之一 Digital PDP-10 编写 [1]。作为这个社区的成员,一名人工智能实验室的系统黑客,我的工作是改进这个系统。
我们没有把我们的软件称为“自由软件”,因为这个术语当时还不存在;但它就是自由软件。每当其他大学或公司的人想要移植和使用一个程序时,我们都会欣然允许他们。如果你看到有人在使用一个不熟悉且有趣的程序,你总是可以要求查看源代码,以便你可以阅读它、更改它或将它的部分拆解下来来创建一个新程序。
社区的崩溃
20 世纪 80 年代初,当 Digital 停止生产 PDP-10 系列时,情况发生了巨大的变化。它的架构在 60 年代优雅而强大,但无法自然地扩展到 80 年代正在变得可行的更大地址空间。这意味着组成 ITS 的几乎所有程序都已过时。
人工智能实验室的黑客社区在不久之前就已经崩溃了。1981 年,衍生公司 Symbolics 从人工智能实验室挖走了几乎所有的黑客,人口稀少的社区无法维持自身。(史蒂夫·利维的《黑客》一书描述了这些事件,并清晰地描绘了该社区鼎盛时期的景象。)当人工智能实验室在 1982 年购买了一台新的 PDP-10 时,其管理人员决定使用 Digital 的非自由分时系统而不是 ITS。
当时的现代计算机,如 VAX 或 68020,都有自己的操作系统,但它们都不是自由软件:你甚至必须签署保密协议才能获得可执行副本。
这意味着使用计算机的第一步是承诺不帮助你的邻居。一个合作的社区是被禁止的。专有软件的所有者制定的规则是:“如果你与你的邻居分享,你就是海盗。如果你想要任何更改,恳求我们来做。”
专有软件社会系统(即禁止你共享或更改软件的系统)是反社会的、不道德的、完全错误的这种想法,可能会让一些读者感到惊讶。但是,我们还能对一个建立在分裂公众和让用户无助的基础上的系统说些什么呢?那些发现这种想法令人惊讶的读者可能已经将专有软件社会系统视为理所当然,或者根据专有软件业务提出的条款来判断它。软件发行商长期以来一直努力说服人们,只有一种看待这个问题的方式。
当软件发行商谈论“强制执行”他们的“权利”或“阻止盗版”时,他们实际说的是次要的。这些声明的真正信息在于他们理所当然地接受的未说明的假设,这些假设要求公众在未经审查的情况下接受。因此,让我们来审查它们。
一个假设是,软件公司拥有对软件的所有权,从而拥有对所有用户的权力是无可置疑的自然权利。(如果这是一种自然权利,那么无论它对公众造成多大的损害,我们都无法反对。)有趣的是,《美国宪法》和法律传统拒绝这种观点;版权不是一种自然权利,而是一种人为的政府强制垄断,它限制了用户复制的自然权利。
另一个未说明的假设是,关于软件的唯一重要的事情是它允许你完成什么工作——我们计算机用户不应该关心我们被允许拥有什么样的社会。
第三个假设是,如果我们不赋予公司对程序用户的权力,我们将不会拥有可用的软件(或者永远不会拥有程序来完成这个或那个特定工作)。在自由软件运动证明我们可以在不给软件加上枷锁的情况下制作大量有用的软件之前,这个假设可能看起来是合理的。
如果我们拒绝接受这些假设,并在将用户放在首位的同时,根据普通的常识道德来判断这些问题,我们就会得出截然不同的结论。计算机用户应该可以自由地修改程序以满足他们的需求,并且可以自由地共享软件,因为帮助他人是社会的基础。
这里没有空间对这个结论背后的推理进行详细的阐述,因此我请读者参考“为什么软件不应该有所有者”和“自由软件现在更加重要”。
一个严峻的道德选择
随着我的社区消失,继续像以前一样是不可能的。相反,我面临着一个严峻的道德选择。
简单的选择是加入专有软件世界,签署保密协议并承诺不帮助我的黑客同伴。很可能我也会开发在保密协议下发布的软件,从而增加其他人背叛同伴的压力。
我本可以以此方式赚钱,也许还可以通过编写代码来娱乐自己。但我知道,在我的职业生涯结束时,我会回顾多年来建立隔离人们的墙,并且会感到我的一生都在让世界变得更糟糕。
当有人拒绝给我和麻省理工学院人工智能实验室提供我们打印机控制程序的源代码时,我已经体验过保密协议的接收方了。(该程序中缺少某些功能使得打印机的使用非常令人沮丧。)所以我不能告诉自己保密协议是无辜的。当他拒绝与我们分享时,我非常生气;我不能反过来对其他人做同样的事情。
另一个选择,简单但令人不快,是离开计算机领域。那样我的技能就不会被滥用,但它们仍然会被浪费。我不会为分裂和限制计算机用户负责,但这仍然会发生。
所以我寻找一种程序员可以为善的方式。我问自己,我是否可以编写一个或多个程序,以便再次让社区成为可能?
答案很明确:首先需要的是一个操作系统。这是开始使用计算机的关键软件。有了操作系统,你可以做很多事情;没有操作系统,你根本无法运行计算机。有了自由的操作系统,我们可以再次拥有一个合作的黑客社区——并邀请任何人加入。而且任何人都可以使用计算机,而无需从阴谋剥夺他或她的朋友开始。
作为一名操作系统开发人员,我拥有胜任这项工作的正确技能。所以,即使我不能认为成功是理所当然的,我也意识到我被选来做这项工作。我选择使系统与 Unix 兼容,以便它具有可移植性,并且 Unix 用户可以轻松地切换到它。GNU 这个名称是按照黑客的传统选择的,它是“GNU's Not Unix”的递归缩写。它的发音是一个音节,带有硬 g。
操作系统不仅仅意味着一个内核,勉强足够运行其他程序。在 20 世纪 70 年代,每个名副其实的操作系统都包括命令处理器、汇编器、编译器、解释器、调试器、文本编辑器、邮件程序等等。ITS 有它们,Multics 有它们,VMS 有它们,Unix 也有它们。GNU 操作系统也将包括它们。
后来我听到了这些话,归因于希勒尔 [2]
如果我不为自己,谁会为我?
如果我只为自己,那我算什么?
如果不是现在,那又何时?
启动 GNU 项目的决定是基于类似的这种精神。
自由的含义是自由
术语“自由软件”有时会被误解——它与价格无关。它关乎自由。因此,以下是自由软件的定义。
如果对于您(特定的用户)来说,一个程序是自由软件,那么:
- 您可以自由地以任何您希望的方式运行该程序,用于任何目的。
- 您可以自由地修改该程序以满足您的需求。(为了使这种自由在实践中有效,您必须有权访问源代码,因为在没有源代码的情况下更改程序非常困难。)
- 您可以自由地重新分发副本,无论是免费的还是收费的。
- 您可以自由地分发该程序的修改版本,以便社区可以从您的改进中受益。
由于“自由”指的是自由,而不是价格,因此销售副本和自由软件之间没有矛盾。事实上,销售副本的自由至关重要:在 CD-ROM 上销售的自由软件集合对于社区非常重要,而销售它们是为自由软件开发筹集资金的重要方式。因此,人们不能自由地将其包含在这些集合中的程序不是自由软件。
由于“自由”一词的含义模糊不清,人们长期以来一直在寻找替代词,但没有人找到更好的术语。英语比其他任何语言都拥有更多的词汇和细微差别,但它缺乏一个简单、明确的词来表示“自由”,即自由的“自由”,最接近的词是“不受束缚”。诸如“解放”、“自由”和“开放”之类的替代词要么含义不正确,要么存在其他缺点。
GNU软件和GNU系统
开发一个完整的系统是一个非常庞大的项目。为了使其更容易实现,我决定在可能的情况下采用和使用现有的自由软件。例如,我一开始就决定使用 TeX 作为主要的文本格式化程序;几年后,我决定使用 X 窗口系统,而不是为 GNU 编写另一个窗口系统。
由于这些决定以及其他类似的决定,GNU 系统与所有 GNU 软件的集合并不相同。GNU 系统包括非 GNU 软件的程序,这些程序是由其他人和项目出于他们自己的目的开发的,但我们可以使用它们,因为它们是自由软件。
启动项目
1984年1月,我辞去了在麻省理工学院的工作,开始编写GNU软件。离开麻省理工学院是必要的,这样麻省理工学院就不会干扰以自由软件的形式分发 GNU。如果我继续留在职,麻省理工学院可能会声称拥有这项工作的所有权,并可能强加他们自己的分发条款,甚至将这项工作变成专有软件包。我无意做大量的工作,最终却发现它对于其预期目的毫无用处:创建一个新的软件共享社区。
然而,时任麻省理工学院人工智能实验室主任的温斯顿教授好意邀请我继续使用实验室的设施。
最初的步骤
在开始 GNU 项目之前不久,我听说了自由大学编译器工具包,也称为 VUCK。(荷兰语中“自由”的写法用 v。)这是一个旨在处理多种语言(包括 C 和 Pascal)并支持多种目标机器的编译器。我写信给其作者,询问 GNU 是否可以使用它。
他嘲讽地回应说,这所大学是自由的,但编译器不是。因此,我决定我的 GNU 项目的第一个程序将是一个多语言、多平台的编译器。
为了避免自己编写整个编译器,我获得了 Pastel 编译器的源代码,这是一个在劳伦斯利弗莫尔实验室开发的多平台编译器。它支持并用扩展版的 Pascal 编写,旨在成为一种系统编程语言。我添加了一个 C 前端,并开始将其移植到摩托罗拉 68000 计算机。但是,当我发现编译器需要大量的堆栈空间时,我不得不放弃它,而可用的 68000 Unix 系统只允许 64k。
然后我意识到,Pastel 编译器的工作原理是将整个输入文件解析为语法树,将整个语法树转换为一系列“指令”,然后生成整个输出文件,而从不释放任何存储空间。在这一点上,我得出结论,我必须从头开始编写一个新的编译器。这个新的编译器现在被称为 GCC;其中没有使用 Pastel 编译器的任何内容,但我设法采用并使用了我编写的 C 前端。但这已经是几年后的事了;首先,我致力于 GNU Emacs。
GNU Emacs
我于 1984 年 9 月开始开发 GNU Emacs,并在 1985 年初开始可以使用。这使我能够开始使用 Unix 系统进行编辑;由于对学习使用 vi 或 ed 没有兴趣,我直到那时才在其他类型的机器上进行编辑。
此时,人们开始想要使用 GNU Emacs,这就提出了如何分发它的问题。当然,我将其放在我使用的麻省理工学院计算机上的匿名 ftp 服务器上。(这台计算机 prep.ai.mit.edu,因此成为主要的 GNU ftp 分发站点;几年后它被停用时,我们将名称转移到我们的新 ftp 服务器。)但是当时,许多感兴趣的人不在互联网上,无法通过 ftp 获取副本。因此,问题是,我应该对他们说什么?
我本可以说,“找一个在网上并会为你制作副本的朋友。”或者,我可以像我处理原始 PDP-10 Emacs 一样:告诉他们,“给我邮寄一盘磁带和一个 贴好邮资的回邮信封,我将带着 Emacs 邮寄回去。”但我没有工作,我正在寻找从自由软件中赚钱的方法。所以我宣布,我将向任何想要的人邮寄磁带,费用为 150 美元。通过这种方式,我开始了自由软件分发业务,这是当今分发整个 GNU/Linux 系统发行版的公司的前身。
一个程序对每个用户都免费吗?
如果一个程序在离开作者之手时是自由软件,这并不一定意味着它对于拥有该程序副本的每个人都是自由软件。例如,公共领域软件(不受版权保护的软件)是自由软件;但是任何人都可以制作其专有的修改版本。同样,许多自由程序受版权保护,但在简单的许可许可下分发,这些许可允许专有的修改版本。
这个问题的典型例子是 X 窗口系统。它在麻省理工学院开发,并以宽松的许可作为自由软件发布,很快被各计算机公司采用。他们将 X 以二进制形式添加到他们的专有 Unix 系统中,并受相同的保密协议约束。这些 X 副本与 Unix 一样,不再是自由软件。
X 窗口系统的开发人员不认为这是一个问题——他们预料到并打算让这种情况发生。他们的目标不是自由,而只是“成功”,定义为“拥有许多用户”。他们不在乎这些用户是否拥有自由,只在乎他们人数众多。
这导致了一种矛盾的情况,在这种情况下,两种不同的计算自由度的方式对“这个程序是自由的吗?”的问题给出了不同的答案。如果你根据麻省理工学院发布的发行条款所提供的自由来判断,你会说 X 是自由软件。但是,如果你衡量 X 的普通用户的自由,你必须说它是专有软件。大多数 X 用户运行的是 Unix 系统附带的专有版本,而不是自由版本。
著作权和 GNU GPL
GNU 的目标是给予用户自由,而不仅仅是受欢迎。因此,我们需要使用发行条款来防止 GNU 软件变成专有软件。我们使用的方法称为“著作权” [3]。
著作权使用版权法,但将其翻转过来以实现与其通常目的相反的目的:它不是限制程序的手段,而是成为保持程序自由的手段。
著作权的核心思想是,我们允许每个人运行程序、复制程序、修改程序和分发修改后的版本——但不允许他们添加自己的限制。因此,定义“自由软件”的关键自由得到保证给拥有副本的每个人;它们成为不可剥夺的权利。
为了获得有效的著作权,修改后的版本也必须是自由的。这确保了基于我们工作的工作在发布时可供我们的社区使用。当作为程序员工作的程序员自愿改进 GNU 软件时,著作权会阻止他们的雇主说:“你不能分享这些更改,因为我们将使用它们来制作我们的专有程序版本。”
如果我们想确保该程序的每个用户都获得自由,那么更改必须是自由的要求至关重要。将 X 窗口系统私有化的公司通常会对其进行一些更改以将其移植到他们的系统和硬件。这些更改与 X 的巨大范围相比很小,但它们并非微不足道。如果进行更改是拒绝用户自由的借口,那么任何人都可以很容易地利用这个借口。
一个相关的问题是,将自由程序与非自由代码组合在一起。这种组合不可避免地是非自由的;非自由部分缺乏的任何自由,整体也将缺乏。允许这种组合将打开一个足以沉没船只的漏洞。因此,著作权的一个关键要求是堵住这个漏洞:添加到受著作权保护的程序或与受著作权保护的程序组合的任何内容都必须使更大的组合版本也是自由的并受著作权保护。
我们用于大多数 GNU 软件的著作权的具体实现是 GNU 通用公共许可证,或简称 GNU GPL。我们在特定情况下使用其他类型的著作权。GNU 手册也受著作权保护,但使用一种更简单的著作权,因为 GNU GPL 的复杂性对于手册来说不是必需的 [4]。
自由软件基金会
随着人们对使用 Emacs 的兴趣日益增长,其他人也开始参与 GNU 项目,我们认为现在应该再次寻求资金来支持 GNU 操作系统的开发。因此,在 1985 年,我引入了关心这个目标的朋友,并创建了自由软件基金会 (FSF),这是一个免税的自由软件开发慈善机构。 FSF 也接管了 Emacs 磁带分发业务;后来,它通过在磁带中添加其他自由软件(包括 GNU 和非 GNU 软件)以及销售自由(尊重自由的)手册来扩展了这项业务。
过去,FSF 的大部分收入来自自由软件副本和其他相关服务(源代码 CD-ROM、二进制文件 CD-ROM、精美印刷的手册,所有这些都可以自由再分发和修改)以及豪华发行版(为客户选择的平台构建整个软件集合的发行版)。今天,FSF 仍然销售手册和其他装备,但其大部分资金来自会员会费。您可以在fsf.org加入 FSF。
自由软件基金会的员工编写并维护了许多 GNU 软件包。其中两个著名的软件包是 C 库和 shell。GNU C 库是 GNU/Linux 系统上运行的每个程序用来与 Linux 通信的工具。它由自由软件基金会的一名员工罗兰·麦格拉斯开发。大多数 GNU/Linux 系统上使用的 shell 是 BASH,Bourne Again SHell [5],它由 FSF 员工布莱恩·福克斯开发。
我们为这些程序的开发提供资金,是因为 GNU 项目不仅仅是关于工具或开发环境。我们的目标是一个完整的操作系统,而这些程序是实现该目标所必需的。
自由软件支持
自由软件的理念反对一种特定的普遍商业惯例,但它并不反对商业。当企业尊重用户的自由时,我们希望他们取得成功。
销售 Emacs 的副本展示了一种自由软件业务。当 FSF 接管这项业务时,我需要另一种谋生的方式。我发现了一种销售与我开发的自由软件相关的服务的方法。这包括教学,例如如何编写 GNU Emacs 程序以及如何自定义 GCC,以及软件开发,主要是将 GCC 移植到新平台。
如今,许多公司都在实践这些类型的自由软件业务。一些公司在 CD-ROM 上分发自由软件集合;另一些公司则销售各种级别的支持,从回答用户问题,到修复错误,再到添加主要新功能。我们甚至开始看到基于推出新的自由软件产品的自由软件公司。
但要注意——许多与“开源”一词联系起来的公司实际上是基于与自由软件协同工作的非自由软件开展业务的。这些不是自由软件公司,它们是专有软件公司,其产品引诱用户放弃自由。他们称这些程序为“增值包”,这表明他们希望我们采纳的价值观:便利高于自由。如果我们更看重自由,我们应该称它们为“自由减少”包。
技术目标
GNU 的主要目标是成为自由软件。即使 GNU 在技术上没有优于 Unix 的优势,它也会具有社会优势,允许用户合作,并且具有道德优势,尊重用户的自由。
但是,将已知的良好实践标准应用于这项工作是很自然的——例如,动态分配数据结构以避免任意固定大小限制,并在任何有意义的地方处理所有可能的 8 位代码。
此外,我们拒绝了 Unix 对小内存大小的关注,决定不支持 16 位机器(很明显,到 GNU 系统完成时,32 位机器将成为常态),并且除非内存使用超过 1 MB,否则不努力减少内存使用。对于处理非常大的文件并不重要的程序,我们鼓励程序员将整个输入文件读取到核心中,然后扫描其内容,而无需担心 I/O。
这些决定使许多 GNU 程序在可靠性和速度方面超越了它们的 Unix 对应程序。
捐赠的计算机
随着 GNU 项目声誉的提高,人们开始向该项目捐赠运行 Unix 的机器。这些非常有用,因为开发 GNU 组件的最简单方法是在 Unix 系统上进行,然后逐个替换该系统的组件。但这提出了一个伦理问题:我们拥有 Unix 的副本是否正确。
Unix 是(现在也是)专有软件,GNU 项目的理念说我们不应该使用专有软件。但是,应用与自卫中的暴力是正当的结论相同的推理,我认为当专有软件包对于开发自由替代品至关重要时,使用它是合法的,这将有助于其他人停止使用专有软件包。
但是,即使这是一种可以辩解的罪恶,它仍然是一种罪恶。今天,我们不再拥有任何 Unix 副本,因为我们已经用自由操作系统取代了它们。如果我们无法用自由操作系统替换机器的操作系统,我们就替换机器本身。
GNU 任务列表
随着 GNU 项目的进行,并且发现或开发了越来越多的系统组件,最终列出剩余的差距变得有用。我们使用它来招募开发人员来编写缺失的部分。此列表被称为 GNU 任务列表。除了缺少 Unix 组件外,我们还列出了各种其他有用的软件和文档项目,我们认为,一个真正完整的系统应该拥有这些项目。
如今[6],GNU 任务列表中几乎没有剩下任何 Unix 组件——除了少数不重要的组件外,这些工作都已经完成。但是,该列表充满了有些人可能称之为“应用程序”的项目。任何吸引超过一小部分用户的程序都应该添加到操作系统中。
即使是游戏也包含在任务列表中——并且从一开始就包含在内。Unix 包括游戏,因此 GNU 自然也应该包括。但是,兼容性不是游戏的问题,因此我们没有遵循 Unix 所拥有的游戏列表。相反,我们列出了一系列用户可能喜欢的不同类型的游戏。
GNU 较小 GPL
GNU C 库使用一种特殊的版权复制方式,称为 GNU 较小通用公共许可证[7],该许可证允许将专有软件与该库链接。为什么要做出这个例外?
这不是原则问题;没有任何原则说专有软件产品有权包含我们的代码。(为什么要为一个基于拒绝与我们共享的项目做出贡献?)将 LGPL 用于 C 库或任何库是策略问题。
C 库执行通用工作;每个专有系统或编译器都带有 C 库。因此,仅向自由软件提供我们的 C 库并不会给自由软件带来任何优势——只会阻止人们使用我们的库。
一个系统是例外:在 GNU 系统(包括 GNU/Linux)上,GNU C 库是唯一的 C 库。因此,GNU C 库的发布条款决定了是否可以在 GNU 系统上编译专有程序。没有道德理由允许在 GNU 系统上使用专有应用程序,但从战略上讲,禁止它们似乎比鼓励开发自由应用程序更能阻止人们使用 GNU 系统。这就是为什么使用较小 GPL 是 C 库的一个好策略。
对于其他库,需要根据具体情况考虑战略决策。当一个库执行可以帮助编写某些类型程序的特殊工作时,那么在 GPL 下发布它,将其限制为仅限自由程序,是一种帮助其他自由软件开发人员的方式,使他们在与专有软件的竞争中获得优势。
考虑 GNU Readline,这是一个为 BASH 提供命令行编辑功能的库。Readline 是在普通的 GNU GPL 而不是较小 GPL 下发布的。这可能会减少 Readline 的使用量,但这对于我们来说没有损失。与此同时,至少有一个有用的应用程序被专门制作成自由软件,以便可以使用 Readline,这对社区来说是真正的收获。
专有软件开发人员拥有资金带来的优势;自由软件开发人员需要为彼此创造优势。我希望有一天我们将拥有大量 GPL 覆盖的库,这些库没有专有软件可用的平行库,提供有用的模块作为新自由软件的构建块,并为进一步的自由软件开发增加主要优势。
挠痒痒?
埃里克·雷蒙德说,“每一项优秀的软件作品都是从挠开发人员的个人痒处开始的。” 也许有时候会发生这种情况,但是许多重要的 GNU 软件都是为了拥有一个完整的自由操作系统而开发的。它们来自愿景和计划,而不是冲动。
例如,我们开发 GNU C 库是因为类似 Unix 的系统需要 C 库,开发 BASH 是因为类似 Unix 的系统需要 shell,开发 GNU tar 是因为类似 Unix 的系统需要 tar 程序。我自己的程序——GNU C 编译器、GNU Emacs、GDB 和 GNU Make 也是如此。
开发某些 GNU 程序是为了应对我们自由的特定威胁。因此,我们开发了 gzip 来替换 Compress 程序,该程序由于 LZW 专利而失去了社区。我们找到了开发 LessTif 的人,最近开始 GNOME 和 Harmony,以解决某些专有库引起的问题(见下文)。我们正在开发 GNU Privacy Guard 来替换流行的非自由加密软件,因为用户不应该在隐私和自由之间做出选择。
当然,编写这些程序的人对这项工作产生了兴趣,并且许多人为了他们自己的需求和兴趣而向其中添加了许多功能。但这并不是这些程序存在的原因。
意想不到的发展
在 GNU 项目开始时,我设想我们将开发整个 GNU 系统,然后将其作为一个整体发布。事实并非如此。
由于 GNU 系统的每个组件都是在 Unix 系统上实现的,因此在完整的 GNU 系统存在之前,每个组件都可以在 Unix 系统上运行。其中一些程序变得流行起来,用户开始扩展它们并将它们移植到各种不兼容的 Unix 版本,有时也移植到其他系统。
这个过程使这些程序变得更加强大,并为 GNU 项目吸引了资金和贡献者。但这可能也使最小工作系统的完成推迟了几年,因为 GNU 开发人员的时间被用来维护这些端口并向现有组件添加功能,而不是继续编写一个又一个缺失的组件。
GNU Hurd
到 1990 年,GNU 系统几乎完成;唯一缺少的主要组件是内核。我们已决定将我们的内核实现为在 Mach 之上运行的一组服务器进程。Mach 是在卡内基梅隆大学和犹他大学开发的微内核;GNU Hurd 是在 Mach 之上运行的一组服务器(即一群 GNU),并执行 Unix 内核的各种工作。由于我们等待 Mach 作为自由软件发布,正如承诺的那样,开发开始被推迟了。
选择这种设计的一个原因是,为了避免这项工作中最困难的部分:在没有源码级调试器的情况下调试内核程序。这项工作的这部分已经在 Mach 中完成了,我们期望使用 GDB 将 Hurd 服务器作为用户程序进行调试。但是,这花了很长时间才实现,而且相互发送消息的多线程服务器已被证明非常难以调试。使 Hurd 稳定运行已经持续了很多年。
Alix
GNU 内核最初不应该被称为 Hurd。它的原名是 Alix——以当时我的爱人的名字命名。她是一名 Unix 系统管理员,她指出她的名字如何适合 Unix 系统版本的常见命名模式;作为玩笑,她告诉她的朋友,“应该有人以我的名字命名一个内核。”我什么也没说,但决定用一个名为 Alix 的内核给她一个惊喜。
但情况并非如此。内核的主要开发者 Michael(现在是 Thomas)Bushnell 更喜欢 Hurd 这个名字,并将 Alix 重新定义为内核的某个部分——该部分将捕获系统调用并通过向 Hurd 服务器发送消息来处理它们。
后来,Alix 和我分手了,她改了名字;同时,Hurd 的设计也发生了改变,C 库将直接向服务器发送消息,这使得 Alix 组件从设计中消失了。
但在这些事情发生之前,她的一位朋友在 Hurd 源代码中看到了 Alix 这个名字,并告诉了她。所以她确实有机会发现一个以她的名字命名的内核。
Linux 和 GNU/Linux
GNU Hurd 不适合生产环境,我们也不知道它是否会适合。基于能力的设计存在一些问题,这些问题直接来源于设计的灵活性,并且不清楚是否存在解决方案。
幸运的是,还有另一个内核可用。1991 年,Linus Torvalds 开发了一个与 Unix 兼容的内核,并将其命名为 Linux。它最初是专有的,但在 1992 年,他将其变为自由软件;将 Linux 与尚未完全完成的 GNU 系统结合在一起,就形成了一个完整的自由操作系统。(当然,将它们结合在一起本身就是一项艰巨的工作。)正是由于 Linux,我们今天才能实际运行 GNU 系统的版本。
我们称这个系统版本为 GNU/Linux,以表达它是由 GNU 系统和 Linux 作为内核组合而成的。请不要养成将整个系统称为“Linux”的习惯,因为这意味着将我们的工作归功于其他人。请平等地提及我们。
我们未来的挑战
我们已经证明了我们开发各种自由软件的能力。这并不意味着我们是无敌的,不可阻挡的。有几个挑战使自由软件的未来充满不确定性;应对这些挑战需要坚定不移的努力和毅力,有时会持续数年。这将需要人们在珍视自己的自由并且不让任何人夺走它时所表现出的那种决心。
以下四个部分讨论这些挑战。
秘密硬件
硬件制造商越来越倾向于保持硬件规格的秘密。这使得编写自由驱动程序变得困难,因此 Linux 和 XFree86 可以支持新的硬件。我们今天拥有完整的自由系统,但如果我们不能支持未来的计算机,那么明天我们将不再拥有它们。
有两种方法可以解决这个问题。程序员可以进行逆向工程来找出如何支持硬件。我们其他人可以选择自由软件支持的硬件;随着我们人数的增加,规格的保密将成为一种自毁政策。
逆向工程是一项艰巨的工作;我们是否会有足够决心的程序员来承担它?是的——如果我们已经建立了强烈的信念,即自由软件是一个原则问题,而非自由驱动程序是不可容忍的。而且,我们是否会有大量的人花费额外的金钱,甚至只是一点额外的时间,以便我们可以使用自由驱动程序?是的,如果拥有自由的决心是普遍存在的 [8]。
非自由库
在自由操作系统上运行的非自由库充当自由软件开发人员的陷阱。该库的吸引人的功能是诱饵;如果你使用该库,你就会掉入陷阱,因为你的程序不能有效地成为自由操作系统的一部分。(严格来说,我们可以包含你的程序,但是如果缺少该库,它将无法运行。)更糟糕的是,如果一个使用专有库的程序变得流行,它可能会引诱其他不知情的程序员进入陷阱。
这个问题最早的实例是 80 年代的 Motif 工具包。尽管当时还没有自由操作系统,但很明显 Motif 以后会给它们带来什么问题。GNU 项目以两种方式回应:要求各个自由软件项目支持自由的 X Toolkit 小部件以及 Motif,并要求有人编写 Motif 的自由替代品。这项工作花了多年时间;由 Hungry Programmers 开发的 LessTif,直到 1997 年才变得足够强大,可以支持大多数 Motif 应用程序。
在 1996 年至 1998 年之间,另一个非自由的GUI工具包库,称为 Qt,被大量自由软件(桌面 KDE)使用。
自由的 GNU/Linux 系统无法使用 KDE,因为我们无法使用该库。但是,一些不严格遵守自由软件的 GNU/Linux 系统商业发行商将 KDE 添加到他们的系统中——从而产生了一个功能更强大但自由度较低的系统。KDE 组织积极鼓励更多程序员使用 Qt,并且数百万新的“Linux 用户”从未接触过这个问题。情况看起来很严峻。
自由软件社区以两种方式回应了这个问题:GNOME 和 Harmony。
GNOME,GNU 网络对象模型环境,是 GNU 的桌面项目。GNOME 于 1997 年由 Miguel de Icaza 发起,并在 Red Hat Software 的支持下开发,旨在提供类似的桌面设施,但完全使用自由软件。它也具有技术优势,例如支持多种语言,而不仅仅是 C++。但其主要目的是自由:不要求使用任何非自由软件。
Harmony 是一个兼容的替代库,旨在使无需使用 Qt 即可运行 KDE 软件。
1998 年 11 月,Qt 的开发者宣布更改许可证,如果执行,应该使 Qt 成为自由软件。无法确定,但我认为这部分是由于社区对 Qt 作为非自由软件时所造成的问题做出的坚定回应。(新许可证不方便且不公平,因此仍然需要避免使用 Qt [9]。)
我们将如何回应下一个诱人的非自由库?整个社区是否会理解需要远离陷阱?还是我们会放弃自由以换取便利,并产生一个主要问题?我们的未来取决于我们的理念。
软件专利
我们面临的最严重威胁来自软件专利,它可能会将算法和功能限制为自由软件长达 20 年。LZW 压缩算法专利于 1983 年申请,我们仍然无法发布自由软件来生成适当的压缩 GIF [10]。1998 年,一个用于生成 MP3 压缩音频的自由程序因专利诉讼威胁而被从发行中删除 [11]。
有几种方法可以应对专利:我们可以搜索证据证明专利无效,并且我们可以寻找替代方法来完成一项工作。但是,这些方法中的每一种都只能在某些时候起作用;当两者都失败时,专利可能会迫使所有自由软件缺乏用户想要的某些功能。经过漫长的等待,专利到期了,但是在那之前我们将做什么?
那些为了自由而珍视自由软件的人无论如何都会坚持使用自由软件。我们将设法在没有专利功能的情况下完成工作。但是,那些因为期望自由软件在技术上更出色而珍视自由软件的人,当专利阻碍它时,可能会称之为失败。因此,虽然谈论“集市”开发模式的实际效率以及某些自由软件的可靠性和强大功能是有用的,但我们不能止步于此。我们必须谈论自由和原则。
自由文档
我们自由操作系统中最大的缺陷不在于软件——而是缺乏可以包含在系统中的好的自由手册。文档是任何软件包的必要组成部分;当一个重要的自由软件包没有附带好的自由手册时,这是一个重大缺陷。我们今天有很多这样的缺陷。
自由文档,像自由软件一样,是一个关于自由的问题,而不是价格。自由手册的标准与自由软件的标准几乎相同:这是给予所有用户某些自由的问题。必须允许重新分发(包括商业销售),在线和纸质,以便手册可以随附该程序的每个副本。
修改的权限也至关重要。总的来说,我不认为人们必须有权修改各种文章和书籍。例如,我不认为你或我有义务允许修改像这篇文章这样的文章,这些文章描述了我们的行动和观点。
但是,有一个特殊的原因说明为什么修改的自由对于自由软件的文档至关重要。当人们行使他们修改软件的权利并添加或更改其功能时,如果他们尽职尽责,他们也会更改手册——这样他们就可以为修改后的程序提供准确且可用的文档。不允许程序员尽职尽责地完成工作的非自由手册不能满足我们社区的需求。
对修改方式的一些限制并不会造成问题。例如,要求保留原作者的版权声明、分发条款或作者列表都是可以接受的。要求修改后的版本包含修改通知,甚至包含不得删除或更改的整个章节(只要这些章节处理非技术性主题)也没有问题。这些类型的限制不会造成问题,因为它们不会阻止认真的程序员调整手册以适应修改后的程序。换句话说,它们不会阻止自由软件社区充分利用该手册。
但是,必须可以修改手册的所有技术内容,然后通过所有常用的媒介和渠道分发修改后的结果;否则,这些限制就会阻碍社区,手册就不是自由的,我们需要另一本手册。
自由软件开发者是否有意识和决心去制作全方位的自由手册?再次强调,我们的未来取决于理念。
我们必须谈论自由
目前估计,诸如Debian GNU/Linux和Red Hat“Linux”之类的GNU/Linux系统有数百万用户。自由软件已经发展出如此实际的优势,以至于用户纯粹出于实际原因而涌向它。
由此产生的好处显而易见:更多人有兴趣开发自由软件,更多自由软件企业的客户,以及更多鼓励公司开发商业自由软件而不是专有软件产品的能力。
但是,对软件的兴趣增长速度快于对软件背后哲学的认识,这会导致问题。我们应对上述挑战和威胁的能力取决于坚持自由的意愿。为了确保我们的社区拥有这种意愿,我们需要在新用户加入社区时向他们传播这种理念。
但是我们没有做到这一点:吸引新用户加入我们社区的努力远远超过了教导他们社区公民意识的努力。我们需要同时做到这两点,并且需要保持这两项努力的平衡。
“开源”
1998年,当社区的一部分人决定停止使用“自由软件”一词,而改说“开源软件”时,向新用户讲授自由变得更加困难。
一些支持这个术语的人旨在避免“自由”与“免费”之间的混淆——这是一个有效的目标。然而,另一些人则旨在抛弃激励自由软件运动和GNU项目的原则精神,转而吸引高管和商业用户,其中许多人的意识形态将利润置于自由、社区和原则之上。因此,“开源”的言论侧重于制造高质量、强大软件的潜力,但回避了自由、社区和原则的理念。
“Linux”杂志就是一个明显的例子——它们充斥着与GNU/Linux兼容的专有软件的广告。当下一个Motif或Qt出现时,这些杂志会警告程序员远离它,还是会刊登它的广告?
商业的支持可以通过多种方式为社区做出贡献;在其他条件相同的情况下,它是有用的。但是,通过更少地谈论自由和原则来赢得他们的支持可能是灾难性的;这使得外联与公民教育之间先前的失衡变得更糟。
“自由软件”和“开源”描述的是同一类软件,或多或少,但对软件和价值观的表达却不同。GNU项目继续使用“自由软件”一词,以表达自由而不仅仅是技术的重要性。
试试!
尤达的格言(“没有‘试’”)听起来很简洁,但对我来说不起作用。我做大部分工作的时候,都在担心自己是否能完成这项工作,并且不确定即使我做了,是否足以实现目标。但我还是尝试了,因为在敌人和我的城市之间,只有我。令我惊讶的是,我有时会成功。
有时我失败了;我的一些城市沦陷了。然后我发现了另一个受威胁的城市,并准备迎接另一场战斗。随着时间的推移,我学会了寻找威胁,并将自己置于它们和我的城市之间,呼吁其他黑客来加入我。
如今,通常我不是唯一的一个。当我看到一群黑客正在挖掘战壕以坚守阵地时,我感到欣慰和喜悦,我意识到,这座城市或许可以幸存下来——至少目前是这样。但是,每年的危险都在增加,现在微软已经明确地将目标对准了我们的社区。我们不能把自由的未来视为理所当然。不要把自由视为理所当然!如果你想保持你的自由,你必须准备好捍卫它。
脚注
- 大众媒体将“黑客”理解为“安全破坏者”是一种误解。我们黑客拒绝承认这种含义,并继续用这个词来指代那些热爱编程、享受有趣的聪明才智,或两者兼具的人。请参阅我的文章《关于黑客》。
PDP机器特别有利于黑客行为,因为它们是多用途、完全交互式的,与大型主机形成对比,并且允许共享软件和信息。 - 作为一名无神论者,我不追随任何宗教领袖,但我有时会发现自己钦佩他们所说的一些话。
- 在1984年或1985年,唐·霍普金斯(一个非常有想象力的人)给我寄了一封信。在信封上,他写了几句有趣的谚语,包括这句:“Copyleft——所有权利反转。”我用“copyleft”这个词来命名我当时正在开发的分发概念。
- 我们现在使用GNU自由文档许可证进行文档编写。
- “Bourne Again Shell”是对Unix上常用的shell“Bourne Shell”的文字游戏。
- 那是1998年写的。在2009年,我们不再维护长长的任务列表。社区开发自由软件的速度如此之快,以至于我们甚至无法跟踪所有这些软件。相反,我们有一个高优先级项目列表,这是一个我们真正想鼓励人们编写的简短的项目列表。
- 该许可证最初称为GNU库通用公共许可证,我们将其重命名以避免产生所有库都应该使用它的想法。有关更多信息,请参见为什么不应该为下一个库使用Lesser GPL。
- 2008年注释:这个问题也延伸到了BIOS。有一个自由的BIOS,LibreBoot(coreboot的一个发行版);问题在于获取机器的规格,以便LibreBoot可以在没有非自由“blob”的情况下支持它们。
- 在2000年9月,Qt在GNU GPL下重新发布,这基本上解决了这个问题。
- 截至2009年,GIF专利已过期。
- 截至2017年,MP3专利已过期。看看我们等了多久。
最初发表在《开放源代码》一书中。理查德·斯托曼从来不是“开源”的支持者,但贡献了这篇文章,以便自由软件运动的思想不会完全缺席那本书。
为什么比以往任何时候都更重要坚持我们使用的软件必须是自由的。