大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是关于开源软件协议基本知识

  牛顿曾说过:“如果我比别人看得更远,那是因为我站在巨人的肩上”。在软件开发中如果说也存在巨人的肩膀让我们站,我想这个巨人应该就是开源软件。一个优秀的软件开发人员应该能够善于学习和利用开源软件来加速自己的开发,而为了正确地使用开源软件,我们必须要了解开源软件协议,今天我们就来聊一聊开源软件协议这个话题。

1.开源软件是什么?

  所谓“开源软件”(open-source software),字面上理解就是开放源代码的软件,即在软件发行的时候,附上软件的源代码,并授权允许用户更改/自由再散布/衍生著作权。

  开源软件通常是有copyright(著作权)的,它的License(许可证)可能包含这样一些额外的限制: 刻意的保护它的开放源码状态,著者身份的公告,或者开发的控制。

  提及开源软件,通常会想到两个形容词:免费、自由。开源软件大多是免费的(但也并不排斥商业收费),开源软件的使用往往也是相对自由的(自由度取决于其License)。因此常常会与开源软件造成混淆和误解的有另外两个概念:“免费软件”、“自由软件

  • 免费软件:免费提供给用户使用的软件,通常并不包含公开其源码的内容。
  • 自由软件:在反著作权,倡导软件这种知识产品应该免费共享的思想下诞生的软件,当然必须是要开放源代码的。一个专用的名词copyleft(著佐权)就是用来形容这种软件。

  除了前面介绍的3种类型软件之外,还有一种概念:“商业软件”,即被用作商品以达到营利目的收费软件,这种软件一般不会包含源码,并且受各种严苛的版权限制。

  从上面的介绍可以看出,自由软件与商业软件是完全对立的,而开源软件就是自由软件与商业软件的折中,它既继承了“自由软件”所提倡的知识共享的理念,同时又允许人们以专利的形式从知识产品中谋取利益,从而保护了人们生产、创造知识产品的积极性。

2.为什么会存在开源软件?

  在讲为什么会存在开源软件之前,我们应该先讲讲商业软件(私有软件)到底有哪些弊端,下面是两点可能存在的弊端:

  • 不利于软件社会价值的发挥:如果一个软件已经开发完成,即意味着对软件开发所需要投入的社会资源已经全部付出了,底下就应该是软件回报社会的时候了,但软件私有限制了软件对社会的贡献度,导致一定程度的资源浪费。
  • 不利于对软件的使用和开发:从用户角度来看:软件私有是不利于其被进一步使用的,如果现有软件有不完善的地方,用户无法基于现有软件作少许改动以实现进一步需求;而从开发角度来看:软件私有意味着开发软件的只能是特定的一群人,很难轻易采集到广大使用者和二次开发者对软件发展的意见。

  既然存在开源软件,说明软件开源肯定能带来好处,那具体能帮我们解决什么问题呢?

  • 从用户使用的角度:使用户能根据自己的需要来使用、定制软件。
  • 从软件本身的角度:开源,让更多的人参与,更有助于软件的完善,开发出更优秀的软件。
  • 从软件行业的角度:极大的提高软件开发的生产力,我们能够自由的复用别人的开发成果,而避免重复劳动。

  总之,软件开源的目的是为了让软件能得到最大范围的使用。

3.一大波开源软件协议

  前面讲到,开源软件都是有License的,猜一下,迄今为止,世界上一共有多少种开源软件License?据粗略统计有上百种(GNU组织整理的开源协议清单),而通过OSI(Open Source Initiative)组织批准的开源软件协议目前也有60多种(OSI组织批准的开源协议清单

  虽然有这么多开源软件协议,但我们只需要了解其中最常用的几种就足够了,常用的开源软件License有如下6种:

  • MIT(The MIT License):源自麻省理工学院,又称“X条款”(X License)或“X11条款”(X11 License)。
  • BSD(Berkly Software Distribution):源自加州大学柏克利分校,最初是用于该校发表的各个4.4BSD/4.4BSD-Lite版本。
  • Apache(Apache License):著名的非盈利开源组织Apache采用的协议。
  • LGPL( Lesser General Public License):GNU组织制定的宽松通用公共许可证。
  • MPL(The Mozilla Public License):Netscape的Mozilla小组为其开源软件项目设计的软件许可证。
  • GPL(General Public License):GNU组织制定的通用公共许可证,由斯托曼撰写,最初用于GNU计划。

4.看懂常见开源软件协议

  前面介绍了6种常见开源协议的名称及由来,要去了解每个License具体限制(开放源码状态,著者身份的公告,开发的控制),我们可以去一句一句去读晦涩的License原文,但是还有更简单的方式迅速区分它们,下面是用于迅速区分的的5个特性:

  • 闭源允许:基于开源软件进行二次开发的衍生软件是否可以闭源?
  • 版权声明:修改过的开源软件文件是否必须放置原开源软件版权说明?
  • 品牌推销:衍生软件是否可以用原开源软件的品牌影响力进行推广?
  • 继承机制:基于开源软件开发的新增文件是否也需要采用原开源软件的License?
  • 改动申明:对开源软件文件的修改是否需要提供说明文档?

  按照以上5个特性,我们可以迅速将6种开源软件协议分类,详见下图:

  从开源软件的个人使用灵活角度来看:MIT是最自由最没有限制的,MIT协议的开源软件作者只想保留版权,其他方面任你自由发挥;而GPL限制是最严苛的,如果你用了GPL开源软件,那么你的软件也必须同样以GPL协议方式开源。

  从开源软件的社会传播影响角度来看:GPL最能推动知识共享,任何基于GPL开源软件开发的新成果,都能被大众轻易借鉴和分享;而MIT仅有助于分享开源软件本身的成果,基于MIT开源软件开发的新成果往往被二次开发者私有。

5.常见开源软件协议之间兼容性

  如果你已经了解了前面介绍的内容,那么你现在应该能够轻松搞定基于单一开源软件的二次开发的License问题,但在实际使用中,你的项目可能会存在引用多个开源软件,此时便涉及到开源软件协议之间的兼容性问题,即需要考虑两个核心问题:

  • 多个开源软件是否可以一起组合使用?
  • 多个开源软件的使用最终如何确定License?

  开源软件协议从使用限制强弱上来看,可以分为三大类:放任型、弱保护型、强保护型;一般来讲强限制协议可以向下兼容弱限制协议(这意味着软件最终License取决于强限制协议),但存在限制条件完全对立的两个协议则无法兼容(这意味着软件开发不能同时引用这两个开源软件)。下图很好地说明了6种常见开源软件协议之间的兼容性情况。

  箭头从A框到B框代表,A框和B框中的协议是兼容的(两种开源软件可以组合使用),且最终License取决于B框中协议;而如果两个框之间没有单向的箭头贯通,即意味着两个框中的协议不兼容(两种开源软件不可以组合使用)。

  举例说明:MIT->BSD->Apache->LGPLv3->GPLv3是一个单向通路,这个通路上的任意两个及以上的开源软件都可以组合使用,软件最终License取决于通路上箭头最末端开源软件协议。MPL<-BSD->Apache是一个双向链路,链路两端的MPL和Apache协议是不兼容的,所以无法组合使用。

6.如何选择开源软件协议?

  介绍到这里,开源软件协议这个话题也就基本结束了,其实你应该知道该如何选择合适的开源软件协议了,底下该是你去各大开源社区尽情淘你所需要的开源项目了,还在等什么?不过记住,如果找到了合适开源项目,请记得浏览一遍其License内容,说不定你会遇到惊喜,比如下面的这个WTFPL 2.0协议:

            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004 Copyright (C) 2004 Sam Hocevar <sam@hocevar.net> Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

  至此,关于开源软件协议基本知识痞子衡便介绍完毕了,掌声在哪里~~~

参考资料

[1]. 开源软件,自由软件,免费软件三者的区别

[2]. 科普:你该认识的四种常见开源许可证

[3]. 9个主流的开源许可协议(整理)

[4]. 如何选择开源许可证?-阮一峰

[5]. The Free-Libre / Open Source Software (FLOSS) License Slide

[6]. 最牛最暴力的开源协议:WTFPL

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:开源软件协议(MIT/BSD/Apache/LGPL/MPL/GPL)的更多相关文章

  1. MIT / BSD / Apache / LGPL / Mozilla / GPL 区别

    自由度:MIT > BSD > Apache > LGPL > Mozilla > GPL

  2. 痞子衡嵌入式:对比MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异. 近期有 i.MXRT 客户在集成 OTA SBL ...

  3. 痞子衡嵌入式:ARM Cortex-M调试那些事(1)- 4线协议标准(JTAG)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M文件那些事>系列文章之后,痞子衡休整了一小段时间,但是讲课的 ...

  4. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...

  5. 痞子衡嵌入式:知名半导体MCU大厂软件开发C代码规范

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是飞思卡尔软件开发C语言编码规范. 2020鼠年春节是个漫长的假期,痞子衡在家百无聊赖,翻出了2016年10月1日(这个时间是痞子衡正式开始 ...

  6. 痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间. 痞子衡之前写过一篇文章 <串行NOR Flash的页编程模式对于量产 ...

  7. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(1)- 环境搭建(Python2.7.14 + PyAudio0.2.11 + Matplotlib2.2.3 + SpeechRecognition3.8.1 + pyttsx3 2.7)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之环境搭建. 在写Jays-PySPEECH时需要先搭好开发环境,下表列出了开发过程中会用到的 ...

  8. 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南

    NXP MCU Boot Utility English | 中文 1 软件概览 1.1 介绍 NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP M ...

  9. 痞子衡嵌入式:并行接口NAND互操作性标准(JEDEC-JESD230)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是JESD230标准. 众所周知,最早也最流行的Raw NAND接口标准是ONFI标准,痞子衡在 并行接口NAND标准(ONFI)及SLC ...

随机推荐

  1. JAVA主流日志梳理

    JAVA主流日志梳理 引入 历史故事 Log4j - JDK1.3及以前 JUL - JDK1.4 JCL - 日志门面commons-logging的出现 SLF4j - 可能是最好的日志框架 lo ...

  2. JavaScript基础视频教程总结(081-090章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. asp.net 抽象方法和虚方法的用法区别,用Global类重写Application_BeginRequest等方法为例子

    不废话,直接贴代码 public abstract class LogNetGlobal : System.Web.HttpApplication { protected void Applicati ...

  4. X86给龙芯笔记本编译本地工具链(未完待续)

    我买了一台龙芯2F的笔记本来当玩具. 买回来发现,这台笔记本上没法安装软件,因为既没有软件仓库,也没有GCC. 因此需要构建交叉工具链和构建本地工具链. 下面是我研究如何搞定着一切的笔记. 工具链组件 ...

  5. django中使用memcache的一些注意事项

    最近写django项目时在保存验证码方面要用到memcached,于是便查看了一些教程进行操作,结果确遇到了一系列问题,以下是一些容易遇到的雷区: 1.windows下memcached安装: -wi ...

  6. 《笔记篇》非JS方法跳转到一个新页面,主要防止客户端禁止浏览器JS以后的跳转异常

    用非JS方法打开一个新页面,主要防止客户端禁止浏览器JS以后的跳转失效 <meta http-equiv="refresh" content="0; url=htt ...

  7. poj3660 cow contest

    这题主要是传递闭包 题意: n头牛,m次测试,假设a牛赢过b牛,那么说明a牛的能力比b牛强,问你根据输入的m次测试结果,最多能确定多少条牛的排名 大题的思路: 对于 k 牛,比他强的有x头牛,比他弱的 ...

  8. 点击a标签的文字后页面的跳转

    1.方法一 (1)js var html=""; html+="<a href=\"#\" onclick=\check('"+id+ ...

  9. Javascript高级编程学习笔记(66)—— 事件(10)变动事件

    变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...

  10. 项目文件与 SVN 资源库同步提示错误 Attempted to lock an already-locked dir

    问题描述 之前为了图方便,在eclipse中直接把三个jsp文件复制到了eclipse中我新建的一个文件夹中,把svn版本号信息也带过来了,然后我又删除了这三个jsp文件,接着先把这三个jsp复制到桌 ...