“自由软件”尊重用户的自由,并且尊重整个社区。粗略来讲,一个软件如果是自由软件,这意味着用户可以自由地运行,拷贝,分发,学习,修改并改进该软件。因此,“自由软件”是关乎自由的问题,与价格无关。要理解这个概念,你要按照FreeSoftware中的“Free”是指“自由言论(freespeech)”中的自由,而非“免费午餐(freelunch)”的免费这一意项。为避免歧义,在使用英文时,我们也会借用法语或西班牙语的“LibreSoftware”来指自由软件,这样可以明确表示我们说的不是免费。
一个软件只有提供了以上所有的自由给它的用户,才可以被成为自由软件。否则,它就是非自由的。尽管我们也可以比较非自由软件为其用户提供的自由度,但是我们认为,无论如何,非自由软件本身是不道德的。
无论在哪种情况下,只有所有用户使用的代码都满足了这四项基本自由,该程序才能被视作自由软件。例如,有两个程序,甲程序运行的时候会自动调用乙程序。发布甲程序意味着用户必须使用到乙程序,那么必须甲乙两个程序都是自由的,甲程序才是自由的。如果通过修改甲程序,使其不再依赖乙程序,那么仅仅以自由软件的形式发布甲程序即可。
“自由软件”不表示“非商业化”。与之相反,自由软件必须可以商用、可以商业开发、可以商业发布。这个政策非常重要—缺乏这样的政策,自由软件将无法实现自己的目标。
我们要邀请所有人使用GNU系统,包括商业机构及其员工。这就需要允许商用。我们期待许多程序的自由替代将来可以替换掉相应的专有程序,但是如果禁止商用就无法做到这些。我们期待商业产品包含有GNU系统的软件,并且成为商业发布定价的一部分。自由软件的商业开发不再那么不寻常;这些自由的商业软件非常重要。付费的、专业的自由软件技术支持填补了重要的需求空白。
因此,把商业使用、商业开发或商业发布排除在外会羁绊自由软件社区并阻碍其走向成功之路。我们一定要明确使用带有这种限制的许可证发布的软件不是自由软件。
假如获得自由软件拷贝的(潜在)用户遵守了先前发布的自由软件的许可证条款,那么该自由软件必须为获得软件的该(潜在)用户提供自由软件的四项基本自由。在自由方面对用户加以限制或者要求付费才能实践这些自由和不赋予用户自由没有什么两样,因此这样的程序不是自由软件。
在本文的以下部分,我们会进一步准确地解释这些自由针对各种问题会如何扩展才能使软件自由。
“自由地运行程序”(自由度0)意味着任何人或组织可以在任何(支持的)计算机系统上,出于任何目的去运行该程序,并且没有义务通知软件的开发者或任何个人或团体。此处,用户的目的是重点,而非开发者的目的。如果你是该程序的用户,那么你就可以自由地运行该程序。同理,如果你把程序发布给别人,那么此人也成了软件的用户,他也可以出于自己的任何目的运行该软件。然而,你作为软件的发布者,不可将自己的目的强加于你的用户。
“自由地运行程序”意味着没有人可以禁止或阻止用户运行该程序。这和该程序的功能特性没有关系,既不考虑该程序在特定环境下的可用性,也不考虑该程序对特定计算的有效性。
例如,如果代码随意地拒绝某些有意义的输入——或者甚至无条件地失效——这就可能使该程序不那么有用,甚至可能完全无用,但是这并不妨碍用户运行该程序的自由,因此,这和自由之零并无矛盾。如果该程序是自由的,那么其用户可以克服这些无用之处,因为自由之一和自由之三允许用户和社区修改和发表不带有随意代码的改进版本。
“按照你的意愿”可以包含、可选择地包含、“完全不包含”(如果你希望如此)。所以没有必要再有一个单独的“不运行程序的自由”。
自由度1和3(自由地修改软件;自由地发布修改后的软件)意味着用户必须有权访问程序的源代码。由此,访问源代码是成为自由软件的必要条件。混编(Obfuscated)后的“源代码”不是真正的源代码,不能被算作此处讨论的源代码。
源代码的定义是人们进行修改时首选使用的程序形式。因此,开发者开发程序的形式就是开发者眼中的源代码。
自由度1(自由地运行程序)包括自由地运行自己修改后的程序以替代原版程序。如果程序是跑在某种设备上,该设备可以运行别人修改的软件但不运行你修改的软件—这个方法叫做“tivoization”或者“锁死”,或者(用其发明者的术语)叫做“安全启动”—自由度1将被视为无法满足。该设备中的程序也将不被视为自由软件,即使它们的源代码是自由的。
对软件的修改可能是出于各种目的。某个特定的修改究竟是好是坏,这本身是个非常主观的事情。自由软件许可证不能对用户修改软件做任何限制,例如,不能仅仅因为某人觉得哪处修改不够好,就禁止用户自己做这个改动。
自由之一有一个特殊的案例就是删除程序的代码让它不执行任何动作,或者让它直接调用另外的程序。因此,自由之一包含有“删除程序的自由”。
用户可以自由地运行该程序或对程序进行修改。如果仅仅私下自己修改或运行该程序,那么你没有义务将该行为公开给任何人。如果你发布了自己修改后的程序,那么你也没有任何义务将该修改行为告知给哪个或哪些指定的人或组织。
“自由地分发软件的拷贝”意味着必须允许用户自由地发布软件的原版或用户自己的修改版。无论那个版本,用户都可以选择发布程序的二进制或可执行文件,也可以发布程序的源代码。(以可执行文件的形式发布程序可以让人方便安装,这一点对于推广自由软件也至关重要。)对于某些程序,也许无法或者不必发布二进制或可执行文件(一些编程语言的实现可能并不支持,例如某些脚本语言),但是用户必须有权利以任何方式生成二进制或可执行文件,并且发布这些生成的软件。
自由软件可以对修改版的打包或分发方式做一定的限制。这些限制不得与前面提到的四大自由相矛盾,不得直接或间接地限制用户运行,修改或发布软件。例如,某些自由软件可以要求修改版不得使用软件的原有名字发布;不能使用软件的原有商标;必须标明软件来自谁的修改等等。只要这些限制不会明显地限制用户再发布软件的修改版,那么它们就是可以接受的。既然已经对软件修改了,那么你估计也就不会在乎针对这些额外的小限制再做一点修改了。
同理,自由软件也可以要求用户“如果以这种方式发布,那么用户必须也可以从另外某一渠道获得”。比如,某个自由软件可能会要求如果发布了修改版,那么必须也要给原作者一份修改后的拷贝。(注意:此处前提是软件必须发布,用户可以私下修改软件而不发布,这样也就不必把修改版发给开发者了。)另外还有一些规则也不会与自由软件原则冲突,比如软件可以要求修改后的版本发布时需要附带相应的原版软件的代码。
有一些特例需要额外讨论:如果某软件许可证要求修改后的软件必须修改可执行文件的名字,那么必须保证软件运行的环境允许修改文件名或具备某种别名机制,否则该要求将被视作与自由软件原则相背。因为软件的可执行文件可能会被其他第三方软件调用,而文件名则是这种调用的基础。别名机制可以保证用户在遵守该要求的前提下,顺利将原版软件替换成修改版,并且不会影响依赖该软件的第三方程序。
一些政府的出口限制或贸易制裁可能会影响到软件用户在国际范围内发布软件的自由。软件开发者也许没有能力去改变这些现实,但是我们可以拒绝自我审查。自由软件的开发者不得在软件许可证中要求用户遵守哪条特定法律,因为开发者无法保证用户所在国度或地区具备该法律条款。这样,自由软件许可证就不会给用户在法律之外添加额外的违反基本自由的限制。
要落实这些自由度,就应该保证:如果用户遵守许可证上的要求,那么这些自由度就必须是长久的,不可更改的。如果软件的开发者有权利随意修改已发布软件的许可证,那么该软件也不被视为自由软件。
自由软件许可证不得要求用户额外遵守哪些非自由软件的许可证。例如,自由软件许可证不得要求用户必须遵守“所有使用的软件的许可证”。因为用户可能使用非自由软件,而要求用户遵守全部使用的软件的许可证则意味着需要遵守非自由软件许可证,这样的要求将被视作非自由的。
最后请注意,在实践中,本文中提及的各种关于自由软件的界定标准都需要仔细思考后再做出解释。在决定一个软件许可证是否是自由软件的时候,我们会仔细查看该许可证的内涵和行文是否符合本文中涉及的原则,由此决定许可证是否为自由软件许可证。如果许可证中包含了一些不合理的限制,哪怕这些限制没有在本文中提及,我们也会拒绝承认它是自由的。有时候,某个许可证可能会引起一场大讨论,甚至需要专业律师参与。这时候,我们往往需要仔细定夺之后才能给出结论。遇到这样的许可证,在做出结论之后,我们很可能会更新本文,把之前没有考虑到的因素添加进来。
如果您真的需要自己创造一个新许可证,那么我们会尽力帮助您。在我们的帮助下,我们会保证您的许可证是自由的,并且帮助您避免一些常见的问题。
现在还有另外一伙人,使用“开源”一词来表达与“自由软件”类似,但不完全相同的概念。我们更倾向于使用“自由软件”这个词。因为一旦你看到自由二字,就明白了它所要表达的意思。而“开放”却从来不意味着自由。