‹  返回课程

第1章《启蒙》. 什么是硬件、软件、程序

课文
阅读量:663
技术范畴
理解:车是硬件,但开车使用的技术,开车所要遵守的交规则是软件。方向盘是硬件,打方向盘的角度、速度、力度则是输入数据。输入数据控制了硬件,而后又产生输出速度:车轮的转向……先加油、然后轻点刹车……再打方向盘……一组“有逻辑”的开车操作的组合,称为“程序”。
课前导言
理解:车是硬件,但开车使用的技术,开车所要遵守的交规则是软件。方向盘是硬件,打方向盘的角度、速度、力度则是输入数据。输入数据控制了硬件,而后又产生输出速度:车轮的转向……先加油、然后轻点刹车……再打方向盘……一组“有逻辑”的开车操作的组合,称为“程序”。
第1章《启蒙》. 什么是硬件、软件、程序
用程序员的眼光,重新认识硬件、软件、指令、程序

1. 什么是硬件?什么是软件?

我坐在电脑前发呆了半个小时,还是没想出如何给二者下定义。

美国有个电脑神童说:“凡是摔到地上会坏的就是硬件”,似乎有道理,但一旦硬件坏了,硬件所承载的数据,好像也会“消失”。想一想,新买的数码相机没用就摔坏是一种心疼,和女神春游拍了很多照片,回来的路上给摔坏了,又是一种心疼。那些照片数据算硬件还是软件呢?

还一种说法是:看得见摸得着的为硬件,看不见摸不着的为软件。刚觉得它说得不错,但马上我就发觉了它的破绽:我使用苹果平板的操作系统,它就在屏幕上,我看着它,感觉界面优美;我触摸它,感觉操作方便……

无奈之下,我搬出辞典,它说:

“硬件:计算机及其它直接参与数据运算或信息交流的物理设备” 。可见,硬件就是设备。平常我们生活中的各种设备,洗衣机、冰箱、电视、螺丝刀、钳子等,都是硬件。

“软件:控制计算机硬件功能及其运行的指令、例行程序和符号语言”。指令、程序和符号语言是什么且不说,至少我们得知:软件是用来控制硬件的运行的。

这么一说,前面以汽车为例所提到的“输入输出设备:方向盘、刹车板、油门……”是硬件;而“输入输出数据”,即:人类转动方向盘的力度、速度、扭矩,踩油门或刹车板时脚的行程这些数据,以及这些数据通过硬件展现出来的汽车各类性能,属于软件范畴。表面上看是硬件控制汽车的运行,但其实是这些软件数据控制着车。

再者,如何掌握好“力度、速度、扭矩、行程”这些数据的输入,以及它们之间的配合,叫做驾驶技术,也是一种软件。另外,在茫茫大草原、在高山峻岭以及在周五下班的城市里开车,你所能使用出的驾驶技术也不相同。因外部环境限制带来的各种“驾驶规则”,也是软件。

想要成为一名驾驶员,当然要学习和汽车自身紧密相关的驾驶技术,当然也要学习用以限制你如何开车的交通规则,当然也要学习一点汽车的硬件知识。

《白话C++》当然不能只教“C++”这门语言的课,它还得讲点编程的规则,还得讲点计算机硬件的知识。

所以,您应该不会太反感一本讲编程的书,为什么要有一个“启蒙”的章节呢?为什么不能迅速深入痛快地,说说C++的那些事儿呢?

我才不呢,既然是要学习编写程序,那我们就得说说什么叫“程序”。

2. 什么是程序?

计算机程序是一组指令(及指令参数)的组合,这组指令依据既定的逻辑控制计算机的运行。

2.1 指令

让我们来想象一个游戏。

游戏中有两个人,其中一个双眼用布蒙上。另一个人是你。你不哑,他不聋。场地中混乱地摆上许多啤酒瓶(称为“雷区”)。游戏任务是由你发号施令,指挥被蒙眼者从场地的一端穿行到另一端,过程中不能碰倒啤酒瓶。

现在,你就会明白什么叫“指令”。指令就是一套符号,这套符号的含义,你懂,他也懂。

你会根据现场情况,向他发出类似这样的指令:“向前2.5步、向左1步,向后1.5步,向左0.5步,向前4步,停!”。

“向前”,这就是指令。“2.5步”,这就是指令所需要的参数。在不需要具体区分时,我们也往往将“指令和指令的参数”有时通称为“指令”,有时通称为“数据”。

不同的处理器往往会有自己的一套指令(称为指令集)。如果把锤子当作一个处理器,它的指令应该是“锤”。剪刀则是“剪”。换成汽车呢?如果你是初学者,正好,你的师傅坐在副座上,你就有幸听到相对复杂的指令了:“左转!右右右!踩离合!油门!减档!刹车!停!!滚!!!”。最后一个指令很明确不属于汽车的指令集。

2.2 指令兼容

对于计算机而言,不同的“处理器”类型——不同产家生产的处理器,甚至同一产家生产的不同版本的处理器,往往都会有不同的指令集合。为了商业利益,有些厂家间就会进行“联衡”,相互之间保持尽量大的兼容,当然也各有留了一手特定指令。典型的如Intel和AMD两家CPU产商。当然也会因为厂商策略,产品定位等不同,而无法实现兼容的指令集合,比如当前智能手机使用的的ARM-CPU,就和桌面PC机CPU的指令不兼容。

我们学习C++的推荐环境,是桌面PC,包括笔记本,所采用的CPU基本使用Intel或AMD等厂商的生产的CPU,这一类指令集称为“80x86 CPU 汇编指令”。

2.3 程序 = 指令的逻辑组合

这是我们给出的第一个回答“计算机程序是什么”的表达:

“计算机程序是一组指令(与其所需的参数),这组指令依据既定的逻辑控制计算机的运行。”

在这个定义中,有三个重要的概念。其中,我们谈到了程序中的“指令”,但是我们还没有谈到“组合”及“逻辑”。

继续前面的“雷区安全穿越”游戏。

理论上,如果场地不变、酒瓶摆放位置不变、参与人不变,那么作为指挥者,你完全可以把第一次的指挥过程记录在案,形成一套“指令的组合”,如下图:

过雷区指令组合

(图1-2 程序 = 指令的组合)

看,这就是程序!一组共六个的指令(及其所需数据)的组合。六步之间的组合逻辑又是什么?就是要帮助你成功地走出“雷区”的逻辑。这个最终目标,通常我们称为“业务需求”。

指令组合的结构又是什么呢?首先,指令和指令之间有次序关系,游戏者必须先执行完第1步,再做第2步……乱着来这个程序就完全失效了。从本例上看,就是要顺序执行,但有时会碰上更复杂的雷区,就有可能用上更复杂的结构,比如“重复”。发指令者会在某一种这么说“请重复前面两步三次”。在计算机程序中它叫“循环结构”。

在以后的学习过程中,很多时候我们认为程序就是指令;同样很多时候,我们会觉得程序就是逻辑。

 

3. 程序 vs. 软件

还有很多的时候,我们也不区分“程序”和“软件”二者。也许前者更趋于抽象,而后者趋于具体。比如我们在写那些表达我们的思想逻辑时,我们喜欢说“写程序”;而当程序完成,可以待价而沽时,我们称它为软件产品。

课后补充

下一节:什么是编程语言

我们要对计算机下达指令,人类这一套得天独厚有悠久历史的自然语言,玩不转了,怎么办呢?解决这一问题所要做的第一件事就是:制定“机器语言”——机器有了语言,我们就可以和它亲切地交流……

“等等!”突然有个同学没举手就站起来要求发言:“机器,没有生命的东西!小猫小狗有语言倒可以接受,机器也有语言,还要我们去学习,这亵渎我作为人类的尊严!我要退学!”。

得解开这个结解,不然自尊心强的同学心生学习障碍。