什么是自由软件?GNU工程

“自由软件”尊重用户的自由,并且尊重整个社区。粗略来讲,一个软件如果是自由软件,这意味着用户可以自由地运行,拷贝,分发,学习,修改并改进该软件。因此,“自由软件”是关乎自由的问题,与价格无关。要理解这个概念,你要按照FreeSoftware中的“Free”是指“自由言论(freespeech)”中的自由,而非“免费午餐(freelunch)”的免费这一意项。为避免歧义,在使用英文时,我们也会借用法语或西班牙语的“LibreSoftware”来指自由软件,这样可以明确表示我们说的不是免费。

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

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

“自由软件”不表示“非商业化”。与之相反,自由软件必须可以商用、可以商业开发、可以商业发布。这个政策非常重要—缺乏这样的政策,自由软件将无法实现自己的目标。

我们要邀请所有人使用GNU系统,包括商业机构及其员工。这就需要允许商用。我们期待许多程序的自由替代将来可以替换掉相应的专有程序,但是如果禁止商用就无法做到这些。我们期待商业产品包含有GNU系统的软件,并且成为商业发布定价的一部分。自由软件的商业开发不再那么不寻常;这些自由的商业软件非常重要。付费的、专业的自由软件技术支持填补了重要的需求空白。

因此,把商业使用、商业开发或商业发布排除在外会羁绊自由软件社区并阻碍其走向成功之路。我们一定要明确使用带有这种限制的许可证发布的软件不是自由软件。

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

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

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

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

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

“按照你的意愿”可以包含、可选择地包含、“完全不包含”(如果你希望如此)。所以没有必要再有一个单独的“不运行程序的自由”。

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

源代码的定义是人们进行修改时首选使用的程序形式。因此,开发者开发程序的形式就是开发者眼中的源代码。

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

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

自由之一有一个特殊的案例就是删除程序的代码让它不执行任何动作,或者让它直接调用另外的程序。因此,自由之一包含有“删除程序的自由”。

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

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

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

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

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

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

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

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

最后请注意,在实践中,本文中提及的各种关于自由软件的界定标准都需要仔细思考后再做出解释。在决定一个软件许可证是否是自由软件的时候,我们会仔细查看该许可证的内涵和行文是否符合本文中涉及的原则,由此决定许可证是否为自由软件许可证。如果许可证中包含了一些不合理的限制,哪怕这些限制没有在本文中提及,我们也会拒绝承认它是自由的。有时候,某个许可证可能会引起一场大讨论,甚至需要专业律师参与。这时候,我们往往需要仔细定夺之后才能给出结论。遇到这样的许可证,在做出结论之后,我们很可能会更新本文,把之前没有考虑到的因素添加进来。

如果您真的需要自己创造一个新许可证,那么我们会尽力帮助您。在我们的帮助下,我们会保证您的许可证是自由的,并且帮助您避免一些常见的问题。

现在还有另外一伙人,使用“开源”一词来表达与“自由软件”类似,但不完全相同的概念。我们更倾向于使用“自由软件”这个词。因为一旦你看到自由二字,就明白了它所要表达的意思。而“开放”却从来不意味着自由。

THE END
1.阅读源码的经验总结如何阅读第三方开源库 选择一些当下热门、学习价值高的第三方开源库,我认为最值得学习的第三方开源库是Volly,开源项目解析中也有对Volly的解析。 热门的第三方开源库,网上会有很多源码解析文章,首先在网上找一些源码解析文章来看看,不要忘记,我们的宗旨之一“高效”,这样就可以快速的对项目的整体框架有一个大体的了解https://www.jianshu.com/p/be86e5678252
2.如何学习源码如何学习优秀的源码如何学习源码 一、程序员的层次划分(本文只针对学习源码部分) 1、只关注项目本身,不懂就baidu一下。 2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。 3、找一些开源项目看看,大量试用第三方框架,还会写写demo。 (要解决什么问题?如何实现的?)https://blog.csdn.net/shengyin714959/article/details/142281091
3.如何较好的学习框架底层源码?都有自己的优势和特点,在国内TP确实用的很多,我想说的是具体学习哪个框架并不重要,我们需要选择一个安安心心的学好他的底层(如果您时间比较充裕的话,全部学习也是可以的,哈哈),因为你会了一个框架之后,其他框架你自学下很快就会上手,因为框架的核心思想基本是相通的,本文章我就拿TP来举例,我们如何学习他的源码呢https://www.imooc.com/article/284124
4.Vue源码学习之响应式是如何实现的vue.js最近接触了vue.js,一度非常好奇vue.js是如何监测数据更新并且重新渲染页面,这篇文章主要给大家介绍了关于Vue源码学习之响应式是如何实现的相关资料,需要的朋友可以参考下+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 前言 作为前端开发,我们的日常工作https://www.jb51.net/article/225377.htm
5.还不会Vue2.x源码本地调试!一前言由于自己最近准备学习vue的由于自己最近准备学习vue的源码,所以首先我得知道怎么样去本地调试vue得源码。后续也会把学习中遇到得问题、校验梳理成文章,也当作自己的学习笔记。 写在前面,我看的版本是"version":"2.6.14" 二、如何进行本地调试 首先我们找到vue2的源码地址进行本地clone https://juejin.cn/post/7081983962339508261
6.面向学生的.NET学习使用C#编程语言编程学习如何编写 C# 代码 嗨朋友们! 学习编码可能令人生畏。我们将随时为你提供帮助。 开始 获得认证 使用与freeCodeCamp合作进行的新基础 C# 认证,展示你的 C# 知识。该认证是全面的、可全球访问的,最重要的是,它是免费的,可确保世界各地的学习者都能从针对Microsoft Learn的可靠 C# 培训中获益。https://dotnet.microsoft.com/zh-cn/learntocode
7.RocketMQ消息积压,异步方案,缓存策略解决方案如何入手学习源码 最核心的一点就是查看官方文档 官方文档是所有技术中 最权威,最齐全的一个资料聚集地 有些翻译中文的网站,可能会做到更新不及时,所以还是建议直接看英文文档,借助翻译即可。也可以锻炼英文水平 首先要掌握这个技术的整体结构,有哪些功能特性,涉及到的关键技术、实现原理和生态系统等等。掌握了这些,对https://developer.aliyun.com/article/932643
8.idea看python源码mob64ca12f3496a的技术博客在上面的代码中,使用requests库获取API数据时,可以按住Ctrl并点击get函数,将打开get函数的源码,让你更好的了解它的实现逻辑。 第六步:理解和学习源码 在你打开Python源码后,仔细阅读代码及其注释,可以发现大多数库都包含详尽的解释。这会帮助你了解函数的功能与实现。 https://blog.51cto.com/u_16213443/12795867
9.源码时代成都IT培训重庆UIh5Java培训不敢去怎么办?毕业就拿近万元offer!现在的应届生都这么强?在源码毕业后,能进大厂吗?答案来了!狂欢7天7夜!源码时代11周年庆超燃来袭源码时代天府校区正式开课!2021源码时代课程更新、服务升级、就业加速:新价目标准将于4月1日正式执行 源码时代学习环境 硬核设施,舒适的环境,铸就你的美好未来https://www.itsource.cn/
10.人类高质量Java学习路线一条龙版做一个完整的项目的确很不容易,建议大家根据自己的时间、兴趣选择较新的、有配套源码的教程,保持耐心。 如何选择编程学习资源,可以看下我的原创文章:https://mp.weixin.qq.com/s/mlMql9RJCd7THt6rpGb8UA 下面推荐一些优质的、较新的项目实战视频教程 + 50 套项目源码。 https://xie.infoq.cn/article/a9fd4615c281e8ca41840ce37
11.北京大学金芝教授受邀出席云南省金芝专家工作站揭牌仪式并作学术金芝教授作源代码表示学习的报告 揭牌仪式结束后,金芝教授主要围绕源代码表示学习为软件学院师生作科研报告,详细介绍了深度学习技术如何赋能源代码分析工作。金芝教授通过主题突出的精彩报告,围绕代码表示学习发展历程及其重要意义和代码表示学习方法等方面同师生们进行了深入交流和研讨互动。针对师生提问,金芝教授给予了深入详http://www.sei.ynu.edu.cn/info/1056/2111.htm
12.macd指标背离公式源码(学习)博客macd指标背离公式源码(学习) 一、MACD顶底背离副图 DIFF:EMA(CLOSE,12) - EMA(CLOSE,26);DEA:EMA(DIFF,9);MACD:2*(DIFF-DEA),COLORSTICK;A1:=BARSLAST(REF(CROSS(DIFF,DEA),1));B1:=REF(C,A1 1)>C AND REF(DIFF,A1 1)A2:=BARSLAST(REF(CROSS("KDJ.K"(9,3,3),"KDJ.D"(9,3,3)),1))http://blog.eastmoney.com/yudi010/blog_220210785.html
13.助记词盗u秒u源码转地址转私钥可直接对接假钱包app端源码仅供学习交流使用,一切法律后果均与本站无关。 助记词转地址 + 余额更新 + 一键账号余额一键归集 大于多少u自动转走 可直接对接假钱包,具体方法已经写在教程里了 教程 本系统集合助记词转地址 + 余额更新 + 一键余额一键归集 安装教程php7.2 mysql5.6 php安装gmp扩展 安装nodehttps://www.jianshu.com/p/https://yiqucode.com/qukuailian-3696.html
14.Git--distributed-even-if-your-workflow-isnt Git is afree and open sourcedistributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git iseasy to learnand has atiny footprint with lightning fast performance. It outclasses SCM tools https://git-scm.com/