第七章 计算机程序设计和软件计算机程序设计和软件
一、程序的概念
如果没有程序,计算机什么也不会做。程序是计算机的一组指令,经过编译和执行才能最终完成程序设计的动作。程序设计的最终结果是软件。
直到70年代中期,程序设计还只是信息服务专业人员的工作。用户的进一步知识化和可使用的高级程序语言的多样化使得用户进入了软件开发领域。用户管理人员在办公室里为自己的多项服务请求编制程序要比将一个服务请求交给别人来编程序容易得多。
二、程序设计语言的层次体系
图20.7.1说明了程序设计语言的层次体系。图中将程序设计语言分为低级语言和高级语言两类。“级”是指程序员与计算机对话的复杂程度。例如,就查询语言来说,程序员(经常是用户管理人员)只需要涉及到计算机“做什么”,而不必涉及到计算机“怎样做”。在高级语言中,程序员必须提供详细说明“做什么”和“怎样做”的指令,而软件工具将帮助简化程序员的工作。低级语言要求程序员详细说明由计算机执行的每一级操作。在使用高级程序设计语言时,程序员不必记住数据在主存中的存储单元。这是由系统自动做的。而在使用低级语言时,程序员必须在程序中提供相应的逻辑,以便监视数据在主存中的物理位置。
图20.7.1 程序设计语言的层次体系
□ 低级语言
虽然人们用COBOL、PASCAL和FORTRAN来谈论程序设计,但是只有一种语言能够在给定的计算机上执行。那就是所谓的机器语言。所有其他语言都要被编译(翻译成机器语言),并且最终用机器语言来执行。
机器语言是很繁琐的,因为指令(又称操作码或OP码)和运算数据的单元是用二进制(一串0和1)来表示的。符号语言(有时称作汇编语言或汇编级的语言)具有一个本质上与机器语言一一对应的指令系统。汇编语言的优点是它用助记符号而不是用0和1来表示指令。例如,汇编语言中直接用“A”来表示“加”指令,而不用一串0和1来表示。
在1970年之前,机器级和汇编级语言常常用于应用程序的开发,特别用于系统软件的开发。当时信息服务人员认为目标程序利用计算机的效率高。自那时以来使用高级语言无论在发挥人或是计算机的效率上都超过了机器语言。由于这一原因,多数现行的程序设计都是用高级语言来完成的。
□ 高级语言
1.面向过程的语言
面向过程的语言(POL)是极其灵活的,可以用来刻划几乎所有科学的和商业的过程。程序顺序地编写指令,而系统则根据用户的规定进行处理。例如,工资系统就是使用POL来编定的。除非由程序逻辑控制去做其他事情,否则程序中的每一条指令都是按顺序执行的。在一个工资单生成系统中,执行程序指令的特定顺序取决于被处理的职工的工资计算方法(是按月发工资,还是按工时计算工资)。对每个职工都要重复该程序流程的顺序。有三种主要的POL:科学计算的、商用的以及多用途的。下面我们分别讨论每一种POL。
(1)科学计算的语言。科学计算的语言是代数或公式化的语言。这种语言是为了满足典型的科学计算处理要求(矩阵操作、精度计算以及其它方面)而设计的。第一个而且仍然是最为流行的科学计算语言是FORTRAN(公式翻译程序的缩写)。尽管在没有商业语言时(在计算机不支持任何其它语言的情况下)FORTRAN已作为一种商用语言来使用了,但是FORTRAN的商业处理能力是有限的。
APL语言很快地抓住了一些用户(主要是工程师)。APL是唯一使用带有专用符号的交互式键盘来编写程序的语言。
(2)商用语言。目前很流行的第一个商用语言是COBOL(面向商业的公用语言的缩写)。它是一种功能很强而又极为冗长的语言。发展COBOL语言的前提是:该语言的语句应该近似于英语。有些程序员发现语言使用起来很麻烦。然而,COBOL语言尚处于方兴未艾的时期,而且被广泛地接受。今天,人们正在继续对它进行改进。在若干年内,COBOL仍将是一种流行的商用语言,但是使用该语言的相对百分比将会下降。COBOL最适合于具有循环处理周期的环境(例如打印工资支票)以及数据操纵量相当大的环境。
美国国家标准研究所(ANSI)已经对COBOL和其他语言建立了标准。建立这些标准的目的是使得在一台计算机上编写的程序可以移植到另一台(即另一个厂商制造的)机器上去。不幸的是,ANSI标准很少被遵循;因此,COBOL程序只是部分可移植的。
报表程序生成程序(RPG)可能是仅次于COBOL的最为流行的商业语言了。最初设计的RPG是在IBM公司数据录入级的计算机上使用的。它用于一些成批处理环境的小型商业工作。RPG与其它POL不同之处在于程序员还必须通过选择所要求的程序设计特色来说明某些处理要求(例如何时打印小计记录的选择等等)。
BASIC设计者的最意图体现在该语言的名字上——初学者通用的符号指令码(Baginers All-Purpose Symbolic Instructional Code)。最初它被当作讲授程序设计的一个工具,但是在这个“初学者”语言的能力被充分扩充后,它变得如此流行,以致目前BASIC是小型计算机系统上用于应用程序设计的一种上要语言。在大系统上也使用扩展BASIC,但不是用于生产系统。由于BASIC通常也用来进行少量的科学计算,因此,有人可能把它划归为多用途POL一类。
(3)多用途语言。多用途语言对于商业和科学计算是同等有效的。最为明显的多用途语言是程序计算语言1/(即PL/T)。PL/1是在1956年由IBM公司普制出来的,但是,与任何一种语言一样,它需要几年的时间来排错。许多公司(主要是IBM公司的用户),已经采用PL/1作为它们所使用的唯一的POL。在刚刚引入PL/1时,由于它克服了现有程序设计语言的许多缺点而受到欢迎。然而,PL/1仍然没有得到(原先期望那样)普遍地接受。其原因并非它的质量和能力,而是由于许多公司已花了巨大投资用COBOL和FORTAN编制了大量应用软件。同时也由于使用这两种语言的势头还在增长。
以最快速度发展起来的语言是PASCAL,它是以17世纪的数学家Blaise Pascal来命名的。PASCAL被看成是一种最新的POL。尽管只有1%-2%的商业生产程序是用PAS-CAL写的,但是它的能力、灵活性以及自我说明结构是不可忽略的。致使这个语言被广泛接受(而且接受面还在继续增大)的原因或许是因为绝大多数的学院和大学的计算机科学教程主张将PASCAL作为未来的POL。随着毕业生将这种主张带进商业界,目前它已经引起了各界的兴趣。ADA是新近引入的一种语言,它是美国国防部开发的一种多用途语言。尽管只有少数人知道和理解ADA的用法,然而对于它能否被广泛接受(不仅在军界,对其他部门也一样)。这一点,它的设计者们是很乐观的。
2.面向问题的语言
面向问题的语言,是专门为了满足某种特定应用或解决特定问题的一组语句。面向问题有的语言不要求像面向过程的语言的那种详细说明。例如,有几种面向问题的语言就是专为统计分析而设计的。这种语言的用户将注意力更多地集中在输入和输出上,而不是在数学上。数学是嵌入在语言中的。
已经为几十种应用设计了各种面向问题的语言,这些语言正在被用户使用。这些应用是:离散和连续模拟(例如,GPSS、SIMSCRIPT、GASP-IV),程控机器刀具(例如,APT),辅助工程师进行建筑和桥梁上的受力点分析(例如,GOGO),辅助系统分析(例如,SAS)以及辅助办公人员进行字处理(例如,SCRIBE)。
面向问题的语言具有做统计、字处理和任何语言所满足的应用的灵活性。然而,一种面向问题的语言总是局限于某种应用。
3.查询语言
与其它高级语言相比,用户和用户管理人员更喜欢使用查询语言。然而,根据不同的情况,某个用户可能会发现某种特定的面向问题的语言对他更有用。查询的语言是朝着用户环境发展的典范。一个用户管理人员经过几个小时的培训和实践就能有效地使用一种查询语言。然后,他用很短的时间就能从一个信息系统中抽取信息或产生出一张报表。而通常这点时间只够用来向一个系统分析员或程序员说明技术要求。用户只需说明做什么,而查询语言软件将自动规定怎样做。
查询语言利用高级的、类似英语的命令来检索和编排满足管理查询和制表要求的数据。用查询语言可以交互式地完成一次询问(直接与计算机通信)。执行程序产生的输出直接在终端上显示出来,或者产生一份硬拷贝。查询语言具有以下特色:类似于英语的命令,对数据的有限的数学运算操作,对报表的自动编排、排序以及按关键字挑选记录等。
下面的例子说明一种查询语言及其使用方法。一个人事经理查看图20.7.2所示的报表。为了实现这个报表,这个经理使用一种叫做EASYTRIEVE(由Pansophic System公司销售的一个软件产品)的查询语言来编制他请求的“程序”表20.7.1说明了这个程序。
表20.7.1的第一句说明工资数据储存在叫做“FILEA”的文件中,尽管在此例中只使用了一个文件,但是要求使用几个文件,或一个数据库是没有更多困难的。第二行描述了产生图20.7.2中的报表所要求的文件中的数据元。用户事先需要知道记录的格式。记录格式指出每个数据元在记录中的相对位置,它的类型,以及它是字母的,还是字母数字的。第一项DEPARTMENT(部门),从记录的第98个字符位置开始,占三个字符长度(N表示数字,而A表示字母数字)。名字字段从第17个字符位置开始,占20个字符(字母数字)长度,语句终止于一串9,如第三语句号中所示,用一个“IF”语句来规定挑选记录的关键字值。经理所感兴趣的只是在部门911和914中的那些职工。如果想挑选更多的记录,还可以再使用若干“IF”语句。
语句(4)说明应该按部门来排序输出;也就是说,部门号为911的职工应排在部门号为914的职工前面。通过再使用一个“排序”语句可以将一个部门的职工按其名字的字母顺序排序。
语句(5)指出应该计算总计和打印输出的那些点。本例中,对每个部门要求计算总计。
语句(6)和(7)允许人事经理规定报表的标题以及有关的列的标题。语句(6)是第一层标题。
语句(7)规定了用更加明显的列标题来替换程序中缩写的标识(如,将用“EMPOLOYEE NAME”代替“NAME”)。对于“快速和非正式”的报表可以省略语句(6)和(7)。在COBOL程序中,与上述人事经理的请求相等价的程序将要求150行以上的源程序语句。
可以按交互式使用查询语言,来请求如下的信息:自1月1日以来,哪些职工的病假超过20次?今天有没有腾出高级的单间病房?某年级学生的所有数学课程的平均分是多少?按照部门标题名的字母顺序列出已超过预算的那些部门等等。通过查询语言可以很容易地完成对于多少个文件和数据库的少量查询,例如,对于一个不知道Pat Brown(伯特