出了什么毛病
1981年4月12日,美国航天飞机“哥伦比亚”号载着两名宇航员,从佛罗里达州卡纳维拉尔角被固体燃料助推火箭送上了空间轨道,经过54.5个小时的飞行绕地球36周后于4月14日安全着陆,航天飞机首航成功。然而,在很长一个时期内,为世人所不知的是,“哥伦比亚”号航天飞机的首航日期,本来应该是在这之前的另一个日子。
那一天,也是在卡纳维拉尔角的肯尼迪航天中心,也是那两位宇航员,他们已经安然地坐在“哥伦比亚”号航天飞机的驾驶舱中。在湛蓝的天空中,依稀可见点点晨星在闪烁。不到20分钟,他们将作为航天飞机的首批乘客飞向太空了。发射已经进入了倒计时,计数器正闪着荧光向零接近。
突然,警灯发出了刺眼的红光,计数器也停止了记数,航天控制中心顿时紧张起来。技术人员们很快查出原因,原来是控制中心的计算机系统出了毛病,而且毛病不是出在硬件系统上,而是出在软件上。
技术人员们立即意识到,他们面临的是一个严重的问题。控制航天飞机的计算机程序包括近50万条指令,要从中查出错误,无异于在一本厚厚的百科全书中查找一个拼错了的单词,在短时间内是无法排除软件故障的,这样一个经过长时间精心准备的航天计划不得不延期执行。
其实在美国的航天记录里,类似的事故以前就发生过多次。1965—1970年,美国范登堡基地发射火箭多次失败,控制系统故障是失败的主要原因,而控制系统的故障又主要是由应用程序的错误造成的,有时程序中一点点小错误就可以造成灾难性的后果。有一次美国发射了一枚火箭,火箭升至距离地面几十英里的高空就开始翻滚,地面控制中心不得不下令炸毁了这枚价值近2000万美元的火箭。事后查找事故的原因,发现这竟然是由控制程序中漏掉了一个连字符引起的(图6-1)。美国空军的一个运行了8年之久的应用软件,在经过了多次修改之后仍然检查出60条隐患,其中有27条可能酿成灾难性后果。

图6—1 一个连字符可以毁掉这样一个大力神火箭
严格地说,计算机软件系统发生这些不可容忍的错误,也很难完全归罪于那些经过严格训练和审查的程序编写人员。IBM360系列计算机是一个成功的范例,它被誉为第三代计算机的杰出代表,IBM公司在这个系列的系统软件上投入了大量的财力和人力,研制费用花了2.5亿美元,在4年期间平均每年投入研制人员1000余人,编制出的指令达500万行。由于规模太大,可靠性很差,IBM公司不得不成立专门小组,负责查找和修改系统软件中的错误,并要求计算机用户解释反映运行中发现的问题。尽管采取了这些严密的措施,也不断地发行了修改软件的新版本,错误仍然无法杜绝,软件中的错误总保持在1000条左右,这反映了软件可靠性不高是一个相当普遍的严重问题。
计算机软件与硬件不匹配,始终是计算机发展进程中的一个突出的矛盾,这个矛盾成为推动计算机科学技术进步的一个内在动力。
早期的“冯·诺依曼机”,即“存储程序计算机”,设计算法和编写程序一般都由一个人进行,工作十分繁冗,加上不同型号的计算机指令代码也不一样,因此,程序没有通用性,不能进行交流。在这种情况下,虽然电子计算机把人们从繁冗、复杂、重复的数值计算中解放出来,却又把人们的智力禁闭到繁冗、复杂、重复的程序编制之中。计算机软件的这种生产方式,可以称为“个体手工业方式”。
个体手工业方式的程序编制是一件专业性很强的工作,专业性很强的原因就是那时人们对计算机发指令使用的是一种很原始的语言,即机器语言。对于一般人(包括非专业从事程序编制工作的数学家)来说,要读懂一条由0和1两个数码组合成的机器指令,其难度不亚于凭借词典和语法书来译读自己看不懂的外语文献。