
GPL 与自由软件扫盲
很久之前就想写这么一篇文章了,正好最近没怎么折腾别的东西,可以挤出时间来写 GPL 的事情。
目录
什么是 GPL
GPL 全称 GNU General Public License,翻译过来就是 GNU 通用公共许可证的意思。到目前为止一共推出过三个版本,最新版是 V3。是一种还算主流的自由软件许可证。
FSF/GNU 对于自由软件的定义是这样的(原文链接):
- 自由之零:无论用户出于何种目的,必须可以按照用户意愿,自由地运行该软件。
- 自由之一:用户可以自由地学习并修改该软件,以此来帮助用户完成用户自己的计算。作为前提,用户必须可以访问到该软件的源代码。
- 自由之二:用户可以自由地分发该软件的拷贝,这样就可以助人。
- 自由之三:用户可以自由地分发该软件修改后的拷贝。借此,用户可以把改进后的软件分享给整个社区令他人也从中受益。作为前提,用户必须可以访问到该软件的源代码。
GPL 既然属于自由软件许可证,那么采用了 GPL 的软件就提供给使用者以上的这四种自由。
为什么有自由之零?
自由软件曾经的定义是三大自由而不是四大自由,也就是没有最上面一条。然后 FSF 的人们很快就发现了运行软件的自由也很重要。像各种专有软件往往就不提供这种自由,例如,把 Windows 家庭版用于商业用途就是不被允许的。
由于这种自由太过重要,它的位置肯定要在别的这三个自由之前。与此同时 FSF 也不希望在网络上同时出现两种不同的“自由之一”“自由之二”等,于是他们想了“自由之零”这个说法。恰好程序中往往也采用零而不是一表示数组中的首个元素,真是一个美妙的巧合。
GPL 同时也是一个 Copyleft 许可证。这个概念非常重要,GPL 之所以独特就是因为 Copyleft 这个概念。
Copyleft 是无版权主义吗
如果按照字面意思去理解的话,大概率会觉得,Copyleft 就是没有版权,就是无版权主义。这是一个非常大的误解,其误解之大以至于很多相对权威的资料来源也认为 Copyleft 属于“无版权主义的重要组成部分”。
事实上 Copyleft 压根不是无版权主义。恰恰相反,Copyleft 的核心就是 Copyright。没有版权就没有 Copyleft。
在下一个小节中我们会详细介绍它的原理,现在我们还是先来看看 Copyleft 是什么。
Copyleft 指的是一种实践,它要求一个自由的作品的衍生作品继续保持自由。有人会把这个特点形容为“传染性”,这同样也是一种误解,当你看到 Copyleft 实际的工作原理的时候你就知道为什么这个说法不对了。
当然,Copyleft 仅仅作为一个概念是无法实施的,如果要实施则需要许可证。在软件领域常见的 Copyleft 许可证有 GPL(包括 AGPL 和 LGPL),MPL,文艺领域则主要是由 Creative Commons 发行的 BY-SA 许可证。
可能会有人觉得 Copyleft 过于激进了,这和 Copyleft 最初的意图有关。FSF/GNU 提出 Copyleft 的主要目的在于把那些不想开发自由软件的开发商挡在 Copyleft 的代码之外。他们要么接受 Copyleft,要么就只能对着现成的解决方案干瞪眼。
Copyleft 如何工作
前面我们已经提到,Copyleft 的核心是 Copyright,并不是反版权。把 right 变成相反意义的 left 主要在于抨击用版权作恶的公司而不是版权本身。
首先需要意识到,你写下的任何东西你都享有版权,其他人不可以随意使用。如果他们随意使用,则这是在侵犯你的版权。
而 Copyleft 的本质是一种有限授权,在 Copyleft 的体系中存在责任和权利。以 GPL 为例,“衍生作品也必须以 GPL 发行”其实是一种责任,只有在被授权方履行该责任的情况下他们才能够享受 GPL 中所授予的权利,即对你的受版权保护的作品的使用权。
如果被授权方拒绝履行该责任,那么后果很简单:GPL 就不会提供给他们授权。如果这个时候他们依然在使用你的作品,那么他们就侵权了,因为你的作品收到版权的保护。
如果你能看明白上面的这个流程,那么这两个常见误解错在哪里就很好理解了。如果没看懂也没关系,可以再多看几次,也可以直接看下面的内容,把两段文字放在一起说不定就明白了。
首先,Copyleft 不是反版权。如果没有版权,那么 Copyleft 所设想的“衍生作品依然需要保持自由”就无法实现。你之所以可以要求衍生作品保持自由,核心就在于衍生作品是基于你的受版权保护的作品的,如果没有你的明确授权,没有人可以(至少理论上是)使用你的作品。
只有衍生作品同意保持自由,你才将你的版权授权出去,这就是 Copyleft 的原理。
其次 Copyleft 并没有“传染性”。如果有人把衍生作品修改为专有的,那么他们就不会得到授权,也就是说对方侵权了。
可是,对方侵权了又怎么样呢?还是以 GPL 为例,对方侵权之后,唯一产生的后果就是 GPL 的条款被违背了。除此之外,在你决定打官司之前,不会有任何后果。GPL 并不能像病毒那样,在某个程序碰了含有 GPL 授权的代码之后就自动“砰”的一声全部变成由 GPL 授权的自由软件。
如果你打了官司,那么大概会判对方侵权了。侵权的解决方法就是停止侵权。比较理想的情况是 GPL 被强制执行,对方的软件被强制转换成 GPL 授权。但如果执行的结果只是对方被要求删除全部侵权代码,也并没有违背什么基本原则。
GPL 可以商用吗
另外一个非常常见的误解是 GPL 不能用于商用,或者对商用不友好。误解的来源主要是对于商用的狭隘理解,许多人会觉得,商用就代表专有,“闭源”(开源/闭源和自由/专有其实是两个不太一样的体系,分别代表了两种不同的思维模式。很快我们会讲到这件事情,这里说闭源只是为了方便理解)。
但其实不是这样的。我们还是来看看自由之零是怎么说的:
- 自由之零:无论用户出于何种目的,必须可以按照用户意愿,自由地运行该软件。
看出什么端倪了吗?没错,“按照用户意愿,自由的运行该软件”是包括商用这种行为的!
如果一个软件不允许商用,那么它其实就不再是自由软件了,因为它限制用户使用该软件的方式!
GPL 不仅允许商用,还必须允许商用,否则就不是 GPL 了。此外 GPL 还允许你把软件拿去卖钱,当然也允许任何拿到拷贝的人拿去卖钱。
真正会觉得 GPL 不友好的是那些黑心公司,也就是那些想把自由软件变成专有软件的公司。MIT 许可证对这些黑心公司也很友好,所以我们可以看到大公司的开源项目往往都是 MIT。较新的开源项目也往往使用 MIT 而不是 GPL 之类的许可证,这涉及一个很有意思的问题,就是 Copyleft 的要求有没有限制人们的自由。
这个问题比较复杂,我倾向于认为没有,但是谁知道呢。不细讲了。
自由和开源的区别
这两个东西很像,但并不是一种东西。首先开源也有官方的定义,The Open Source Definition,很长,而且并不像自由软件的定义那样有官方的中文翻译,我就不贴了。
FSF/GNU 觉得“开源”这个概念有一些问题。最大的问题其实是望文生义。“开源”,就是能看见源代码嘛!当然如果你点进去上面那个链接就会发现人家第一句话就写了“开源并不仅仅代表着可以访问源代码。”(Open source doesn’t just mean access to the source code.)
也就是说有许多软件其实并不开源,只是能看见源代码的“假开源”。最典型的例子(其实只是我现在唯一能想起来的例子
)就是宝塔面板。那更不要提自由软件了,连个边都够不上。
然后就是开源的定义比自由软件要宽松一点。这个纯粹就是 FSF/GNU 的个人偏好了,毕竟人家是自由软件基金会,总不能不去挺自己家的东西吧。当然事实是有那么一小部分的开源软件确实不是自由软件。
自由软件和开源软件代表了两种完全不同的方法论,其中自由软件更多注重软件是否自由,而开源软件更多注重软件是否实用。前者的代表是 GNU 和 GPL 许可证,而后者的代表则是 Linux 和 MIT 许可证。(注:以上纯属个人想法)
不难看出为什么现在大家往往都说“开源软件”而不是“自由软件”,尽管后者出现的时间比前者早,人们还是喜欢能用的软件。
FOSS 又是个什么东西
后来有一些喜欢自由软件的人看不下去了,于是发明了 FOSS 这个说法,意即 Free and open source software,又是自由软件又是开源软件,这下总可以皆大欢喜了吧!
然后嘛就是万恶的英语拿了 MVP。众所周知 free 这个单词又有自由又有免费的意思。大部分语言对于这两个意思,就算有同义词,也往往会有一个单独的词分别描述其中一种意思。英语里确实有 gratis 专门用来表示免费的意思,但却没有单词只用来形容自由这一含义。当然我们说的是形容词,名词还是有的,freedom,奈何我们这里要的不是名词。
然后就是一大堆人,嘴上说的是 FOSS,其实脑子里面想的是“免费”开源软件。特别是翻译成中文后特别明显,清一色的“本软件免费且开源”。不是说这样的软件就不好,但是确实使“自由软件”这个概念陷入了十分尴尬的境地。
结果就是,有的时候会从法语里面借一个词 libre。要么就是 free (as in speech)……
扯远了,总之开源软件和自由软件是两个非常不同的概念,不要搞混了。
作者可以违反 GPL 吗
如果你真的理解了 Copyleft 的模式的话相信你一下子就可以说出这个问题的答案。没错,答案很令人沮丧,但事实就是软件的作者自己无论如何也不可能违反 GPL。
软件的作者对自己的作品享有完整的版权,根本不需要由 GPL 提供授权。也就是说作者自己完全可以把自己的 GPL 软件以专有许可重新发布。或者发布一个 GPL 的版本,然后向黑心公司售卖专有的版本也是可以的。
这样的行为违反了 Copyleft 的初衷,但很遗憾这不违法。我们从道义上谴责这样的开发者,但不管怎么说,对于作者自己,根本就不存在违不违反 GPL 这样的概念。
GPL 里可以加东西吗
网络上有一种臭名昭著的东西叫 fine-print,也就是在某些不起眼的地方放的一行小字,最常见的就是各种”图片仅供参考“。
GPL 里是不允许放这种小字的。很多人在想到 GPL 的时候往往会忘记一个很重要的事实:GPL 其实是 FSF/GNU 的作品。也就是说 GPL 的许可证文本本身也是有版权的!而且大概率和你的想象不同,GPL 本身所采用的并不是一个自由许可证(比如 GNU FDL 之类的东西),而是一种逐字复制许可证,禁止一切修改。
没有人阻止开发者使用双重授权,即在 GPL 之外再添加一个别的什么授权以添加更多的限制。可能这些限制会导致 GPL 的某些条款无效或者被违背,但就想我们刚刚所提到的那样,作者本人不受 GPL 制约,他想怎么授权就怎么授权。但是可以肯定的是,GPL 本身是不允许被修改的。
LGPL 和 AGPL
除了 GPL 之外还有两种变体,一种叫 LGPL,一种叫 AGPL。
LGPL
全称为 GNU Lesser General Public License,直接翻译过来的话就是“少一点的”通用公共许可证。
和 GPL 基本上是一致的,不过 LGPL 允许将该作品以库的形式集成在另一个作品中,且在这种情况下无须将该作品以 LGPL 重新发行。不是说 GPL 就不允许以库的形式集成,但对于 GPL 来说,这种情况下使用该库的软件需要以 GPL 发行。
AGPL
AGPL 的全称是 GNU Affero General Public License,不过第一个版本不是 GNU 的而是 Affero 的。这解释了 Affero 翻译不出来的原因,因为这曾经是另一个基金会的名字。
AGPL 比 GPL 更强一点,主要是反击 Google 曾经大量的钻 GPL 的空子,使用 GPL 授权的源代码提供网络上的服务而不公开这些内容,因为 GPL 所说的发布不包含使人们使用服务器上的服务。
AGPL 堵上了这个漏洞。使用 AGPL 授权的软件,哪怕只是用来提供互联网服务,也需要根据条款以 AGPL 再授权并向使用者公布源代码。
结果就是 AGPL 很少有软件用,除了真心喜欢自由软件的那些人。
Windows 上的 GPL 软件
GPL 要求所有的库都以 GPL 重新授权并发布源代码。
这在 Windows 上(也包括 macOS,甚至某些 GNU/Linux 发行版)是不现实的。比如,你的软件依赖 shell32.dll。你无论如何也不可能提供 shell32.dll 的源代码,更不可能以 GPL 授权这个东西。
GPL 中有许多例外,其中一个就是系统库例外。如果你的软件依赖于某些系统库,那么你无须在意这些系统库的授权。这使得发行针对 Windows 的 GPL 软件成为可能。
GPLv3 相较于 v2 多了什么
v3 主要是堵上了一个名字叫作 tivoization 的漏洞,这个名字来源于一家名叫 tivo 的厂商。
当时 tivo 发行了一个使用 Linux 的设备。因为 Linux 使用的是 GPL,因此 tivo 向用户公布了源代码。这很好,但是问题在于,tivo 只允许用户在他们的设备上运行他们的官方版本。尽管 GPL 允许你修改软件,但 tivo 所做出的限制使得你无法在 tivo 自己的硬件上运行你修改过的版本。
GPLv3 堵上了这个漏洞。这个行为的争议很大,因为随着 GPL 的发展,这个许可证似乎越来越多的限制起了用户的自由,而不是给予他们自由。有一些人会误以为“很可惜 Linux 还没有升级到 GPLv3”,这个想法是错误的。
Linux 是刻意没有升级到 GPLv3。Linux 社区整体上采用的是开源而非自由软件的方法论,并不反感 tivoization 这样的行为。GPLv3 还堵上了通过使用大数组来提供实际上是二进制代码而非源代码的行为,而 Linux 内核中有非常多这样的“代码”。
GPLv3 开始和 Apache 2.0 这个许可证兼容。不要感到意外,GPLv2 实际上就是不兼容 Apache 2.0。
此外 GPLv3 扩展了系统库的范畴。以前的系统库只指代 C 库,例如 libc,msvc 之类的东西,而现在像 Python 这类语言中的内置库也被认为是系统库,在 GPL 的软件中使用这些库时不需要担心授权问题。
