程序设计语言是人和计算机通信的最基本的工具,它的特点必然会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。因此,编码之前的一项重要工作就是选择一种适当的程序设计语言。
适宜的程序设计语言能使根据设计去完成编码时困难最少,可以减少需要的程序测试量,并且可以得出更容易阅读和更容易维护的程序。由于软件系统的绝大部分成本用在生命周期的测试和维护阶段,所以容易测试和容易维护是极端重要的。
使用汇编语言编码需要把软件设计翻译成机器操作的序列,由于这两种表示方法很不相同,因此汇编程序设计既困难又容易出差错。一般说来,高级语言的源程序语句和汇编代码指令之间有一句对多句的对应关系。统计资料表明,程序员在相同时间内可以写出的高级语言语句数和汇编语言指令数大体相同,因此用高级语言写程序比用汇编语言写程序生产率可以提高好几倍。高级语言一般都容许用户给程序变量和子程序赋予含义鲜明的名字,通过名字很容易把程序对象和它们所代表的实体联系起来;此外,高级语言使用的符号和概念更符合人的习惯。因此,用高级语言写的程序容易阅读,容易测试,容易调试,容易维护。
总的说来,高级语言明显优于汇编语言,因此,除了在很特殊的应用领域(例如,对程序执行时间和使用的空间都有很严格限制的情况;需要产生任意的甚至非法的指令序列;体系结构特殊的微处理机,以致在这类机器上通常不能实现高级语言编译程序),或者大型系统中执行时间非常关键的(或直接依赖于硬件的)一小部分代码需要用汇编语言书写之外,其他程序应该一律用高级语言书写。
上述这些要求是选择程序设计语言的理想标准,但是,在实际选择语言时不能仅仅使用理论上的标准,还必须同时考虑实用方面的各种限制。下面是主要的实用标准。
系统用户的要求。 如果所开发的系统由用户负责维护,用户通常要求用他们熟悉的语言书写程序。
可以得到的软件工具。 如果某种语言有支持程序开发的软件工具可以利用,则目标系统的实现和验证都变得比较容易。
工程规模。 如果工程规模很庞大,现有的语言又不完全适用,那么设计并实现一种供这个工程项目专用的程序设计语言,可能是一个正确的选择。
程序员的知识。 虽然对于有经验的程序员来说,学习一种新语言并不困难,但是要完全掌握一种新语言却需要实践。如果和其他标准不矛盾,那么应该选择一种已经为程序员所熟悉的语言。
软件可移植性要求。 如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的。
软件可移植性要求。 如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的。
软件的应用领域。 所谓的通用程序设计语言实际上并不是对所有应用领域都同样适用,例如,FORTRAN语言特别适合于工程和科学计算,COBOL语言适合于商业领域应用,C语言和Ada语言适用于系统和实时应用领城,LISP语言适用于组合问题领域,PROLOG语言适于表达知识和推理。因此,选择语言时应该充分考虑目标系统的应用范围。
源程序代码的逻辑简明清晰、易读易懂是好程序的一个重要标准,为了做到这一点应该遵循下述规则。
1.程序内部的文档
所谓程序内部的文档包括恰当的标识符、适当的注解和程序的视觉组织等等。
选取含义鲜明的名字,使它能正确地提示程序对象所代表的实体,这对于帮助阅读者理解程序是很重要的。如果使用缩写,那么缩写规则应该一致,并且应该给每个名字加注解。
注解是程序员和程序读者通信的重要手段,正确的注解非常有助于对程序的理解。通常在每个模块开始处有一段序言性的注解,简要描述模块的功能、主要算法、接口特点、重要数据以及开发简史。插在程序中间与一段程序代码有关的注解,主要解释包含这段代码的必要性。对于用高级语言书写的源程序,不需要用注解的形式把每个语句翻译成自然语言,应该利用注解提供一些额外的信息。应该用空格或空行清楚地区分注解和程序。注解的内容一定要正确,错误的注解不仅对理解程序毫无帮助,反而会妨碍对程序的理解。
程序清单的布局对于程序的可读性也有很大影响,应该利用适当的阶梯形式使程序的层次结构清晰明显。
2.数据说明
虽然在设计期间已经确定了数据结构的组织和复杂程度,然而数据说明的风格却在写程序时确定的。为了使数据更容易理解和维护,有一些比较简单的原则应该遵循。
数据说明的次序应该标准化(例如,按照数据结构或数据类型确定说明的次序)。有次序就容易查阅,因此能够加速测试,调试和维护的过程。
当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。
如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。
3.语句构造
设计期间确定了软件的逻辑结构,然而个别语句的构造却是编写程序的一个主要任务。构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂。下述规则有助于使语句简单明了。
不要为了节省空间而把多个语句写在同一行。
尽量避免复杂的条件测试。
尽量减少对“非”条件的测试。
避免大量使用循环嵌套和条件嵌套。
利用括号使逻辑表达式或算术表达式的运算次序清晰直观。
4.输入输出
在设计和编写程序时应该考虑下述有关输入输出风格的规则。
对所有输入数据都进行检验。
检查输入项重要组合的合法性。
保持输入格式简单。
使用数据结束标记,不要要求用户指定数据的数目。
明确提示交互式输入的请求,详细说明可用的选择或边界数值。
当程序设计语言对格式有严格要求时,应保持输入格式一致。
设计良好的输出报表。
给所有输出数据加标志。
5.效率
效率主要指处理机时间和存储器容量两个方面。虽然值得提出提高效率的要求,但是在进一步讨论这个问题之前应该记住3条原则:首先,效率是性能要求,因此应该在需求分折阶段确定效率方面的要求。软件应该像对它要求的那样有效,而不应该如同人类可能做到的那样有效。其次,效率是靠好设计来提高的。第三,程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率。下面从3个方面进一步讨论效率问题。
(1)程序运行时间
源程序的效率直接由详细设计阶段确定的算法的效率决定,但是写程序的风格也能对程序的执行速度和存储器要求产生影响。在把详细设计结果翻译成程序时,总可以应用下述规则。
写程序之前先简化算术的和逻辑的表达式。
仔细研究嵌套的循环,以确定是否有语句可以从内层往外移。
尽量避免使用多维数组。
尽量避免使用指针和复杂的表。
使用执行时间短的算术运算。
不要混合使用不同的数据类型。
尽量使用整数运算和布尔表达式。
在效率是决定性因素的应用领城,尽量使用有良好优化特性的编译程序,以自动生成高效目标代码。
(2)存储器效率
在大型计算机中必须考虑操作系统页式调度的特点,一般说来,使用能保持功能域的结构化控制结构,是提高效率的好方法。
在微处理机中如果要求使用最少的存储单元,则应选拥有紧缩存储器特性的编译程序,在非常必要时可以使用汇编语言。
提高执行效率的技术通常也能提高存储器效率。提高存储器效率的关健同样是“简单”。
(3)输入输出的效率
如果用户为了给计算机提供输入信息或为了理解计算机输出的信息,所需花费的脑力劳动是经济的,那么人和计算机之间通信的效率就高。因此,简单清晰同样是提高人机通信效率的关键。
硬件之间的通信效率是很复杂的问题,但是,从写程序的角度看,却有些简单的原则可以提高输入输出的效率。例如:
所有输入输出都应该有缓冲,以减少用于通信的额外开销。
对二级存储器(如磁盘)应选用最简单的访问方法。
二级存储器的输入输出应该以信息组为单位进行。
如果“超高效的”输入输出很难被人理解,则不应采用这种方法。
这些简单原则对于软件工程的设计和编码两个阶段都适用。