开源软件并不都自由
2009 10 25 03:32 PM 2096次查看
分类:编程 标签:无
我不知道open source(开源)这个名词是何时提出的,只是伴随着它,有了free software,也有了免费软件和自由软件的说法。
GNU GPL(以下简称GPL)可以说是我知道得最早的一个自由软件许可证。在我学习C的时候,不止一次地看到书上对GNU Linux(以下简称Linux)的赞美,可虽然充满好奇,觉得GPL是个伟大的东西,但我却从未认真读过Linux的代码,而今也早已不感兴趣了。
在盗版横行的中国,那时的我对版权(无论copyright还是copyleft都)不甚了解。而现在不同了,我会觉得在自己的代码里掺杂了不符合其许可证的代码是件很肮脏的事,写起程序来都觉得不心安理得。
像我这种没什么购买力的人,是不会为了软件去付款的。
我可以使用盗版软件(虽然现在我的电脑里已不存在),但我不希望在自己的程序里使用盗版软件。这也是我放弃使用Microsoft Visual Studio(以下简称VS)的一个原因。当然VS也有免费版本,但似乎不能用于商业开发,并且我还有另一个原因去放弃它:太大了。
我不敢说国内99%的VS是盗版的,但绝对不会低于90%。
说到这里我不得不提一点,盗版是法律意义上的,而非内容意义上的:并不是你安装的是正版软件(或其精确拷贝),那么你使用的就是正版软件。举例来说,如果你同学购买了一款只可以给一台电脑使用的商业软件,你问你同学借了过来,装在自己电脑上,那么这也是盗版,因为你违反了其许可协议。
几乎所有的闭源软件都只向用户开放了使用权,而限制用户对其进行逆向工程、修改和重新发布等。
从这个意义上来看,国内不少下载站点未经许可就对闭源软件进行打包(甚至生成自己的安装版本),加入自己的下载说明,也是一种侵权行为。
相对于闭源软件,开源软件一般都向用户开放了使用、获取软件及其源码、查看、修改和重新发布的权利,这是它们之间本质上的区别;而是否为商业软件、是否收费与其完全无关。
基于这点,几乎所有的开源软件都标榜自己是自由的。
然而用户拥有权利,并不代表不受限制(承担义务),这也是我认为开源软件并不都自由的原因。
当然,初中的政治课上就被教育过,自由是相对。想要在某个方面获得自由,就必须在另一个方面丧失自由。举例来说,人有在这个世界上生存的自由,因此也丧失了随意杀死别人的自由。
可这并不能为某些开源软件进行辩解,因为权利和义务之间还存在着很多并不完全对立的地方。例如,你有生存的自由,可是你没有钱,不能在中国吃饱穿暖住房,生存的自由受到了极大的限制;你有权问政府要低保,维持基本的生存,但你仍然没有权利要求政府送给你一套房并承担其物管费。
也就是说,这种情况下,你只有基本的权利,没有完全的权利——而有些开源软件正是只给你基本的自由。
例如占据开源软件半壁江山的GPL,它看上去很自由,实际上却限制了用户使用、修改和重新发布的权利。
在使用GPL许可证下的软件时,如果引用了它的类库(甚至使用了其中一小段源码或其衍生、修改产物),那么使用它的代码也必须以GPL发布。(对于这点,使用动态链接到GPL的库在法律上有些争议,但判决上仍倾向于保护GPL。)悲剧的是,如果你的软件有一小部分用到了GPL,那么其他部分也会被迫以GPL发布。(值得注意的是,连闭源软件都不存在这种限制行为。)
而对于修改,你必须免费提供你修改的代码,并将其免费发布。
对于发布,你不能只发布二进制代码,而不免费发布源码;你也不能添加强制条款,以保障自己或其他人的权益(GPL v2新增);未经其他所有贡献者的同意(这几乎是不可能的,你甚至都不知道怎么联系他们),你不能修改其许可协议。
一个很明显的限制就是,如果我想去使用一个GPL许可下的库,但是我的软件的其他部分是闭源的,那么我不得不放弃它,或者将自己的闭源代码以GPL许可开源。
对于卖商业软件的人来说,后者几乎是毁灭性的灾难。因为他们可能没有多余的资金去卖服务,而免费提供源码也几乎断送了其卖软件的财路。
顺带一提,著名的Linux和GCC编译器都是GPL许可的,但我们可以自由地去使用它们。
原因很简单,我们并没有对其进行修改和引用,而仅仅是使用。
甚至在使用G++的STL时,我们明确地引用了其类库,但该库文件是单独以LGPL发布的,仍不影响闭源软件对其的使用。
从这个例子就可以看出,LGPL对于GPL的扩充是多么重要的,因为它允许在不修改其源码的前提下使用其类库,而无需以LGPL许可开源。
假如G++的STL是GPL发布的,那么用到STL的闭源软件就不能用G++作为编译器了,这对G++的开发者和用户都将是一个巨大的损失。
当然,LGPL对修改和发布仍没有开放更多的权限。
于是当人们想使用LGPL的软件时,想对其进行稍许修改,以符合自己的设置或对硬件配置进行优化等情况时,他们仍不能不以LGPL免费发布他们的修改。
而这对于使用者也是很头疼的。
正因如此,我会优先考虑更自由的MIT、BSD或Apache等许可,因为修改过的产品我可以以非开源的形式发布(包括商业形式)。
这几种许可都是只需附上原许可证或协议即可,其中MIT是最宽松的,因为修改者甚至拥有随意修改许可的权限。
关于发布权,还有一点不得不提。
假设你的软件需要用到2个开源软件,分别是以A和B许可证发布的。其中,A要求所有的衍生作品只能以A发布,B要求所有的衍生作品只能以B发布。那么你的软件究竟该以A发布,还是以B发布呢?
很遗憾,你的软件是非法的,你无权发布。
而恰巧GPL和LGPL就属于这种类型的许可(虽然这2者间并不冲突),所以当同时使用GPL和MIT的库时,你必须以GPL发布(MIT被抹杀了)。
很多人不喜欢GPL的这种做法,于是提供了双重许可或多重许可。即将软件以多种许可形式发布,使用者可以用其中任意一种许可,来发布其衍生作品。
例如jQuery就是以MIT和GPL双重许可发布的,而PyQT 4则是GPL和商业许可双重许可的。
PyQT 4的这种行为很阴险地利用了GPL的限制:如果你用PyQT 4做开源软件,那么你使用GPL是没问题的;但如果你在做闭源商业软件,那么就不能选择GPL,而必须购买商业许可了。不过PyQT 4也正在转向LGPL,因为越来越多的人对GPL提出抗议了。
我很高兴越来越多人开始注意到GPL的不自由,而转向更宽松的许可。
就像GPL的不自由可以传染一样,自由也是可以传染的。
说到这里,我就不得不提Python了:它是非常自由的,以至于它本身是以Public Domain(公有领域)发布的。
什么叫公有领域呢?简单来说,它是全人类共有的财富,你可以以任意形式修改它。例如汉语就属于公有领域,你可以用汉语交谈、辩论、教书、写作等等等等,而无需担心有人向你收取汉语使用费,或告你非法使用了他发明的汉字、用他发明的语调讲话。
于是使用Python的开发者也倾向于用较为自由的许可来发布自己的代码,这点从大多数的Python库都是以MIT、BSD甚至公有领域等许可发布就能看出。
最后想说的是,开源和闭源并不是对立的。
如果没有闭源,那么商业开发的收入就会大大降低,开发者拿到的工资也会大大缩水,这也会影响开发者的积极性的。如果赚不够钱,谁还有闲工夫去向开源社区贡献自己的代码呢?
所以像GPL的宣称者那样敌视闭源,恨不得将闭源赶尽杀绝是很没有必要的。
我相信,程序员的天性是向往自由的,因此请勿在开源许可证上扼杀了软件的自由。
2011年5月2日更新:
该图转自《如何选择开源许可证?》。
向下滚动可载入更多评论,或者点这里禁止自动加载。