1.4 什么是程序
什么是计算机程序?
计算机程序是一组指令(及指令参数)的组合,这组指令依据既定的逻辑控制计算机的运行。
1.4.1. 什么是指令?
让我们来想象一个游戏。
游戏中有两个人,其中一个被布蒙上双眼。另一个人是你。场地中混乱地摆上许多啤酒瓶。游戏任务是由你发号施令,指挥被蒙眼者从场地一端穿越到另一端,其间不允许碰倒任意一个啤酒瓶。
附加一个游戏前提:你不哑,他不聋。
现在,你就会明白什么叫“指令”。指令就是一套符号,这套符号的含义,你懂,他也懂。
你会根据现场情况,向他发出类似这样的指令:“向前,0.5步、向左1步,向后2步,向左0.5步,向前4步……停!”。
“向前”,这就是指令。“0.5步”,这就是指令的参数。在不需要具体区分时,我们也往往将“指令和指令的参数”通称为“指令”。
不同的工具,往往有不同的指令集。
比如锤子,它的指令应该是“锤”(或是“砸”?)。剪刀则是“剪”。呵呵,这样工具的功能单一,所以指令自然也简单了些。
换成汽车呢?如果你是初学者,正好,你的师傅坐在副座上,你就有幸听到相对复杂的指令了:“左转……太大了!右转一点点,踩离合!油门!又大了!刹车!”。
〖轻松一刻〗:关于开车的“指令”
我有一位女学员,她在学习编程的同时也在学习驾驶。今天她很郁闷的过来问我:“老师,‘笨蛋’也算是一种驾驶指令吗?” 在此,我要向驾校的老师提个建议:请使用文明指令。
1.4.2. 指令兼容
对 于计算机而言,不同的“处理器”类型——不同产家生产的处理器,甚至同一产家生产的不同版本的处理器,往往都会有不同的指令集合。为了商业利益,有些厂家 间就会进行“联衡”,相互之间保持尽量大的兼容,当然也各有留了一手特定指令。典型的如Intel和AMD两家CPU产商。还有一些厂家则特定独行,采用 完全不同于竞争对手的指令集合,比如曾经的IBM或苹果电脑,就采用各自独立的CPU。
通常我们使用的电脑,都使用Intel或AMD生产的中央处理器(CPU);这一类指令集被“80x86 CPU 汇编指令”。
1.4.3. 复杂指令集与精简指令集
指令集的定义,可以分为“复杂指令”或“精简指令”。比如锤子,我们说它的指令是“锤”。其实是“锤”这个动作,还可以分解为“抡起”、“瞄住”、“砸下”。而剪刀,也至少可以再分为:“张开剪”、“合上剪”两个指令。
指 令过程,必然存一个“发号者”和一个“接受者”。如果接受者接收到某一指令之后,必须将该指令继续细分为多个步骤(子指令)执行,这称为“复杂指令集”: 采用这种指令集的处理器的计算机,称为CISC(Complex Instruction Set Computer)。相反,每一个指令尽量仅定义一个最精简的动作,接受者不需要再细化单一指令的动作,这样的指令集称为“精简指令集”,采用“精简指令 集”的计算机,称为RISC(Reduced Instruction Set Computer)。
通常我们采用的PC,属于“CISC”。
1.4.4. 程序=指令的逻辑组合
这是我们给出的,第一个有关“程序是什么”的表达式。
“计算机程序是一组指令的组合,这组指令依据既定的逻辑控制计算机的运行。”
在这个定义中,有三个重要的概念。其中,我们谈到了程序中的“指令”,但是我们还没有谈到“组合”及“逻辑”。
继续前面的过啤酒瓶游戏。
理论上,如果场地不变、酒瓶摆放位置不变、参与人不变,那么作为指挥者,你完全可以把第一次的指挥过程记录在案,形成一套“指令的组合”。
看!这就是程序,一组指令的组合,并且在逻辑上,它们的组织方法就是保证执行者安全通过酒瓶区。
从整体上讲,指令的组合方式,最终决定于它在逻辑目标;从细节处讲,所有程序的指令组合,都至少有一个组合要求:时序,或称为步骤。前面的step1~step6,听令者必须按步骤次序执行,这套指令组合才有意义。
在以后的学习过程中,很多时候,我们认为程序就是指令;同样很多时候,我们会觉得程序就是逻辑。
1.4.5. 程序 VS. 软件
还有很多的时候,我们也不区分“程序”和“软件”二者。也许前者更趋于抽象,而后者趋于具体。比如我们在写那些表达我们的思想逻辑时,我们喜欢说“写程序”;而当程序完成,可以待价而沽时,我们称它为软件产品(似乎有些违背“自由软件”的精神,汗!)。