2.1 软件的概念
软件,也叫程序,那么究竟什么是软件呢?在回答这个问题之前,先来看下面的例子。
老李要求小李在一张纸上画三角形并计算出三角形的面积。老李准备了两张白纸,一张白纸上标注了3个点——A点、B点和C点,以及每个点的坐标;另一张白纸上写下了画三角形的步骤和计算三角形面积的方法。小李只要按照这些步骤和计算方法动手即可,步骤如下。
(1)画一条直线连接A点和B点。
(2)画一条直线连接B点和C点。
(3)画一条直线连接C点和A点。
(4)根据公式计算三角形的面积:
|(xb-xa)×(yc-yb)|-[|(xb-xa)-(ya-yb)|+|(xb-xc)(yc-yb)|+|(xc-xa)(yc-ya)|]÷2
(5)交回画了三角形并标注了面积的纸张。
老李把这两张纸交给小李后,小李在书桌上摊开这两张纸开始工作。大概过了10分钟,老李得到了一张画好三角形并标注了面积的纸张,任务完成,如图2-1所示。
图2-1 画三角形并计算面积(1)
现在把小李比喻成计算机的CPU(中央处理器),那么书桌就是内存,绘制三角形的步骤就是软件,一个步骤就是一条指令(语句),老李就相当于程序员,而那张画了三角形并标注了面积的纸张就是软件的输出(在屏幕上显示或者打印出来),“画一个三角形并计算面积”就是软件要完成的任务(程序要处理的数据)。
几天后,老李要画更多不同的三角形并计算出面积,如果还是按照原来的方式,那么针对每个三角形,老李都要给小李两张纸,一张纸标明3个点,另一张纸写明步骤。这样做一方面浪费了纸张,另一方面增加了工作量。于是老李想出了一个办法,只交给小李一张写有步骤的纸张,画一个三角形并计算面积的步骤改为:
(1)询问A点的坐标。
(2)询问B点的坐标。
(3)询问C点的坐标。
(4)画一条直线连接A点和B点。
(5)画一条直线连接B点和C点。
(6)画一条直线连接C点和A点。
(7)根据公式计算三角形的面积。
|(xb-xa)×(yc-yb)|-[|(xb-xa)-(ya-yb)|+|(xb-xc)(yc-yb)|+|(xc-xa)(yc-ya)|]÷2
(8)交回画了三角形并标注了面积的纸张。
这样,小李收到老李递过来的纸张后,先询问老李三角形3个顶点的坐标,再画三角形并计算面积,如图2-2所示。
图2-2 画三角形并计算面积(2)
现在不只是老李,任何人只要复印那张写了步骤的纸张,都可以让小李画出任何他们想要的三角形,只不过小李在画三角形前需要询问顶点的坐标。继续把这些步骤比喻成软件,那么相对于前面的软件,这次增加了3条输入语句,用户在运行这个软件时,要输入三角形3个顶点的坐标,然后会在屏幕上看到一个三角形及其面积。
至此,我们总结出这个软件具有以下特征。
(1)完成任务:画三角形并计算面积。
(2)输入数据:顶点坐标。
(3)输出结果:三角形及三角形的面积。
(4)指令集:详细定义画一个三角形的步骤和计算三角形面积的方法。
将指令集保存在一个文件中,这个文件就叫作可执行程序,允许被存放在硬盘、U盘、光盘或者网盘中,可以被任意复制和传播。比如,Windows操作系统中的“计算器”,这个程序(指令集)保存在硬盘上的C:\Windows\System32\calc.exe文件中,双击它或者执行“开始”→“所有程序”→“附件”→“计算器”命令,即表示命令CPU现在就按照里面的步骤进行操作(术语称为执行指令)。
最后,我们通俗地定义一下软件:软件是由程序员编写的让CPU完成某项任务的步骤。这些步骤是用计算机语言来描述的。常见的计算机语言有C、C++、Java、PHP、Go等语言,编程人员必须严格按照计算机语言的语法规则来编写程序,例如,使用C语言实现加法运算。
上面左侧灰色框内就是程序员使用C语言编写的计算两个数相加的程序语句,右侧是说明信息。
软件必须包含输入/输出语句和计算语句。没有输入/输出语句的软件没有任何用途,因为它就像一个黑盒子,既不能输入任何内容,也不能从它那里得到任何东西。在这里,我们要澄清两个概念:实时输入/输出和批量输入/输出。实时输入/输出是指CPU在执行输入/输出步骤时,立即完成输入/输出动作;而批量输入/输出是一次性输入全部的信息,一次性输出全部的计算结果。大部分计算机软件,如办公软件,都要求实时输入/输出;绝大部分网站是批量输入/输出的,如注册一个在线免费邮箱,我们需要一次性输入全部的注册信息,再单击“提交”按钮,提交全部的输入信息。
实时输入/输出软件可进一步划分为强交互性软件和弱交互性软件两种。强交互性软件是指在运行时需要实时地进行大量输入/输出操作,且输入之后马上能看到输出结果的软件;弱交互性软件是指在软件运行时只需实时地进行少量的输入操作,就能源源不断地输出的软件。强交互性软件有微软的办公软件(Word、Excel、PowerPoint等)、记事本、QQ、Photoshop、AutoCAD、WPS、金山词霸、Visual Studio、Eclipse、Vim等,它们共同的特点是输入的内容可以马上在屏幕上显示出来。弱交互性软件有酷狗音乐播放器、暴风影音、PPTV、Adobe Reader、家庭相册、迅雷下载等。
在规划云计算方案时,要特别关注软件的输入/输出是实时的还是批量的。如果是实时的,那么还要进一步区分是强交互性的还是弱交互性的。对于实时的强交互性软件,有两种解决方法:第一种解决方法是将计算机网络的延时控制在合理的范围内(一般要小于100毫秒),手段是就近部署云计算分支中心。如果延时过长,那么当使用如Word等排版软件时,需要等待一段时间后才能在屏幕上看到刚才输入的字符,用户的体验感很差。第二种解决方法是改造软件,使软件可以通过网页浏览器访问,用户只与本地的网页浏览器进行实时输入/输出交互,而网页浏览器与“云”中的软件进行批量输入/输出交互,如图2-3所示。
图2-3 使用网页浏览器改造强交互性软件
计算机网络延时的概念会在2.3节详细介绍。
我们用图2-4来表示一个软件运行模型。
图2-4 软件运行模型
一个软件以文件的形式保存在硬盘上,当我们双击它时,这个软件就被读到内存中,此后,CPU就按照里面的步骤一步步执行。当执行到一些输入步骤时,就要从输入设备上获取信息(常见的输入设备有键盘、鼠标、扫描仪、话筒、摄像头、网络等);当执行一些计算步骤时,需要用到计算设备;当执行输出步骤时,把计算结果通过输出设备输出(常见的输出设备有显示器、打印机、绘图仪、音箱、耳机、网络、机械手等)。一些较大的软件,不一定是按照“输入—计算—输出”的顺序进行的,在软件执行的过程中,随时可能需要输入,也随时可能需要输出,计算步骤也可能安排在任意时刻。一个正在运行的程序被称为进程。
注意,硬盘上的文件既可以作为输入设备,也可以作为输出设备。例如,编辑一个已经存在的PPT文档,这个文档首先作为输入设备,PPT文档中的内容被读到内存中,编辑完成后保存时又作为输出设备,内存中被修改的内容被写入这个PPT文档。计算设备一般指CPU、内存、存储(硬盘属于最典型的存储)和网络。为什么网络也算计算设备呢?因为在云端运行一个分布式应用程序时,网络是必需的。换个角度来看,计算设备就是程序在运行时需要使用的资源——计算资源。硬盘上的PPT文档本身不是程序,只是用于输入/输出的数据文件,双击它能打开并进行编辑,实际上在这一过程中运行了powerpoint.exe程序,因为在安装办公软件时自动建立了数据文件和程序的关联,建立好关联之后,只要双击数据文件,就能运行关联的程序。
最后,我们总结一下本节的知识点。
(1)软件是由程序员编写的让CPU完成某项任务的步骤。
(2)这些步骤分为输入/输出步骤和计算步骤两大类。
(3)输入/输出步骤要使用输入/输出设备,计算步骤要使用计算设备,计算设备也称为计算资源。
(4)键盘和鼠标是最常见的输入设备,显示器和音箱是最常见的输出设备,CPU、内存、存储和网络统称为计算资源。
(5)软件平时保存在硬盘里,但必须被读到内存中执行,一个软件可以被多次执行。
计算设备和输入/输出设备的分离是云计算的特征之一。也就是说,对云计算而言,计算设备位于远方的云端,而输入/输出设备就在眼前。