什么是自由软件?

来源 | www.gnu.org

编排 | strongerHuang

可能你认为免费软件,就是自由软件,那么你肯定错了,下面来听听专家怎么描述自由软件的。

strongerHuang

1

自由软件定义

开源(Open source)是另外一回事:它有基于不同价值观的非常不同的哲学。其实际定义也不同,但是几乎所有的开源程序事实上都是自由软件。

“自由软件”尊重用户的自由,并且尊重整个社区。粗略来讲,一个软件如果是自由软件,这意味着用户可以自由地运行、拷贝、分发、学习、修改并改进该软件。因此,“自由软件”是关乎自由的问题,与价格无关,软件如何定价并不影响它是否被归类为自由软件。

英文中,我们使用Free Software。由于Free一词既有自由,也有免费的意思。而Free Software中的Free是指“自由言论”中的自由,而非“免费”这一意项。为避免歧义,在使用英文时,我们也会借用法语或西班牙语的“Libre Software”来指自由软件。

我们支持软件用户的自由,因为我们坚信这是每个用户应得的。有了这些自由,软件用户,无论是个人还是集体,都可以掌控所运行的软件,并决定这些程序如何为自己服务。如果一个软件令用户失去了这种控制权,我们则称它为“非自由”的,或“专有”的程序。与自由软件相反,非自由软件会操控它的用户,而软件的开发者则掌控着软件。这使得非自由软件成为了非正义力量的帮凶。

strongerHuang

2

四项基本自由

如果一个软件是自由软件,那么它必须为用户提供以下四项基本自由:

自由度0:无论用户出于何种目的,必须可以按照用户意愿,自由地运行该软件。

自由度1:用户可以自由地学习并修改该软件,以此来帮助用户完成用户自己的计算。作为前提,用户必须可以访问到该软件的源代码。

自由度2:用户可以自由地分发该软件的拷贝,这样就可以助人。

自由度3:用户可以自由地分发该软件修改后的拷贝。借此,用户可以把改进后的软件分享给整个社区令他人也从中受益。作为前提,用户必须可以访问到该软件的源代码。

一个软件只有提供了以上所有的自由给它的用户,才可以被成为自由软件。否则,它就是非自由的。尽管我们也可以比较非自由软件为其用户提供的自由度,但是我们认为,无论如何,非自由软件本身是不道德的。

无论在哪种情况下,只有所有用户使用的代码都满足了这四项基本自由,该程序才能被视作自由软件。例如,有两个程序,甲程序运行的时候会自动调用乙程序。发布甲程序意味着用户必须使用到乙程序,那么必须甲乙两个程序都是自由的,甲程序才是自由的。如果通过修改甲程序,使其不再依赖乙程序,那么仅仅以自由软件的形式发布甲程序即可。

“自由软件”不等于“非商业软件”。一个自由软件必须允许商业用户、商业开发和商业发布。商业开发自由软件早就司空见惯了,这样的自由软件非常重要。你可能需要花钱购买自由软件的拷贝,也可能免费拿到。但是无论你如何获得你的拷贝,作为用户,你的四大自由都会被保证,你可以自由地运行,修改,发布甚至出售你拿到的自由软件。

假如获得自由软件拷贝的用户遵守了自由软件的许可证条款,那么该自由软件必须为用户提供自由软件的四项基本自由。在自由方面对用户加以限制或者要求付费才能实践这些自由和不赋予用户自由没有什么两样,因此这样的程序不是自由软件。

strongerHuang

3

澄清几点

在本节的以下部分,我们会进一步准确地解释这些自由针对各种问题会如何扩展才能使软件自由。

自由度0:无论用户出于何种目的,必须可以按照用户意愿自由地运行该软件。

“自由地运行程序”(自由度0)意味着任何人或组织可以在任何(支持的)计算机系统上,出于任何目的去运行该程序,并且没有义务通知软件的开发者或任何个人或团体。此处,用户的目的是重点,而非开发者的目的。如果你是该程序的用户,那么你就可以自由地运行该程序。同理,如果你把程序发布给别人,那么此人也成了软件的用户,他也可以出于自己的任何目的运行该软件。然而,你作为软件的发布者,不可将自己的目的强加于你的用户。

“自由地运行程序”意味着没有人可以禁止或阻止用户运行该程序。这和该程序的功能特性没有关系,既不考虑该程序在特定环境下的可用性,也不考虑该程序对特定计算的有效性。

例如,如果代码随意地拒绝某些有意义的输入——或者甚至无条件地失效——这就可能使该程序不那么有用,甚至可能完全无用,但是这并不妨碍用户运行该程序的自由,因此,这和自由之零并无矛盾。如果该程序是自由的,那么其用户可以克服这些无用之处,因为自由之一和自由之三允许用户和社区修改和发表不带有随意代码的改进版本。

学习和更改程序源代码的自由

自由度1和3(自由地修改软件;自由地发布修改后的软件)意味着用户必须有权访问程序的源代码。由此,访问源代码是成为自由软件的必要条件。混编(Obfuscated)后的“源代码”不是真正的源代码,不能被算作此处讨论的源代码。

自由度1(自由地运行程序)包括自由地运行自己修改后的程序以替代原版程序。如果程序是跑在某种设备上,该设备可以运行别人修改的软件但不运行你修改的软件—这个方法叫做“tivoization”或者 “锁死”,或者(用其发明者的术语)叫做“安全启动”—自由度1将被视为无法满足。该设备中的程序也将不被视为自由软件,即使它们的源代码是自由的。

倘若要修改某个程序,一种很重要的方法就是从别的程序中拿来现成的函数,或模块来使用。如果某个程序的许可证中禁止你使用其他合理授权的软件的代码来修改该程序—比如,如果某个程序的许可证要求你只能使用你拥有版权的代码—那么这个程序的许可证将不被视为自由软件许可证。

对软件的修改可能是出于各种目的。某个特定的修改究竟是好是坏,这本身是个非常主观的事情。自由软件许可证不能对用户修改软件做任何限制,例如,不能仅仅因为某人觉得哪处修改不够好,就禁止用户自己做这个改动。

自由度2:用户可以自由地分发该软件的拷贝。

自由分发(自由度2和3)意味着你(即,软件用户)可以把软件原版或修改版再发布给其他用户。你可以免费发布,也可以收取费用。软件可以发布给任何地方的任何人。所谓“自由”,意味着你的这些行为(发布软件原版或修改版给其他用户;或其他自由度中提及的行为)不必事先征得任何人的许可,也不必为此额外支付任何费用。

用户可以自由地运行该程序或对程序进行修改。如果仅仅私下自己修改或运行该程序,那么你没有义务将该行为公开给任何人。如果你发布了自己修改后的程序,那么你也没有任何义务将该修改行为告知给哪个或哪些指定的人或组织。

自由度3允许用户自由地发布软件的修改版。自由软件不一定要求修改版必须继续采用自由软件许可证。换句话说,自由软件许可证可以不必是copyleft许可证。但是,如果一个软件许可证要求修改后的软件必须以非自由软件的形式发布,那么该许可证则不被视为自由软件许可证。

“自由地分发软件的拷贝”意味着必须允许用户自由地发布软件的原版或用户自己的修改版。无论那个版本,用户都可以选择发布程序的二进制或可执行文件,也可以发布程序的源代码。(以可执行文件的形式发布程序可以让人方便安装,这一点对于推广自由软件也至关重要。)对于某些程序,也许无法或者不必发布二进制或可执行文件(一些编程语言的实现可能并不支持,例如某些脚本语言),但是用户必须有权利以任何方式生成二进制或可执行文件,并且发布这些生成的软件。

Copyleft(公共版权)

当然,只要不违背这些核心自由,自由软件许可证也可以额外添加一些要求,限制软件的分发步骤。例如,copyleft就是常见的一种限制。简言之,copyleft要求软件的修改版必须同样以自由软件的形式发布。这条限制与核心自由并不冲突,相反,copyleft可以用来很好地保护软件用户的自由。

strongerHuang

4

打包和发行的详细规则

自由软件可以对修改版的打包或分发方式做一定的限制。这些限制不得与前面提到的四大自由相矛盾,不得直接或间接地限制用户运行,修改或发布软件。例如,某些自由软件可以要求修改版不得使用软件的原有名字发布;不能使用软件的原有商标;必须标明软件来自谁的修改等等。只要这些限制不会明显地限制用户再发布软件的修改版,那么它们就是可以接受的。既然已经对软件修改了,那么你估计也就不会在乎针对这些额外的小限制再做一点修改了。

同理,自由软件也可以要求用户“如果以这种方式发布,那么用户必须也可以从另外某一渠道获得”。比如,某个自由软件可能会要求如果发布了修改版,那么必须也要给原作者一份修改后的拷贝。(注意:此处前提是软件必须发布,用户可以私下修改软件而不发布,这样也就不必把修改版发给开发者了。)另外还有一些规则也不会与自由软件原则冲突,比如软件可以要求修改后的版本发布时需要附带相应的原版软件的代码。

有一些特例需要额外讨论:如果某软件许可证要求修改后的软件必须修改可执行文件的名字,那么必须保证软件运行的环境允许修改文件名或具备某种别名机制,否则该要求将被视作与自由软件原则相背。因为软件的可执行文件可能会被其他第三方软件调用,而文件名则是这种调用的基础。别名机制可以保证用户在遵守该要求的前提下,顺利将原版软件替换成修改版,并且不会影响依赖该软件的第三方程序。

strongerHuang

5

出口条例

一些政府的出口限制或贸易制裁可能会影响到软件用户在国际范围内发布软件的自由。软件开发者也许没有能力去改变这些现实,但是我们可以拒绝自我审查。自由软件的开发者不得在软件许可证中要求用户遵守哪条特定法律,因为开发者无法保证用户所在国度或地区具备该法律条款。这样,自由软件许可证就不会给用户在法律之外添加额外的违反基本自由的限制。

当然,自由软件可以仅仅在许可证中提及某条出口条例或相关法律,而不强制要求用户遵守。这样做只是为用户提供了信息而没有实际限制用户。如果某条出口限制法律是普遍存在,全部用户所在的地区都做出该限制的,那么在许可证中要求用户遵守该条例也不会被视为限制用户的自由。然而,这会存在潜在问题:一旦该条出口限制法律在某个用户的所在地区做了修改,那么该许可证也就不被视作自由的。

strongerHuang

6

法律考虑

要落实这些自由度,就应该保证:如果用户遵守许可证上的要求,那么这些自由度就必须是长久的,不可更改的。如果软件的开发者有权利随意修改已发布软件的许可证,那么该软件也不被视为自由软件。

自由软件许可证不得要求用户额外遵守哪些非自由软件的许可证。例如,自由软件许可证不得要求用户必须遵守“所有使用的软件的许可证”。因为用户可能使用非自由软件,而要求用户遵守全部使用的软件的许可证则意味着需要遵守非自由软件许可证,这要的要求将被视作非自由的。

自由软件许可证可以指定与软件相关的诉讼需要遵守哪个地区的法律,或需要在哪里提起诉讼。

strongerHuang

7

基于合同的许可证

绝大部分自由软件许可证是基于版权的。基于版权,能采取的限制往往相对有限。如果一个许可证基于版权并且遵照上述的自由软件原则,那么它很可能被视作是自由软件许可证。当然,我们也见过一些例外,不过这些还很少见。然而有些自由软件许可证是基于合同的。合同可能会有更多的额外要求。这就意味着基于合同的许可证可能会在很多不经意的地方违背自由软件原则,导致软件不被视作自由软件。

很遗憾,我们无法列出所有可能的意外情况。如果一份基于合同的许可证对用户做出了一些额外限制,并且这些限制是不可能包含在一份基于版权的许可证中的,那么我们就需要再三考虑它是否可以被视作自由许可证。很多情况下,这些许可证都是非自由的。

strongerHuang

8

其他

除了以上描述的内容,还有一些需要注意的,比如:

  • 在谈论自由软件时使用正确的词汇

  • 如何诠释这些标准

  • 获得关于自由许可证的帮助

  • 软件之外的手册文档

  • ······

关于自由软件,GNU进行多次修订:.

03232a1d06fb3e483deca9b542a07a98.png

------------ END ------------


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

0096a3c2123d6a5617adbd123b7776d2.png

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

毕业设计| STM32F103全彩FFT音乐频谱+LED年历闹钟显示

大家好,我是写代码的篮球球痴,今天在后台看到有人想找毕业设计的点子。然后我今天刚好看到一个不错的点子,给大家分享看今天分享的毕设是来自点-凡自制的FTF音乐频谱制作,先来看展示效果:——视频出处:B站点…

VScode 开发stm32无法识别uint32_t,uint16_t,uint8_t问题

1、添加头文件#include “stdint.h”。 2、在c_cpp_properties.json文件中添加__CC_ARM即可。如下图:

毕业这几年的嵌入式开发之路

大家好,我是写代码的篮球球痴今天分享一篇文章,这篇文章的主人公总结了他这些年来的嵌入式之路,希望对大家的职业规划有所帮助。在毕业即失业的年代,来看一位朋友是如何玩转嵌入式开发的,献给迷惘的你。出师不利本科毕…

修改Win10 alt+F4默认选项为关机

1、winr打开路径计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced,当前目录下新建DWORD(32位)文件,命名为“Start_PowerButtonAction”。设置值为2(16进制)。 2、重启电脑。altF4默认为“关…

p1968

我觉得这个评测机和我有仇,写了readgetchar都会超时这么多,最后好像是ios::sync_with_stdio(false);惹的祸... 昨天想找一些水题来写,就看到了这个模拟"水题",想了一下午都不知道怎么搞. 已知一些牛的颜色和位置,求连续相同颜色或连续两种颜色数量相同的区间右端点位…

免费!200块全志XR806开源鸿蒙开发板试用

一板难求的当下,如果上天突然降临一次开发板免费用的活动,我只想说三个字:手慢无!为了让开发者小哥哥小姐姐们体验搭载安谋科技STAR-MC1处理器,面向IoT领域的全志XR806开发板,极术社区特推出2022年新年活动…

你们还留恋windows什么呢?

为什么80%的码农都做不了架构师?>>> 我最近看到一个报道,节录如下: --------------------------------------------- ARM全球总裁Tudor Brown 5月3日表示,预期2015年全球移动PC总量就会达到7.5亿台以上, …

卓老师的这些动图对电子理解真的很有用

01 串行通信在头条电子森林博客中看到一些显示电子系统中信号波形的动图,有助于帮助我们理解传输的机理。特转载如下。1、SPI传输▲ 图1 SPI 数据传输▲ 图1.2 SPI数据传输(2)▲ 图1.3 SPI时序信号2、I2C传输▲ 图1.2.1 I2C总线以及寻址方…

bootscripttable前端排序无效_前端你应该知道的八条bug分享给你们

1: 为什么列表的数据不要让后端同学返回对象, 而应该返回数组?返回对象我们前端直接遍历有没问题啊, 可以正常显示,那是因为你没有遇到下面描述的情况bug现象1:「我明明把3这个key定义在了第二个位置, 但是每次打印出来…

干货|手把手教你自制六足仿生机器人

摘要:经过大一那次失败之后,我决定暂时停止该项目的开发,转而先去学习那些有关嵌入式开发的基础知识,等以后有能力的时候再去独立完成这个六足机器人。很幸运的是在我大学本科即将结束的时候,我已掌握了足够的知识来完…

STM32F4 HAL 库开发报错:Hal_StatusTypeDef is undefined的解决办法

1、直接在头文件出添加#include "stm32f4xx_hal.h"即可。

Comet:基于 HTTP 长连接的“服务器推”技术

http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ “服务器推”技术的应用 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。 传统模式的 We…

lol最克制诺手的英雄_LOL:哪些英雄之间非常克制,不管怎么打,遇到就输了?...

大家好,我是你们的老朋友小黑君。在英雄联盟里,英雄们总有克制或者被克制的英雄,就比如“剑魔克制阿卡丽”,尤其是接下来我们要说的这几对,在对局中遇到基本上就输了!冰霜女巫克制妖姬冰霜女巫的出场率一直…

聊聊内卷之下,直博和读完硕士再读博该怎么选择?

大家好,我是写代码的篮球球痴,转发一篇考研读博的文章,希望对大家求学生涯有所帮助。大家好,我是千与千寻,在上一篇推送之中,我们讨论了,五年之内博士是否会出现内卷,阅读量相当的高…

Android 位置服务——BaiduLocation的使用

Android 位置服务——BaiduLocation的使用 原文:Android 位置服务——BaiduLocation的使用版权声明:本文为博主原创文章,欢迎转载,转载请在文章显眼处说明文章出处并给出连接。 https://blog.csdn.net/To_be_Designer/article/details/486854…

asp.net通过登录后修改个人信息_微信号终于可以修改了!快来改一个

上周,微信在安卓端开启了“修改微信号”功能的灰度测试,这也预示着这项新功能很快就能和我们见面了。果不其然,就在刚才微信正式上线了修改微信号的功能,大家期盼多年的功能终于上线了!!!安卓用…

会唱歌的路

文 | 贰沐编辑 | 贰沐 子鱼会唱歌的路?!是什么意思?是说路会自己唱歌吗?开车行驶在普通的道路上,我们能够听到“嗡嗡”的各种杂乱无章的声音,而在有些特殊的路上,我们可以听到路面在发出有节奏的…

那些年,我和发哥在恒大的日子

在广州上班那会,我们在恒大中心旁边的利通大厦上班,我和薛总每天一起上下班,那时候宿舍还有盼盼,有时候玩开心的时候,我就会跟他们说,等过了很多年后,我们要写一本说,书的名字就叫做…

KEIL高级调试——条件断点

在线调试程序时,打断点是非常有效的一种方式,配合单步调试,可以快速定位问题。但是有时候,手动打断点用起来不是那么方便。比如想要在一个循环的第N次停下来,如果手动打断点,那就要不停的点击单步运行&…

emailjava中怎么校验_Java使用注解实现参数统一校验功能

在项目开发中,当使用配置文件的时候,需要对一些配置参数进行合法校验,如果不存在则会抛出异常或者提醒用户重新修改配置文件后运行系统。 以前的做法就是读取到配置文件后,每个配置项挨个检查,写多个if判断是否存在问题…