软件

软件（software）是一系列按照特定顺序组织的电脑数据和指令，是电脑中的非有形部分。电脑中的有形部分称为硬件，由电脑的外壳及各零件及电路所组成。电脑软件需有硬件才能运作，反之亦然，软件和硬件都无法在不互相配合的情形下进行实际的运作。

一般来说，计算机软件划分为程式语言、系统软件、应用软件和介于这两者之间的中介软件。其中系统软件为计算机使用提供最基本的功能，但是并不针对某一特定应用领域。而应用软件则恰好相反，不同的应用软件根据用户和所服务的领域提供不同的功能。

软件包括所有在电脑执行的程式，和其架构无关，例如执行档、函式库及脚本语言都属于软件。软件不分架构，有其共通的特性，在执行后可以让硬件执行依设计时要求的机能。软件储存在内存中，软件不是可以碰触到的实体，可以碰触到的都只是储存软件的零件（内存）或是媒介（光碟或磁片等）。

软件并不一定只包括可以在计算机上运行的计算机程序，有些定义中，与计算机程序相关的文档，一般也被认为是软件的一部分。简单的说软件就是程式加文档的集合体。软件被应用于世界的各个领域，对人们的生活和工作都产生了深远的影响。

## 编程语言

以最低阶的角度来看，执行档中包括了针对特定微处理器（一般会是CPU）的机械码，机械码包括了一连串二进制的数值，使处理器从目前的状态变换到下一个状态。例如指令可能会修改电脑内一特定位置中的数值，其效果是使用者无法直接观测到的，指令也可能让萤幕上显示特定资料，这种状态变换是使用者可以看到的。处理器会依照顺序处理收到的指令，不过处理器的处理也可能受到中断，或是因为流程控制指令而改变其要处理的指令。

机械码是许多二进制的数值，不方便工程师阅读及开发程式，因此有组合语言，将机械码转换为人可以看懂的助忆码。不过现在多半的软件是用高阶语言撰写，比较类似自然语言，对人类而言比机械码或组合语言要简单，方便人类使用。高阶语言一般会用直译或编译的方式，将软件的源代码转换为机械码。

源代码是指以程式语言所撰写的一系列人类可阅读的电脑指令，以实作出软件的行为和功能。

## 分类

软件的分类方式有很多种，可以依软件的目的分为以下几种：

### 系统软件

系统软件负责管理计算机系统中各种独立的硬件，使得它们可以协调工作，提供基本的功能，并为正在运行的应用软件提供平台。系统软件使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。而各个硬件工作的细节则由驱动程式处理。

一般来说，系统软件包括操作系统（例如BSD、DOS、Linux、macOS、iOS、OS/2、QNX、Unix、Windows等）和一系列基本的工具（比如编译器，数据库管理，存储器格式化，文件系统管理，操作系统管理，用户身份验证，驱动管理，网络连接等方面的工具）。

### 应用软件

应用软件是为了某种特定的用途而被开发的软件。它可以是一个特定的程式，比如一个图像浏览器。也可以是一组功能联系紧密，可以互相协作的程式的集合，比如微软的Office软件。也可以是一个由众多独立程式组成的庞大的软件系统，比如数据库管理系统。

较常见的有：

- 文书处理软件如Microsoft Office、GNOME Office、 KOffice、LibreOffice、Google Docs、WPS Office
- 关联式数据库如Oracle Database数据库、SQL Server数据库
- 电脑辅助设计如CATIA、AutoCAD、FreeCAD
- 计算机程序设计如C/C++、组合语言、BASIC、 Swift、JavaScript、Java
- P2P软件如BitTorrent、 µTorrent、Foxy、比特精灵、Vuze、 Free Download Manager
- 影像处理软件如Photoshop、CorelDRAW、Corel painter、GIMP、MAYA、Softimage、3ds Max、Blender、xsi、lightwave、Cinema 4D、Houdini、Krita
- 动态图形和视觉特效如After Effects、shake
- 网页浏览软件如Internet Explorer、Edge、Firefox、Chrome、Safari、Opera、Konqueror
- 网络通讯软件如Line、ICQ、Windows Live Messenger、UUcall、Skype、Yahoo! Messenger、QQ、AOL Instant Messenger
- 媒体播放器如MPC-HC、MPlayer、RealPlayer、GOM、VLC、WMP、暴风影音、风雷影音、Winamp、Foobar2000
- 下载管理软件如Free Download Manager、IDM
- 电子邮件如Outlook.com、Windows Live Mail、Outlook Express、Foxmail、ThunderBird、Dreammail、KMail
- 资讯安全软件如ESET、360安全卫士、德国小红伞、卡巴斯基、PC-cillin、诺顿防毒、BitDefender、瑞星杀毒、金山毒霸
- 虚拟机器如VMware、VirtualBox、Microsoft Virtual PC、Bochs
- 输入法软件如新酷音输入法、谷歌拼音输入法
- 实时控制系统
- 教育软件

### 恶意软件

恶意软件是发展到危害和破坏计算机的计算机软件，因此，恶意软件是不受欢迎的。恶意软件与计算机相关的犯罪相关联，尽管一些恶意程序可能被设计为用于恶作剧。

## 相关主题

### 软件架构

用户常会看到一些程式设计者不会注意的事物。使用现代通用型电脑（相对于嵌入式系统、类比电脑或超级电脑）的用户常会用以下三层的软件架构来进行不同的任务：系统平台、应用程序及用户软件。

- 系统平台：系统平台包括固件、驱动程式、操作系统，可能也包括图形使用者界面，其目的是让用户可以和电脑和其周边互动。系统平台常会随着电脑一起提供，一般而言在个人电脑上，可以更换其系统平台。
- 应用软件：应用软件也就是大部分用户认为的软件，常见的例子包括办公室套件及游戏等。应用软件一般会和硬件分开来贩售，偶尔会和硬件一起贩售。应用软件多半是独立于系统平台的软件，只是在设计时仍会针对某些特定的系统平台开发，有些人则将像编辑器、数据库等“系统软件”也视为是应用软件。
- 用户撰写的软件：终端用户开发目的是让软件符合用户等特定的需求，一般包括试算表及文字处理器的范本或宏，甚至连邮件的过滤器也可以视为是一种用户撰写的软件。依照用户撰写的软件整合到预设应用软件的程度不同，其他用户可能不会知道哪些是应用软件原有的机能，哪些是用户扩充的机能。

### 软件执行

软件在载入到电脑的数据存贮器（例如硬盘或内存）后，电脑就可以执行该软件。“执行”指的是将指令集由软件移到电脑硬件中，硬件会处理指令集对应的机器码。每一个指令都会让电脑执行特定的动作，包括搬移资料、执行运算或是改变控制流程。

资料搬移一般会由内存的一个位置移到另一个位置，有时资料搬移会用到中央处理器中允许较快速资料处理的暂存器。大量的资料搬移会用去不少的系统资源，因此有时会用“指标”来处理资料。执行运算的范围很广，简单的可以包括将某位置的资料加一，复杂的可能包括许多资料及对应的处理。

软件的执行多半是一个指令接一个指令的循序进行，但有时会需要改变软件中指令执行的顺序，例如有可以使某一段程式执行数次的循环，或是依特定条件执行两段程式中的一段的分支指令，甚至是可以执行子程式，执行完成后再回到原来程式，而有些语言也支援无条件的跳跃指令。

软件可以以许多不同的方式运作，包括执行档、源代码、脚本及电脑组态。

### 质量及可靠度

软件的品质有一定的重要性，尤其在像Microsoft Office、Microsoft Windows 及Linux等商用软件或系统软件更是如此。若软件无法正确执行，可能会删除用户工作的成果，使电脑当机或是出现其他无预期的情形，这类情形称为程式错误，俗称bug。软件也会受到软件退化的影响，也就是因为许多未发现的程式错误造成的性能退化。借由软件测试可以找出并消除许多的程式错误，不过软件测试很少可以完全消除程式错误。很多大型的软件公司，例如微软、Novell及太阳微系统等，会有专门的软件测试部门，其主要工作就是测试软件。软件可以用单元测试、回归测试及其他方式进行测试。测试可能用人工进行，若是大型的程式，更常见的是用电脑自动测试。像NASA就针对其操作系统及其通讯程序有特别严谨的测试流程。

### 使用许可

不同的软件一般都有对应的软件授权，软件的使用者必须在同意所使用软件的许可证的情况下才能够合法的使用软件。从另一方面来讲，特定软件的许可条款也不能够与法律相抵触。

依据许可方式的不同，大致可将软件区分为几类：

- 专有软件：此类授权通常不允许使用者随意的复制、研究、修改或散布该软件。违反此类授权通常会有严重的法律责任。传统的商业软件公司会采用此类授权，例如微软的Windows和办公软件。专属软件的源码通常被公司视为私有财产而予以严密的保护。
- 自由软件：此类授权正好与专属软件相反，赋予使用者复制、研究、修改和散布该软件的权利，并提供源码供使用者自由使用，仅给予些许的其它限制。以Linux、Firefox和OpenOffice可做为此类软件的代表。
- 共享软件：通常可免费的取得并使用其试用版，但在功能或使用期间上受到限制。开发者会鼓励使用者付费以取得功能完整的商业版本。
- 免费软件：可免费的取得和散布，但并不提供源码，也无法修改。
- 公共软件：原作者已放弃权利，著作权过期，或作者已不可考的软件。使用上无任何限制。

### 专利

有些国家可以申请软件专利，有些国家不行，而是用著作权的观点保护软件。不过在软件产业中，软件专利是个争议性高的议题，各方人士有不同的立场。软件专利争议的主要争议点是在软件专利中，受保护不得复制的部分是其算法还是其用到的技术。

## 开发

软件开发是根据用户要求建造出软件系统或者系统中的软件部分的过程。软件开发是一项包括需求捕捉，需求分析，设计，实现和测试的系统工程，其中可能包括研究、新的开发工作、修改、复用、重新设计（再工程）、维护，或者任何最终获得软件产品的其他活动。

软件开发过程是指软件从起始到完成过程中如何进行计划、控制和监控的模型。有以下不同的几种：

- 瀑布模型：依需求分析，设计，实现，测试 (确认)，集成，和维护这样的步骤依序进行。
- 迭代式开发：将开发工作被组织为一系列的短小的、固定长度（如3周）的小项目，被称为一系列的迭代。在每一次迭代中进行需求分析、设计、实现与测试。
- 敏捷软件开发：应对快速变化需求的软件开发方式，强调设计师团队与业务专家之间的协作、面对面的沟通、频繁交付软件版本、适应变化的代码编写等特点。
- 极限编程：敏捷软件开发的一种，引入基本价值、原则、方法等概念来达到降低变更成本的目的，其主要目的是快速应用程序开发。
- 快速应用程序开发，以最小幅度的规划并迅速地将原形完成的软件发展方法论，其软件开发的规划是和撰写软件本身交错同时进行。
- 螺旋模型：兼顾了快速原型的迭代特征以及瀑布模型的系统化与严格监控，并且加入了其他模型不具备的风险分析，使软件在无法排除重大风险时有机会停止，以减小损失。

## 编程工具

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

软件由一种或多种编程语言所写成。现在存在有很多种编程语言，并且每种都具有至少一种编写的方式，其中包括它自己的一套编程工具。这些工具包含相对独立自足的程序，如编译器，调试器，直译器，链接器和文本编辑器，可以结合共同完成一个任务，很像一个人可以使用多个手握工具来固定一个物理对象。

这套工具也有可能是一个集成开发环境（IDE），它结合了许多这种工具或它们的全部功能。无论是通过调用程序员等有关人士的工具，或通过以一种新的方式重新实现它们的功能，IDE可以做到这一点。几乎所有的编程语言为编写提供了使用单独的工具，而不是一个IDE，因为有些程序员由于各种原因不喜欢使用IDE，或是因为IDE通常需要更长的时间才能发展形成一个可接受的标准，而不是一个个人工具。事实上，新的编程语言最初通常不会提供他们的IDE。

## 产业及组织

软件产业是由许多软件公司及程式设计者所组成的产业，其性质较类似服务业。由于其产业特性，毛利率较其他产业要高。软件产业的获利相当高，像微软的创始人比尔·盖茨就因为销售Microsoft Windows及Microsoft Office而数次成为美国首富。不过随着时代的变化，软件产业的分工及专业化也越来越细。例如电子游戏产业及办公室软件都属于软件产业，而两者就有不少的差异。

有许多非营利的软件组织，例如自由软件基金会、GNU计划及Mozilla基金会。像万维网协会（W3C）及互联网工程任务组（IETF）等组织发展许多软件标准，因此不同的软件可以借由这些标准互相沟通，这种标准包括例如XML、HTML、HTTP及FTP等。

其他著名的软件公司有Google、Novell、SAP、Symantec、Adobe Systems、Corel，不过其中也有许多小公司有一些创新的产品。