开源软件简介

一、开源运动的发起

        近几十年,软件已经称为战略性的社会资源。各大软件供应商传统的对外封锁源代码的运营模式虽说有积极的一面,比如可以维护开发商的利益,使其可以持续地维护进一步开发的能力,以及可以保护软件商及客户的私密信息等等,但凡事都有两面,其局限性也越发明显,比如付费软件供应商可能因缺乏价格竞争而提高产品、服务的价格,而用户则可能没有选择的余地;而且用户可能对单一软件供应商或解决方案产生依赖性,尤其对于大型机构或者国家,这种依赖性隐藏着巨大的风险。

        “自由软件(Free Software,也叫“Open Source(开源)”或“Libre Software(自由软件)")”的出现极大地改变了软件开发和应用领域的经济学。

        1984年开始,自由软件基金会(FSF, Free Software Foundation)通过其下的GNU项目生产可供自由使用的软件。其创始人Richard Stallman认为自由软件应该允许用户获得其源代码,并且可以对其进行研究、修改以及重新分发而不用支付任何费用。与之相关的商业活动不是去隐藏代码,而是附加补充的软件(按客户的需求定制软件)以及提供附加的服务,比如维护和用户培训,可以通过书籍、培训材料、培训课程等形式。

        另一方面,1991年8月,一位名叫Linus Torvalds的芬兰学生宣布他开发了一个新的操作系统,并且已经提供给开发者社区供测试和完善。这就是Linux最初的系统内核。

        Richard Stallman和Linus Torvalds都领导着各自的开发者社群,Richard Stallman领导FSF的GNU社群,Linus Torvalds领导Linux社群,这是开源领域中最重要的两个社群。

        这两个社群对开源和自由软件的理解不尽相同。Richard Stallman强调用户要能够免费地获得软件及源代码,”free”的两个含义“免费的”和“自由的”都是Richard Stallman追求的目标,但他却回答不了从事开源事业的人和企业要如何获利这个基本问题。当Linus Torvalds领导的Linux社区实现了一个带有可用源代码的免费操作系统时,这个问题仿佛得到了解答。GNU社群决定将自由软件运功中的各种活动统一在“开源软件”这一名称下。

        “开源软件”被注册为一个认证品牌,符合其规范的产品可以被称作开源软件。

二、开源软件的规范

        开源软件并不是简单地将源代码与程序一起发布,而是有一套准入规范。

        1997年6月,Debian项目(GNU/Linux的一个发布版本,只使用自由软件)的领导者Bruce Perens起草了开源软件定义,随后开源倡议组织(OSI, Open Source Initiative Organization)对其进行了修订,其中包含以下要点:

        1)软件可以被免费拷贝;

        2)软件必须包含源代码,可以与编译后的可执行版本共同发布,或以某种可靠形式由用户自行获取源代码,比如从网络下载。

        3)软件的使用许可必须允许用户对源代码进行修改以及由此衍生出的后续工作,并允许这些后续工作的成果以原许可中相同的条款进行发布;

        4)可能需要确保原作者代码的完整性。后续的改动可以作为原始代码的补丁形式呈现,或者需要有一个与原始代码不同的名称或版本号,这样可以明确每次改动的作者。具体做法取决于软件许可的具体规定。

        5)软件使用许可不得对某个人或某群体有歧视性规定,不可以限制对软件的访问。如果国家法律或政策有这方面的规定,应在许可中说明。

        6)不可以对软件的应用领域有限制性规定,即使该软件最初不是针对该领域设计的。比如,开源软件是允许商用的,开源软件的许可不能阻止软件用于商业目的。

        7)软件使用许可适用于每个获得该软件的用户。

        8)如果开源软件被用作某更大型产品的一部分,必须保留其原始使用许可。如果该产品是付费软件,应在其使用许可中说明哪一部分是引用的哪款开源软件。

        9)开源软件许可不可以在该软件被并入其他软件或与其他软件共同发布时形成障碍;

        10)开源软件的许可必须是技术中立的,即不局限于某些设备或操作系统,不允许提及独家的分发方式,比如强制使用CD、FTP等方式进行分发。

        OSI专门管理开源软件的定义和许可证,审查软件是否具备成为开源软件的资格。开源许可证有很多种,

        1) GPL(通用公共许可证):这是最著名、应用最广的许可证,它要求任何修改后的代码或基于GPL代码开发的衍生作品也必须以GPL许可证发布,防止开源软件被集成到付费软件中。

        2) MIT许可证:这是一种非常宽松的许可证,允许用户自由地使用、修改和分发软件,甚至可以用于专有软件中。

        3) Apache许可证:与MIT类似,但它提供了额外的保护措施,如专利条款。

        4) BSD许可证:它也是一个非常宽松的许可证,但与MIT许可证相比,它提供了更明确的免责声明。

        5) LGPL(较宽松的通用公共许可证):这是一种更宽松的GPL,适用于库文件,允许将库链接到专有软件中,而不需要将整个程序开源。一个经典的例子就是Linux C库,如果它使用GPL许可,它只能被用来开发开源软件,而它可使用LGPL许可就可被用来开发付费软件。

        这些许可证旨在保护作者的版权,同时鼓励软件的共享和合作开发。在选择许可证时,项目作者会根据自己的需求和对社区的贡献来做出决定。

三、开源软件的优势

        开源软件可以被免费使用、研究、拷贝、修改及分发。它使得软件科学的教学、学习都可以不依赖于特定的技术提供商,这对于可持续发展和建立一个包容性信息社会尤为重要。

        开源软件,意味着用户可以获得其源代码,并在该软件许可范围内适当地进行修改及分发。开源软件具有以下优势:

        1)可以对源代码进行研究、用于教学,或对其进行修改、纠正错误,甚至对其增加新功能。

        2)可以免费使用(或支付较少地费用,比如支付软件的包装、分发费用)。

        3)可以制定防止单一软件提供商形成垄断的规则。

        4)形成基于共享知识的发展模式,类似于科学社区,让每个决定都基于广泛的共识,从而使发展质量更高。

四、商业模式

        对于软件公司来说,开源同样具有吸引力,提供了各种吸引人的好处。

        1) 对于软件开发公司来说,如何通过开源软件赚取利润没有一个简单的答案,并不是所有类型的软件都可以做到这一点,回报取决于能够产生利润的软件类型。通常,软件公司会进行调研,以确定如果开发为开源软件,应用程序是否会盈利(大多数会),社区会帮助降低开发成本以及维护或错误修复的成本,并考虑到开源将为我们提供的用户数量,以及他们对我们的支持或文档服务的需求。如果这个平衡是积极的,那么不依赖软件销售收入也是可行的。

        2) 增加用户数量。

        3) 获得更大的开发灵活性,参与的人越多,能发现错误的人就越多。

        4) 收入主要来自支持、用户培训和维护。

        5) 机构用户在选择管理任务的软件时,需要考虑许多因素,例如性能、可靠性、安全性、可扩展性和财务成本。开源软件不仅在成本方面具有优势,而且能够在任何其他因素与付费软件竞争。

        6) 对于私人用户来说,它提供了大量适应常见用途的软件,开源软件最重要的目标之一就是吸引家庭用户。因为许多家庭用户使用付费软件的盗版版本,尽管可能没有被起诉,但他们确实需要支付费用。开源软件则为家庭用户解决了这一问题。

        7) 最后,作为特例,国家可以从开源软件中获得重要的好处,因为它提供了与专有软件昂贵许可费用相比微不足道的价格的高质量软件。此外,开源软件可以轻松集成文化方面的需求,例如有些小国家有自己的语言,而软件提供商却不愿意对此提供支持,或要求这些小国家为此付费,这种情况开源软件的优势就非常明显。

五、开源运动的推动

        开源软件得到国际组织的大力支持和推动。欧盟委员会(European Commission)的终生学习项目(LLP,Lifelong Learning Programme)与自由知识机构(Free Knowledge Institue)以及三所知名大学(这三所大学分别是荷兰开放大学(Open Universiteit Nederland)、西班牙加泰罗尼亚帕伯拉大学(Universitar Oberra de Caralunya)以及挪威阿格德尔大学(University of Agder)。)合作,于2008年创办了自由技术学院(FTA,Free Technology Academy)。

        FTA致力于自由软件技术的教学,使人们可以不受限制地基于现有知识去研究和创造。FTA提供线上课程传播自由软件技术。主要面向IT专业人员、教育从业者、学生以及各种决策者。FTA所使用的以及自行开发的学习材料都是开放教育资源(Open Education Resources),这些教育资源具有非营利性的免费使用许可,FTA可以在许可授权范围内自由地使用、修改以及分发这些材料。同样,FTA所使用的在线虚拟校园也是基于开放标准架构的自由软件。

        开源运动已经使GNU/Linux获得长足发展,已经可以与现有的封闭式付费系统相媲美,在某些方面甚至已经超越了付费系统。在这个过程中,许多大公司起了重要作用,比如HP、IBM、当时的SUN(2010年被Oracle收购)等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

【Kubernetes】常见面试题汇总(四十五)

目录 102.使用 Kubernetes 时可以采取的最佳安全措施是什么? 103.什么是联合集群? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目…

高中教辅汇总【35GB】

文章目录 一、资源概览二、资源亮点三、获取方式 一、资源概览 这份教辅资源汇总,精心搜集了高中各学科的海量教辅资料,总容量高达35GB,覆盖了语文、数学、英语、物理、化学、生物、历史、地理、政治等所有必修及选修科目。从基础知识点到难…

插槽slot在vue中的使用

介绍 在 Vue.js 中,插槽(slot)是一种用于实现组件内容分发的功能。通过插槽,可以让父组件在使用子组件时自定义子组件内部的内容。插槽提供了一种灵活的方式来组合和复用组件。 项目中有很多地方需要调用一个组件,比…

【H2O2|全栈】关于CSS(9)CSS3扩充了哪些新鲜的东西?(二)

目录 CSS3入门 前言 准备工作 伪元素补充 :before :after 文本溢出属性 转换效果 预告和回顾 后话 CSS3入门 前言 本系列博客主要介绍CSS相关的知识点。 这一期主要介绍以下几个CSS3的知识点: 伪元素补充文本溢出属性转换 没有基础的朋友&#xff…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件,可能会涉及到的会有: /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制? 答:其概念跟 Python教程 介绍的一样,只是语法上有所变化。 参考流程图如下: 其对应语法: var i 0; // 设置起始值 var minutes 15; // 设置结束值(15分钟…

VMware Aria Operations for Networks 6.13 发布,新增功能概览

VMware Aria Operations for Networks 6.13 - 网络和应用监控工具 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-networks/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org VMware Aria Oper…

Golang | Leetcode Golang题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; func getSteps(cur, n int) (steps int) {first, last : cur, curfor first < n {steps min(last, n) - first 1first * 10last last*10 9}return }func findKthNumber(n, k int) int {cur : 1k--for k > 0 {steps : getSteps(cu…

Llama 系列简介与 Llama3 预训练模型推理

1. Llama 系列简介 1.1 Llama1 由 Meta AI 发布&#xff0c;包含 7B、13B、33B 和 65B 四种参数规模的开源基座语言模型 数据集&#xff1a;模型训练数据集使用的都是开源的数据集&#xff0c;总共 1.4T token 模型结构&#xff1a;原始的 Transformer 由编码器&#xff08…

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元&#xff08;GRU&#xff09;门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元&#xff08;GRU&#xff09; 之前我们讨论了如何在循环神经网络中计算梯…

生信初学者教程(二十三):REF+SVM筛选候选标记物

文章目录 介绍加载R包导入数据准备数据机器学习特征筛选数据分割基础模型Recursive Feature Elimination特征筛选调参最终分类模型测试集验证标记基因输出结果总结介绍 采用了REF(Recursive Feature Elimination) 结合 SVM(Support Vector Machine) 的方法,对差异基因(参…

探索未来:hbmqtt,Python中的AI驱动MQTT

文章目录 **探索未来&#xff1a;hbmqtt&#xff0c;Python中的AI驱动MQTT**1. 背景介绍2. hbmqtt是什么&#xff1f;3. 安装hbmqtt4. 简单的库函数使用方法4.1 连接到MQTT服务器4.2 发布消息4.3 订阅主题4.4 接收消息4.5 断开连接 5. 应用场景示例5.1 智能家居控制5.2 环境监测…

react-问卷星项目(4)

项目实战 使用CSS 尽量不要使用内联CSS 内联style代码多&#xff0c;性能差&#xff0c;扩展性差外链css文件可复用代码&#xff0c;可单独缓存文件 元素内联style 和HTMl元素的style相似必须用JS写法&#xff0c;不能是字符串&#xff0c;里面必须是对象 <span style…

实现epoll事件的两种模型(ET/LT)、epoll反应堆模型

前置知识&#xff1a; 多进程/线程并发服务器、多路I/O转接服务器的简单实现-CSDN博客 1. 事件模型 EPOLL事件有两种模型&#xff1a; Edge Triggered (ET) 边缘触发只有数据到来才触发&#xff0c;不管缓存区中是否还有数据。Level Triggered (LT) 水平触发只要有数据都会…

C++基类构造器的自动调用

C基类构造器的自动调用 虽然基类的构造器和解构器不会被派生类继承&#xff0c;但它们会被派生类的构造器和解构器自动调用&#xff0c;今天我们用代码实证一下。 验证代码 源代码&#xff0c;仔细看注释内容&#xff1a; D:\YcjWork\CppTour>vim c2004.cpp #include &l…

Ubuntu下安装Zookeeper集群

Zookeeper集群是一个开源的分布式协调服务系统&#xff0c;它由Apache软件基金会维护&#xff0c;旨在为分布式应用提供一致性和可靠性的服务。 在Zookeeper集群中&#xff0c;服务器可以扮演三种角色——领导者&#xff08;Leader&#xff09;、跟随者&#xff08;Follower&a…

如何使用ssm实现基于HTML的中国传统面食介绍网站的搭建+vue

TOC ssm758基于HTML的中国传统面食介绍网站的搭建vue 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔…

Python和C++混淆矩阵地理学医学物理学视觉语言模型和算法模型评估工具

&#x1f3af;要点 优化损失函数评估指标海岸线检测算法评估遥感视觉表征和文本增强乳腺癌预测模型算法液体中闪烁光和切伦科夫光分离多标签分类任务性能评估有向无环图、多路径标记和非强制叶节点预测二元分类评估特征归因可信性评估马修斯相关系数对比其他准确度 Python桑…