应用自由软件标准
作者:理查德·斯托曼四个基本自由提供了 判断一段代码是否是自由/开源(即,尊重用户自由)的标准。我们应该如何应用这些标准来判断一个软件包、一个操作系统、一台计算机或一个网页是否值得推荐?
一个程序是否自由首先影响我们关于私人活动的决定:为了维护我们的自由,我们需要拒绝那些会剥夺自由的程序。然而,这也影响我们应该对他人说什么以及与他人做什么。
非自由程序是不公正的。分发非自由程序,向他人推荐非自由程序,或者更笼统地说,引导他们走上使用非自由软件的道路,意味着引导他们放弃自由。当然,引导人们使用非自由软件与在他们的计算机上安装非自由软件不同,但我们不应该把人们引向错误的方向。
更深层次来说,我们绝不能将非自由程序视为解决方案,因为那样会赋予其合法性。非自由软件是一个问题;将其视为解决方案,就是否认问题的存在。
本文解释了我们如何应用基本的自由软件标准来判断各种事物,以便我们决定是否推荐它们。
软件包
要使一个软件包是自由的,其中所有的代码都必须是自由的。但不仅限于代码。由于包括手册、自述文件、更改日志等在内的文档文件是软件包必不可少的技术部分,它们也必须是自由的。
一个软件包通常与许多其他软件包一起使用,并与其中一些软件包进行交互。与非自由程序的哪些交互类型在道德上是可以接受的?
我们开发 GNU 是为了有一个自由的操作系统,因为 1983 年时还没有这样的操作系统。在 20 世纪 80 年代开发 GNU 的初始组件时,每个组件依赖于非自由软件是不可避免的。例如,在 GCC 工作之前,没有 C 程序可以在没有非自由 C 编译器的情况下运行,并且在 glibc 工作之前,没有程序可以在没有 Unix libc 的情况下运行。每个组件只能在非自由系统上运行,因为所有的系统都是非自由的。
在我们发布了一个可以在某些非自由系统上运行的组件后,用户将其移植到其他非自由系统;这些移植在道德上并不比我们开发这些组件所需的特定于平台的代码更糟糕,因此我们采纳了他们的补丁。
当内核 Linux 在 1992 年被释放时,它填补了 GNU 系统的最后一个空白。(最初,在 1991 年,Linux 是在非自由许可证下分发的。)GNU 和 Linux 的结合构成了一个完整的自由操作系统——GNU/Linux。
那时,我们可以删除对非自由平台的支持,但我们决定不这样做。非自由系统是不公正的,但这并不是用户运行它的错。在该系统上支持一个自由程序并不会加剧这种不公正。而且它不仅对这些系统的用户有用,而且还有助于吸引更多的人为开发自由程序做出贡献。
但是,一个在自由程序之上运行的非自由程序是一个完全不同的问题,因为它会导致用户远离自由。在某些情况下,我们不允许这样做:例如,GCC 禁止非自由插件。当一个程序允许非自由插件时,它至少不应该引导人们使用它们。例如,我们选择 LibreOffice 而不是 OpenOffice,因为 OpenOffice 建议使用非自由插件,而 LibreOffice 则避开它们。我们最初开发 IceCat 是为了避免提出 Firefox 建议的非自由插件。
实际上,如果 IceCat 软件包解释了如何在 MacOS 上运行 IceCat,那不会导致人们运行 MacOS。但是,如果它谈论一些非自由插件,那会鼓励 IceCat 用户安装该插件。因此,IceCat 软件包,包括手册和网站,都不应该谈论此类事情。
有时,一个自由程序和一个非自由程序可以互操作,但两者都不是基于另一个的。我们对此类情况的规则是,如果该非自由程序非常出名,我们应该告诉人们如何使用我们的自由程序来使用它;但是,如果该专有程序是晦涩难懂的,我们不应该暗示它的存在。有时,如果非自由程序已安装,我们会支持与非自由程序的互操作,但避免告诉用户这样做的可能性。
我们拒绝“增强功能”,它们只能在非自由系统上工作。这些会鼓励人们使用非自由系统而不是 GNU,这是搬起石头砸自己的脚。
GNU/Linux 发行版
在 1992 年 Linux 获得解放之后,人们开始开发 GNU/Linux 发行版(“发行版”)。只有少数发行版是 完全自由的软件。
适用于软件包的规则也适用于发行版:一个合乎道德的发行版必须只包含自由软件,并且只引导用户使用自由软件。但是,对于一个发行版来说,“包含”一个特定的软件包意味着什么?
一些发行版从作为发行版一部分的二进制软件包中安装程序;其他的则从上游源代码构建每个程序,并且实际上只包含下载和构建它的配方。对于自由问题,发行版如何安装给定软件包并不重要;如果它将该软件包呈现为选项,或者其网站如此,我们就说它“包含”该软件包。
自由系统的用户可以控制它,因此他们可以安装他们想要的任何东西。自由发行版提供通用设施,用户可以使用这些设施安装他们自己的程序和他们修改过的自由程序版本;他们也可以安装非自由程序。提供这些通用设施不是发行版的道德缺陷,因为发行版的开发人员不负责用户自己主动获取和安装的东西。
当开发人员引导用户使用非自由程序时,他们有责任安装非自由软件——例如,将其放入发行版的软件包列表中,或从其服务器分发,或将其呈现为解决方案而不是问题。这就是大多数 GNU/Linux 发行版存在道德缺陷的地方。
自己安装软件包的人有一定的成熟度:如果我们告诉他们“Baby 包含非自由代码,但 Gbaby 是自由的”,我们可以期望他们会注意记住哪个是哪个。但是,发行版被推荐给会忘记这些细节的普通用户。他们会想,“他们说我应该用什么名字?我想是 Baby。”
因此,为了向公众推荐发行版,我们坚持要求其名称不要与我们拒绝的发行版相似,这样我们只推荐自由发行版的消息才能可靠地传播。
发行版和软件包之间的另一个区别是非自由代码被添加的可能性。程序的开发人员会仔细检查他们添加的代码。如果他们已决定使该程序自由,他们不太可能添加非自由代码。有一些例外,包括添加到 Linux 中的非常有害的“二进制 blob”案例,但它们只是现有自由程序中的一小部分。
相比之下,GNU/Linux 发行版通常包含数千个软件包,并且发行版的开发人员每年可能会添加数百个软件包。如果没有认真努力避免包含一些非自由软件的软件包,肯定会有一些悄悄混入。由于自由发行版数量很少,我们要求每个自由发行版的开发人员承诺通过删除任何非自由代码或恶意软件来保持发行版自由软件,作为列出该发行版的条件。请参阅 GNU 自由系统发行版指南。
我们不要求自由软件包做出这样的承诺:这是不可行的,而且幸运的是没有必要。让 30,000 个自由程序的开发人员承诺保持它们自由,可以避免一些问题,但会花费 FSF 工作人员大量的工作;此外,这些开发人员中的大多数与 GNU 项目没有任何关系,可能对向我们做出任何承诺不感兴趣。因此,我们会在发现它们时处理那些从自由变为非自由的罕见案例。
外围设备
计算机外围设备需要在计算机中安装软件——可能是一个驱动程序,也可能是系统加载到外围设备中以使其运行的固件。因此,如果可以从没有安装非自由软件的计算机上使用外围设备,那么该外围设备是可以接受使用和推荐的——外围设备的驱动程序,以及系统需要加载到其中的任何固件,都是自由的。
检查这一点很简单:将外围设备连接到运行完全自由的 GNU/Linux 发行版的计算机,看看它是否可以工作。但是大多数用户都希望在购买外围设备之前知道,因此我们在 h-node.org 中列出了许多外围设备的信息,这是一个完全自由操作系统的硬件数据库。
计算机
计算机在各个级别都包含软件。我们应该根据什么标准来证明一台计算机“尊重您的自由”?
显然,操作系统以及其上的所有内容都必须是自由的。在 90 年代,启动软件(当时的 BIOS)变得可替换,并且由于它在 CPU 上运行,因此它与操作系统属于同类问题。因此,安装在系统或与系统一起安装的固件和驱动程序等程序必须是自由的。
如果计算机的硬件功能需要安装随系统提供的非自由驱动程序或固件,我们或许可以认可它。如果它在没有这些功能的情况下可用,并且如果我们认为大多数人不会被引导去安装非自由软件来使它们发挥作用,那么我们可以认可它。否则,我们不能。这将是一个需要判断的问题。
计算机可以在较低级别具有可修改的预安装固件和微代码。它也可以在真正的只读存储器中具有代码。我们今天决定在我们的认证标准中忽略这些程序,因为否则任何计算机都无法符合要求,并且因为通常不更改的固件在道德上等同于电路。因此,我们的认证标准仅涵盖在计算机主处理器上运行且不在真正只读存储器中的代码。当自由软件在其他处理级别上成为可能时,我们也将要求在这些级别上使用自由软件。
由于认证产品是对其的积极推广,我们坚持要求卖家以谈论自由软件而不是开源,并将 GNU 和 Linux 的组合称为“GNU/Linux”来支持我们作为回报。我们没有义务积极推广那些不承认我们的工作和不支持我们的运动的项目。
请参阅我们的认证标准。
网页
如今,许多网页包含复杂的 JavaScript 程序,并且没有它们就无法工作。这是一种有害的做法,因为它阻碍了用户对其计算的控制。此外,这些程序中的大多数都是非自由的,这是一种不公正。通常,JavaScript 代码会监视用户。JavaScript 已经演变成对用户自由的攻击。
为了解决这个问题,我们开发了 LibreJS,这是一个 Firefox 的附加组件,可阻止不重要的非自由 JavaScript 代码。(无需阻止实现次要用户界面黑客的简单脚本。)我们要求网站免费提供其 JavaScript 程序,并标记其许可证以供 LibreJS 识别。
同时,链接到包含非自由 JavaScript 程序的网页是否符合道德?如果我们完全不妥协,我们将只链接到自由 JavaScript 代码。但是,即使在不运行 JavaScript 代码的情况下,许多页面也可以正常工作。此外,您最常遇到的非自由 JavaScript 除了通过我们的链接之外,还会在其他方式中遇到;要避免这种情况,您必须使用 LibreJS 或禁用 JavaScript。因此,我们已决定继续链接到没有非自由 JavaScript 也能正常工作的页面,同时敦促用户保护自己免受一般的非自由 JavaScript 的侵害。
但是,如果一个页面在不运行非自由 JavaScript 代码的情况下无法完成其工作,那么链接到它无疑是要求人们运行该非自由代码。原则上,我们不链接到此类页面。
结论
将软件应该自由的基本理念应用于不同的情况会导致不同的实际政策。随着新情况的出现,GNU 项目和自由软件基金会将调整我们的自由标准,以便在实践和原则上引导计算机用户走向自由。通过仅推荐尊重自由的程序、发行版和硬件产品,并阐明您的政策,您可以为自由软件运动提供急需的支持。