• 码农的灵魂拷问之(二)什么是应用软件


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

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

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

    应用软件(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,供上层软件调用。而这个上层软件,就是应用软件。

  • 相关阅读:
    形态学 - 提取连通分量
    MFC基础入门
    CSS 中几种常用的换行方法
    C#开源、功能强大、免费的Windows系统优化工具 - Optimizer
    解决uniapp微信小程序canvas不能引入字体的问题
    GO语言 类型断言type
    Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信
    愿你放飞梦想,国庆快乐!Wish you a happy National Day!
    C system()函数调用删除Windows临时目录下的所有文件
    Docker-compose和Consul
  • 原文地址:https://www.cnblogs.com/yish/p/16864160.html