软体

图显示了用户如何在典型台式计算机上与应用程序软件进行交互。应用程序软件层与操作系统互动,该操作系统又与硬件通信。箭头表示信息流。

软件程序数据的集合,可告诉计算机如何执行特定任务。软件通常包括关联的软件文档。这与硬件形成鲜明对比的是,该硬件是从中构建并实际执行工作的。

最低的编程级别上,可执行代码由由单个处理器支持的机器语言指令组成 - 通常是中央处理单元(CPU)或图形处理单元(GPU)。机器语言由二进制值组组成,这些二进制值表示处理器指令,这些指令将计算机的状态从其先前的状态更改。例如,指令可能会更改计算机中特定存储位置中存储的值,该效果无法直接观察到用户。指令还可以调用许多输入或输出操作之一,例如,在计算机屏幕上显示一些文本,从而导致用户应可见的状态更改。处理器按照提供的顺序执行指令,除非指示“跳转”到另一个指令或被操作系统中断。截至2023年,大多数个人计算机智能手机设备和服务器都具有具有多个执行单元的处理器,或者将多个处理器一起执行计算,因此计算已经变得比过去更加同时进行。

大多数软件都是用高级编程语言编写的。对于程序员而言,它们比机器语言更接近自然语言,因此它们更容易,更有效。高级语言使用编译器解释器或两者组合将机器语言转换为机器语言。软件也可以用低级汇编语言编写,该语言与计算机的机器语言说明具有很强的对应,并使用汇编器将其转换为机器语言。

历史

Ada Lovelace在19世纪为计划的分析引擎编写的第一件软件的算法。她创建了证据,以显示引擎将如何计算Bernoulli号码。由于证明和算法,她被认为是第一个计算机程序员。

艾伦·图灵(Alan Turing)在1936年的文章中提出了关于计算机的第一个理论,在创建计算机之前,就可以计算的数字提出,并向ientscheidungsproblem (决策问题)提出了应用。最终导致了计算机科学和软件工程学术领域的创建;两个字段研究软件及其创建。计算机科学是计算机和软件的理论研究(图灵的论文是计算机科学的示例),而软件工程是工程原理在软件开发中的应用。

2000年,耶鲁大学法学院的图书馆员弗雷德·夏皮罗(Fred Shapiro)发表了一封信,揭示了约翰·怀尔德·塔基(John Wilder Tukey)的1958年论文“混凝土学发的教学”包含最早在JSTOR中发现的“软件”一词​​的已知用法。的电子档案馆,早于牛津英语词典的引用两年。这使许多人凭借该术语造成了Tukey的信誉,特别是在同年发表的ob告中,尽管Tukey从未因任何此类造币而获得荣誉。 1995年,保罗·尼克特(Paul Niquette)声称他最初是在1953年10月创造了这个词,尽管他找不到任何支持他主张的文件。在工程背景下,“软件”一词​​最早的出版物是1953年8月,理查德·R·卡哈特(Richard R. Carhart)在兰德公司研究备忘录中。

类型

Blender ,一个免费的软件程序

在几乎所有计算机平台上,软件都可以分为几个类别。

目的或使用域

根据目标,计算机软件可以分为:

  • 应用程序软件使用计算机系统执行超出计算机本身基本操作的特殊功能。有许多不同类型的应用程序软件,因为可以使用现代计算机执行的任务范围是如此之大 - 请参见软件列表
  • 系统软件管理硬件行为,以提供用户要求的基本功能,或者其他软件可以正确运行(如果有的话)。系统软件还旨在为正在运行的应用程序软件提供平台,其中包括以下内容:
    • 操作系统是管理资源并为其他“在其顶部”运行的软件提供通用服务的重要软件集合。监督程序引导加载程序外壳窗口系统是操作系统的核心部分。实际上,操作系统捆绑了其他软件(包括应用程序软件),以便用户可以使用只有一个操作系统的计算机进行一些工作。
    • 设备驱动程序操作或控制连接到计算机的特定类型的设备。每个设备至少需要一个相应的设备驱动程序;由于计算机通常至少具有至少一个输入设备和至少一个输出设备,因此计算机通常需要多个设备驱动程序。
    • 实用程序是旨在帮助用户维护和保养计算机的计算机程序。
  • 恶意软件恶意软件是为损害或破坏计算机而开发的软件。恶意软件与计算机相关的犯罪密切相关,尽管某些恶意程序可能被设计为实用笑话

执行的性质或领域

  • 台式机应用程序,例如Web浏览器Microsoft Office以及LibreofficeWordPerfect ,以及智能手机平板电脑应用程序(称为“应用程序”)。
  • JavaScript脚本是传统上嵌入在网页中的软件,这些软件在加载网页时直接在Web浏览器中运行,而无需Web浏览器插件。如果软件要幺翻译成JavaScript,也可以在Web浏览器中运行其他编程语言的软件,或者如果支持该语言的Web浏览器插件;后者最常见的示例是ActionScript脚本,由Adobe Flash插件支持。
  • 服务器软件,包括:
  • 插件和扩展程序是扩展或修改另一个软件功能的软件,并要求使用该软件以进行功能。
  • 嵌入式软件驻留在嵌入式系统中,专用于一种用途的设备或诸如汽车电视之类的几种用途(尽管某些嵌入式设备(例如无线芯片组)本身可以是普通的,非安装的计算机系统的一部分,例如PC或智能手机)。在嵌入式系统上下文中,有时在系统软件和应用程序软件之间没有明确的区别。但是,某些嵌入式系统运行的嵌入式操作系统,这些系统确实保留了系统软件和应用程序软件之间的区别(尽管通常只有一个始终运行的固定应用程序)。
  • Microcode是一种特殊的,相对模糊的嵌入式软件类型,它告诉处理器本身如何执行机器代码,因此它实际上比机器代码较低。它通常与处理器制造商专有,并且他们向用户提供任何必要的校正微型软件更新(比运输替换处理器硬件便宜得多)。因此,普通程序员不会期望能够处理它。

编程工具

编程工具也是开发人员用来创建,调试维护或以其他方式支持软件的程序或应用程序形式的软件。

软件用一种或多种编程语言编写;存在许多编程语言,每种语言至少具有一种实现,每种都由其自己的一组编程工具组成。这些工具可能是相对具有独立的程序,例如编译器辩论者口译人员链接器文本编辑器,可以合并以完成任务;或者它们可能形成一个集成的开发环境(IDE),该环境结合了此类独立工具的大部分或全部功能。 IDE可以通过调用相关的单个工具或以新的方式重新实现其功能来做到这一点。 IDE可以使执行特定任务更容易,例如在特定项目中的文件中搜索。许多编程语言实现提供了使用单个工具或IDE的选项。

主题

建筑学

使用现代通用计算机(与嵌入式系统模拟计算机超级计算机相对的人)通常会看到执行各种任务的三层软件:平台,应用程序和用户软件。

  • 平台软件:该平台包括固件设备驱动程序,操作系统,通常是图形用户界面,该界面总共允许用户与计算机及其外围设备(相关设备)进行交互。平台软件通常与计算机捆绑在一起。在PC上,通常可以更改平台软件。
  • 应用软件应用软件是大多数人想到软件时的想法。典型的示例包括办公套房和视频游戏。应用软件通常是从计算机硬件分开购买的。有时,应用程序与计算机捆绑在一起,但这并没有改变它们作为独立应用程序运行的事实。应用程序通常是操作系统的独立程序,尽管它们通常是针对特定平台量身定制的。大多数用户将编译器,数据库和其他“系统软件”视为应用程序。
  • 用户写的软件最终用户开发量身定制系统,以满足用户的特定需求。用户软件包括电子表格模板和文字处理器模板。甚至电子邮件过滤器也是一种用户软件。用户自己创建此软件,并且经常忽略它的重要性。根据将用户编写的软件集成到默认的应用程序软件包中的能力,许多用户可能不知道原始软件包之间的区别以及同事添加的内容。

执行

必须将计算机软件“加载”到计算机的存储中(例如硬盘驱动器内存)。软件加载后,计算机就可以执行软件。这涉及通过系统软件从应用程序软件传递指令到最终将指令作为机器代码接收的硬件。每种指令都会导致计算机执行操作 - 移动数据,进行计算或更改指令的控制流

数据移动通常是从内存中的一个地方到另一个位置。有时,它涉及在内存和寄存器之间移动数据,从而在CPU中启用高速数据访问。移动数据,尤其是大量数据可能是昂贵的;有时通过将“指针”用于数据来避免这种情况。计算包括简单的操作,例如增加可变数据元素的值。更复杂的计算可能涉及许多操作和数据元素。

质量和可靠性

软件质量非常重要,尤其是对于商业和系统软件。如果软件有故障,它可以删除一个人的作品,崩溃计算机并执行其他意外的事情。故障和错误称为“错误”,通常在Alpha和Beta测试中发现。软件通常也是所谓的软件衰老的受害者,这是由于看不见的错误而导致的渐进性能降解。

通过软件测试发现并修复了许多错误。但是,软件测试很少(如果曾经)降低每个错误。一些程序员说,“每个程序至少还有一个错误”(卢巴斯基定律)。在软件开发的瀑布方法中,通常采用单独的测试团队,但是在较新的方法中,共同称为敏捷软件开发,开发人员经常进行所有自己的测试,并定期向用户/客户展示软件以获取反馈。可以通过单位测试回归测试和其他方法来测试软件,这些方法是手动或最常见的,因为要测试的代码量可能很大。包含命令软件的程序使硬件工程和系统操作可以更轻松地一起运行。

执照

该软件的许可使用户有权在许可环境中使用该软件,并且在免费软件许可证的情况下,还授予了其他权利,例如制作副本的权利。

专有软件可以分为两种类型:

  • 免费软件,其中包括“免费试用”软件类别或“免费增值”软件(过去,共享软件通常用于免费试用/免费增值软件)。顾名思义,尽管在免费试用或免费增值软件的情况下,免费软件可以免费使用,但有时仅在有限的时间内或功能有限。
  • 可获得费用的软件,只能合法地购买许可证。

开源软件带有免费软件许可证,授予收件人修改和重新分配软件的权利。

专利

与其他类型的专利一样,软件专利在理论上应该为发明人提供有关如何实现软件或软件组成部分的详细想法(例如算法)的独家,时限的许可。软件可以的有用的想法,用户要求不应该是可专利的,并且具体实施(即实施专利的实际软件包)也不应该是可专利的 - 后者已经涵盖了版权,通常自动地。因此,软件专利应该涵盖中间区域,在需求和具体实施之间。在某些国家,要求声称的发明对物理世界产生影响的要求也可能是对软件专利有效的要求的一部分 - 尽管由于所有有用的软件都会影响物理世界,但此要求可能是开放辩论。同时,美国版权法已应用于软件代码撰写的各个方面。

软件专利在软件行业中引起了争议,许多人对其有不同的看法。争议的根源之一是,在实践中,在实践中似乎并没有尊重上述初始想法和专利之间的分歧,例如,专利的专利是面向方面的计划(AOP),该专利声称该专利旨在要求任何编程工具声明权利实施AOP的想法,无论实施如何。另一个争议的来源是对创新的影响,许多杰出的专家和公司认为软件是一个快速发展的领域,软件专利仅创造了巨大的额外诉讼成本和风险,并且实际上是阻碍了创新。在有关美国境外软件专利的辩论中,已经提出了大型美国公司和专利律师可能是允许或继续允许软件专利的主要受益人。

设计和实施

软件的设计和实施因软件的复杂性而异。例如, Microsoft Word的设计和创建比设计和开发Microsoft Notepad所花费的时间要多得多,因为前者俱有更多的基本功能。

软件通常是在综合开发环境(IDE)中开发的,例如EclipseIntellijMicrosoft Visual Studio ,可以简化过程并编译软件。如不同部分所述,通常在现有软件之上创建软件,以及基础软件提供的GTK+ ,Javabeans或Swing等基础软件提供的应用程序编程接口(API)。图书馆(API)可以按其目的进行分类。例如,弹簧框架用于实施企业应用程序Windows表单库用于设计图形用户界面(GUI)应用程序(例如Microsoft Word), Windows Communication Foundation用于设计Web服务。设计程序时,它依赖于API。例如,Microsoft Windows桌面应用程序可能会在.net Windows forms库中调用API函数,例如Form1.Close()Form1.show()以关闭或打开应用程序。没有这些API,程序员就需要完全编写这些功能。 OracleMicrosoft这样的公司提供了自己的API,因此使用其软件库编写了许多应用程序,而软件库中通常有很多API。

哈希表阵列二进制树以及诸如QuickSort之类的算法数据结构对于创建软件很有用。

计算机软件具有经济特征,使其设计,创建和分销与大多数其他经济产品不同。

创建软件的人称为程序员软件工程师或软件开发人员,术语都具有相似的含义。程序员的更非正式的术语也存在,例如“编码器”和“黑客” - 尽管使用后一个单词可能会引起混乱,因为它经常习惯于表示非法闯入计算机系统的人

也可以看看