从此
📄文章 #️⃣专题 🌐上网 📺 🛒 📱

应用软件和系统软件的区别是什么哪?

🕗2022-11-07
 欢迎来访!

应用软件和系统软件的区别

 

什么是应用软件?这是一个看似很无聊很没有营养的的问题。然而如果不能立刻回答出来,则这意味着一个更加有趣的事实:作为一个程序员,天天在开发程序,然而却无法解释明白是应用软件,这说明这个问题看似无聊实则水很深,是一个值得深思的问题。

在回答这个问题之前,我们先简化一下。如果问软件是什么,作为一个有实际工作经验的程序员,即使无法对软件给出清晰的定义,但是他至少能识别什么东西是软件,什么东西不是。所以在此,我们不必去纠结软件这个术语,因为能区分什么是什么不是就说明我们已经理解了这个概念。

然而,应用软件是什么?这个就比较难以回答了。我们也不一定分的清楚什么是应用软件什么不是应用软件。作为一名单纯平凡普通守法的程序员,上百度百科搜一下应用软件这个概念,发现是这么解释的:

应用软件(Application)是和系统软件相对应的,是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合,分为应用软件包和用户程序。应用软件包是利用计算机解决某类问题而设计的程序的集合,多供用户使用。
应用软件是为满足用户不同领域、不同问题的应用需求而提供的那部分软件。 它可以拓宽计算机系统的应用领域,放大硬件的功能。

第一句话咱就看不懂,因为它说应用软件是跟系统软件相对应的概念。然而什么是系统软件?幸好,百度百科在应用软件的词条下贴心给出了解释:

系统软件是指控制和协调计算机及外部设备,支持应用软件开发和运行的系统,是无需用户干预的各种程序的集合,主要功能是调度,监控和维护计算机系统;负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。系统软件使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。

那么现在懂了吗?说句实在话,我不懂。因为从百度百科上引用过来的这两段话,有几个明显的问题:

  1. 我们都知道软件是人直接或间接写出来的,那么无论系统软件还是应用软件,它们必然都是人用程序设计语言编制出来的。哪怕是拿电话机按0101写程序的大神,那也是在使用机器语言编写程序,这仍然逃不开程序设计语言的框子。因此,是不是用程序设计语言开发出来的,这不能作为区分应用软件还是系统软件的依据。
  2. 系统软件的概念解释相对清晰,但也不算太清晰。比如它提到监控、维护计算机系统,众所周知,360安全卫士可以监控咱们的计算机系统免受病毒侵害,那么它算不算系统软件呢?如果它算,同时它又是用户可以使用的软件,那么它到底是个什么鬼?

操作系统应该也算系统软件 - 管理计算机的硬件设备,使应用软件能方便、高效地使用这些设备。

正是因为这些自相矛盾或存在歧义的概念定义,使得我们搞不懂什么是应用软件。要搞清应用软件到底是什么,我们需要先回答另一个极为重要的问题:我们开发的软件是如何操控硬件的?

public class Main {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

以上是一个平淡无奇的java hello world示例代码。运行它可以在屏幕上输出hello world这行字。然而为什么它可以控制屏幕显示这行字呢?

此时我们不必翻开厚达千页的计算机科学系列丛书去寻找这个答案,我们可以从非常简单的常识去倒推背后的原理。具体如下:

  1. 我们都知道软件可以控制硬件,那么同样我们可知控制屏幕显示什么也一定是通过软件实现的。
  2. 不同的编程语言都可以控制屏幕输出hello world,但是他们的具体写法各不相同。
  3. 正是因为我们调用了System.out.println("hello world");屏幕才会输出hello world,所以我们知道println方法一定会直接或者间接的控制屏幕输出。
  4. 查看这些编程语言的具体实现,比如java,会发现println方法找不到具体实现的源码。

结合以上四点,我们可以合理的猜测,我们所使用的常规的高级编程语言,都可以间接调用硬件。但是我们在开发程序的时候,通常都无需关心控制硬件具体是怎么实现的,只需要调用标准库给我们提供的各种方法或函数即可。基于此,我们可以进一步猜测,无论是go还是java开发的程序,尽管源码不同,但是运行到到操作硬件的指令部分时,他们应该是执行的一样的代码,这样硬件才能表现出相同的行为。

如果觉得上面的推理不一定是对的,我们还可以观察在宏观层面的软件设计来佐证这个猜想。例如java web服务提供rest接口,无论是浏览器还是手机APP,它们都可以通过网络通信来调用这个接口,完成一样的功能。客户端的实现技术编程语言各不相同,但是它们都能调用到相同的后端服务接口。提供api接口供上层代码调用这个思想,放之四海而皆准。

分析到这里,对于应用软件与系统软件的边界,我们应该相对清晰了。系统软件可以直接操控硬件,这是百度百科说的,我们可以信。基于前面的api调用设计思想,系统软件它可以把操作硬件的部分封装成api,供上层软件调用。而这个上层软件,就是应用软件。

 


为什么软件可以操作硬件

 

要回答这个问题,首先我们需要定义什么是软件,什么是硬件。咱们不去翻那些各类专业知识,站在一个有过基本编程经验的程序员角度来说,很感性的认知就是软件是由编程语言写出来的虚拟逻辑,硬件则是看得见摸得着的芯片机器。

然而虚拟是如何控制现实的?程序逻辑是一个看不见摸不着的东西。它是施展了什么魔法才能控制现实中的具体物质?举个例子,咱们对着一块铁板,无论你内心念多少咒语,它也不会动起来。因为咱们缺少能跟它交互的媒介。说回这里,我们还记得高中信息技术教材上写得计算机历史吗?最早的程序是用打孔纸带输送进计算机的!

可能当年我们看到打孔纸带这个词,也就是一眼过去了。但是今天回头来看这个东西,我们可以从中推理出很多东西出来。首先,打孔纸带它是一个实物,它是一个看的见摸得着的东西。那么我们能说打孔纸带是一个程序是一个软件吗?显然不是,软件永远都是摸不着的。因为软件代表的是一种运算逻辑,它是一个信息。信息是摸不着的,但是信息它得有载体!纸张可以用来承载文字,而文字的组合则是一种信息。换句话说,最早的计算机,通过打孔纸带来表述计算逻辑。现代计算机又用什么来作为信息的载体呢?没错,各种存储设备就是信息的载体。

讲到这里,我们对于软件的本质可能有点明白了,但是对于软件如何控制硬件,仍然没有什么头绪。要回答这个问题,我们需要换一个角度。我们都使用过电,比如电灯。用手按一下电灯开关,它就会通电或者断电,从而灯泡的物理形态发生了变化。仔细想一想,我们用手去控制电灯开关,是不是相当于向灯泡输入了一个信息?开关的闭合就是bool变量的true\false。而这个信息的承载媒介就是灯的开关!那么现在我们至少已经知道了一个东西,就是虚拟的信息通过具体的媒介,确实是可以控制现实中的物质的。

问题到这里还没结束,就是灯泡它只能亮或者不亮,它离计算机能执行各种逻辑运算并输出运算结果还差的远呢。计算机的特点是只要是人想的出来的逻辑,你就能通过编程语言表达出来并且让计算机按这个逻辑来执行。而人能想出来的逻辑过程是无穷的,所以计算机从宏观层面来看也能支持无穷多种的逻辑运算。但是显然计算机必须是由一些最简单的基本的东西组合出来从而可以执行千变万化的逻辑运算,否则它的制造过程也无法想象。不要觉得这不可能,因为这个无穷的宇宙就是由最基本的粒子组成的,计算机同样也可以用这种方式来设计。只不过它需要用到一种特殊的材料,是什么呢?

再次回到咱们的高中信息教材翻看计算机发展史,其中有一个很常见的词,叫半导体。为什么计算机需要用半导体材料呢?一块铁不能用来制造CPU吗?还真不能。在高中物理课程上,我们同样学习过半导体的概念。半导体材料的核心特点就是在满足某些条件的时候,它的导电性质会发生变化。注意变化这个词,一个宏观上最终能千遍万化的东西,如果你往下去剖析它的构成,一定会发现这个变化的根源来自一个自身就可以变化形态的物件。因此半导体的这个可以自身变化形态的材料特性,就是构成计算机能执行千变万化运算逻辑的核心。

回到正题,对半导体而言,施加不同的电流或电压,它会变得通电或不通电。所谓通不通即是电流经过它之后还能不能继续传下去。电流通过半导体传出来,这个结果就是一个输出,能否传出来,可以用01表示。而是否对半导体施加能改变其导电性质的电压,同样可以用01表示。于是这天然就是一个输入输出的计算过程。我们常说计算机只懂01,是因为构成计算机最基本的物质材料半导体只有01两种状态。我们只需要基于半导体这个性质去排布电路,就能形成各种逻辑运算单元。而这,最终形成了CPU,也就是计算机能运算逻辑的核心零件。我们人可以创造无穷的01组合,只要这些组合符合计算机的输入规则,cpu就能执行。