痞子衡嵌入式:开源软件协议(MIT/BSD/Apache/LGPL/MPL/GPL)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是关于开源软件协议基本知识。
牛顿曾说过:“如果我比别人看得更远,那是因为我站在巨人的肩上”。在软件开发中如果说也存在巨人的肩膀让我们站,我想这个巨人应该就是开源软件。一个优秀的软件开发人员应该能够善于学习和利用开源软件来加速自己的开发,而为了正确地使用开源软件,我们必须要了解开源软件协议,今天我们就来聊一聊开源软件协议这个话题。
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)的更多相关文章
- MIT / BSD / Apache / LGPL / Mozilla / GPL 区别
自由度:MIT > BSD > Apache > LGPL > Mozilla > GPL
- 痞子衡嵌入式:对比MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异. 近期有 i.MXRT 客户在集成 OTA SBL ...
- 痞子衡嵌入式:ARM Cortex-M调试那些事(1)- 4线协议标准(JTAG)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M文件那些事>系列文章之后,痞子衡休整了一小段时间,但是讲课的 ...
- 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(5)- 软件优化
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之软件优化. 前面痞子衡已经初步实现了Jays-PyCOM的串口功能,并且通过了最基本的测试,但目前 ...
- 痞子衡嵌入式:知名半导体MCU大厂软件开发C代码规范
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是飞思卡尔软件开发C语言编码规范. 2020鼠年春节是个漫长的假期,痞子衡在家百无聊赖,翻出了2016年10月1日(这个时间是痞子衡正式开始 ...
- 痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间. 痞子衡之前写过一篇文章 <串行NOR Flash的页编程模式对于量产 ...
- 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(1)- 环境搭建(Python2.7.14 + PyAudio0.2.11 + Matplotlib2.2.3 + SpeechRecognition3.8.1 + pyttsx3 2.7)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之环境搭建. 在写Jays-PySPEECH时需要先搭好开发环境,下表列出了开发过程中会用到的 ...
- 痞子衡嵌入式:恩智浦MCU安全加密启动一站式工具NXP-MCUBootUtility用户指南
NXP MCU Boot Utility English | 中文 1 软件概览 1.1 介绍 NXP-MCUBootUtility是一个专为NXP MCU安全加密启动而设计的工具,其特性与NXP M ...
- 痞子衡嵌入式:并行接口NAND互操作性标准(JEDEC-JESD230)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是JESD230标准. 众所周知,最早也最流行的Raw NAND接口标准是ONFI标准,痞子衡在 并行接口NAND标准(ONFI)及SLC ...
随机推荐
- Web打印控件Lodop实现表格物流单的打印
Web打印控件Lodop实现表格物流单的打印 一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用 ...
- [swarthmore cs75] Compiler 3 – Cobra
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第5次大作业. 增加了bool数据表示和比较运算符的支持,具体语法参考下图: 第一种int和bo ...
- Atomic in Redis
Since Redis is single-threaded, everything is atomic.
- U-Boot Makefile分析(3) rules.mk分析
浏览各个子Makefile可以发现,他们都会在文件的后面包含rules.mk,这个文件的作用就是更新源文件的依赖,并生成各种.depend文件. _depend: $(obj).depend # Sp ...
- 【repost】CSS3弹性布局
本文导读:在CSS 3中,CSS Flexible Box模块为一个非常重要的模块,该模块用于以非常灵活的方式实现页面布局处理.使用CSS Flexible Box模块中定义的弹性盒布局技术,可以根据 ...
- linux vg lv pv
= pv由物理卷或者分区组成 pv可以组成一个或者多个vg vg可以分成多个lv 方便扩展 pvs vgs lvs 可以查看当前存在的pv vg lv 我的centos硬盘20g 使用了一 ...
- 为程序设置多语言界面——C#
考虑到程序的国际化需求,需要为程序设置多语言界面. 1,新建一个资源文件,名字可以是对应界面+语言代码(MainForm.zh-CN).这样资源文件就会自动添加到对应界面下面. 2,更改界面属性Loc ...
- HC-05蓝牙模块配置与使用
蓝牙模块BT-HC05模块是一款高性能的蓝牙串口模块. 1.可用于各种带蓝牙功能的电脑.蓝牙主机.手机.PDA.PSP等智能终端配对. 2.宽波特率范围4800~1382400,并且模块兼容单片机系统 ...
- sqoop错误集锦1
1.当时初学Sqoop的时候,mysql导入到hdfs导入命令执行以后,在hdfs上面没有找到对应的数据,今天根据这个bug,顺便解决这个问题吧,之前写的http://www.cnblogs.com/ ...
- Visual Studio 开发(二):VS 2017配置FFmpeg开发环境
在上篇文章Visual Studio 开发(一):安装配置Visual Studio Code 中,我们讲了一下如何配置VS CODE,来编写和调试C的代码.如果你已经使用VS Code回顾和复习好C ...