软件工程课件:swguide4(编辑修改稿)内容摘要:

机内的运行效率很 高但编写出的机器语言程序其出错率也高。 ② 汇编语言(第二代语言):汇编语言比机器语言直观,它的每一条符号指令与相应的机器指令有对应关系,同时又增加了一些诸如宏、符号地址等功能。 存储空间的安排可由机器解决。 不同指令集的处理器系统就有自己相应的汇编语言。 从软件工程的角度来看,汇编语言只是在高级语言无法满足设计要求时,或者不具备支持某种特定功能(例如特殊的输入/输出)的技术性能时,才被使用。 ③ 高级程序设计语言(第三代语言)  传统的高级程序设计语言 :如 FORTRAN、 COBOL、 ALGOL、 BASIC 等。 这些程序语言曾得到广泛应用。 目前,它们都已有多种版本。 有的语言得到较大的改进,甚至形成了可视的开发环境,具有图形设计工具、结构化的事件驱动编程模式、开放的环境,使用户可以既快又简便地编制出 windows 下的各种应用程序。  通用的结构化程序设计语言 :它具有很强的过程功能和数据结构功能,并提供结构化的逻辑构造。 这一类语言的代表是 PL/1, PASCAL, C 和 Ada。 此外, COBOL7 Turbo BASIC等也应归入第三代程序语言范围。  专用语言 :专用语言是为特殊的应用而设计的语言。 通常具有自己特 殊的语法形式,面对特定的问题,输入结构及词汇表与该问题的相应范围密切相关。 有代表性的专用语言有APL、 Lisp、 PROLOG、 Smalltalk、 C++、 FORTH 等。 从软件工程的角度来看,专用语言支持了特殊的应用,将特定的设计要求翻译成可执行的代码。 但是它们的可移植性和可维护性比较差。 ④ 第四代语言( 4GL): 4GL 用不同的文法表示程序结构和数据结构,但是它是在更高一级抽象的层次上表示这些结构,它不再需要规定算法的细节。 4GL 兼有过程性和非过程性 10 的两重特性。 程序员规定条件和相应的动作这是过程性的部分,并 且指出想要的结果,这是非过程部分。 然后由 4GL 语言系统运用它的专门领域的知识来填充过程细节。 Martin 把第四代语言分为以下几种类型:  查询语言 :用户可利用查询语言对预先定义在数据库中的信息进行较复杂的操作。  程序生成器 :只需很少的语句就能生成完整的第三代语言程序,它不必依赖预先定义的数据库作为它的着手点。  其它 4GL :如判定支持语言、原型语言、形式化规格说明语言等。 (3) 程序设计语言的选择 为某个特定开发项目选择程序设计语言时,既要从技术角度、工程角度、心理学角度评价和比较各种语 言的适用程度,又必须考虑现实可能性。 有时需要作出某种合理的折衷。 在选择与评价语言时,首先要从问题入手,确定它的要求是什么 ? 这些要求的相对重要性如何 ? 再根据这些要求和相对重要性来衡量能采用的语言。 通常考虑的因素有 ① 项目的应用范围;② 算法和计算复杂性;③ 软件执行的环境;④ 性能上的考虑与实现的条件;⑤ 数据结构的复杂性;⑥ 软件开发人员的知识水平和心理因素等。 其中,项目的应用范围是最关键的因素。 针对计算机的 4 个主要应用领域,为语言做一个粗略的分类。 例如,在科学与工程计算领域内, C, C++ 语言 得到了广泛的应用,但 FORTRAN 仍然是应用最广泛的语言。 在商业数据处理领域中,通常采用 COBOL, RPG 语言编写程序,当然也可选用 SQL 语言或其它专用语言。 在系统程序设计和实时应用领域中,汇编语言或一些新的派生语言,如 BLISS, PL/ S, Ada, C++等得到了广泛的应用。 在人工智能领域以及问题求解,组合应用领域,主要采用 LISP 和 PROLOG 语言。 新的更强有力的语言,虽然对于应用有很强的吸引力,但是因为已有的语言已经积累了大量的久经使用的程序,具有完整的资料、支撑软件和软件开发工具,程序设计人员比较熟悉,而且有过类似项目的开发经验和成功的先例,由于心理因素,人们往往宁愿选用原有的语种。 所以应当彻底地分析,评价,介绍新的语言,以便从原有语言过渡到新的语言。 5. 程序复杂性度量 程序复杂性主要指模块内程序的复杂性。 它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。 同时它也是软件可理解性的另一种度量。 减少程序复杂性,可提高软件的简单性和可理解性,并使软件开发费用减少,开发周期缩短,软件内部潜藏错误减少。 (1) 代码行度量法 度量程序的复杂性,最简单的方法就是统计程序的源代码行数。 此 方法基于两个前提: 程序复杂性随着程序规模的增加不均衡地增长; 控制程序规模的方法最好是采用分而治之的办法。 将一个大程序分解成若干个简单的可理解的程序段。 方法的基本考虑是统计一个程序模块的源代码行数目,并以源代码行数做为程序复杂性的度量。 若设每行代码的出错率为每 100行源程序中可能有的错误数目, 例如每行代码的出错率为 1%,则是指每 100 行源程序中可能有一个错误。 Thayer 曾指出,程序出错率的估算范围是从 %~ 7%之间,即每 100 行源程序中可能存在 ~ 7 个错误。 他还指出,每行代码的出错 率与源程序行数之间不存在简单的线性关系。 Lipow 进一步指出,对于小程序,每行代码的出错率为 %~ %; 对于大程序,每行代码的出错率增加到 %~ %之间,但这只是考虑了程序的可执行部分,没有包括程序中的说明部分。 Lipow 及其他研究者得出一个结论:对于少于 100 个语句的小程序,源 11 代码行数与出错率是线性相关的。 随着程序的增大,出错率以非线性方式增长。 所以,代码行度量法只是一个简单的,估计得很粗糙的方法。 (2) McCabe 度量法 McCabe 度量法是一种基于程序控制流的复杂性度量方法。 McCabe 定义的程序复杂性度量值又称环路复杂度,它基于一个程序模块的程序图中环路的个数。 如果把程序流程图中每个处理符号都退化成一个结点,原来联结不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。 计算有向图 G 的环路复杂性的公式: V (G)= m- n+ 2 其中, V( G)是有向图 G中的环路个数, m 是图 G中有向弧个数, n 是图 G 中结点个数。 以图 为例,其中,结点数 n= 11,弧数 m=12,则有 V( G)= m- n+ 2= 12- 11+ 2= 3。 即McCabe 环路复杂度度量值为 3。 它也可以看做由程序图中的有向弧所封闭的区域个数。 当分支或循环的数目增加时,程序中的环路也随之增加,因此 McCabe 环路复杂度度量值实际上是为软件测试的难易程度提供了一个定量度量的方法,同时也间接地表示了软件的可靠性。 实验表明,源程序中存在的错误数以及为了诊断和纠正这些错误所需的时间与 McCabe 环路复杂度度量值有明显的关系。 Myers 建议,对于复合判定,例如( A= 0)∩( C= D)∪( X= 39。 A39。 )算做三个判定。 利用 McCabe 环路复杂度度量时, 有几点说明。  环路复杂度取决于程序控制结构的复杂度。 当程序的分支数目或循环数目增加时其复杂度也增加。 环路复杂度与程序中覆盖的路径条数有关。  环路复杂度是可加的。 例如,模块 A的复杂度为 3,模块 B 的复杂度为 4,则模块 A与模块 B 的复杂度是 7。  McCabe 建议,对于复杂度超过 10 的程序,应分成几个小程序,以减少程序中的错误。 Walsh 用实例证实了这个建议的正确性。 他发现,在 McCabe 复杂度为 10 的附近,存在出错率的间断跃变。  McCabe 环路复杂度隐含的前提是:错误与程序的判定加上例行子程序的 调用数目成正比。 而加工复杂性、数据结构、录入与打乱输入卡片的错误可以忽略不计。 (3) Halstead 的软件科学 Halstead 软件科学研究确定计算机软件开发中的一些定量规律,它采用以下一组基本的度量值,这些度量值通常在程序产生之后得出,或者在设计完成之后估算出。 ① 程序长度,即预测的 Halstead 长度 令 n1 表示程序中不同运算符(包括保留字)的个数,令 n2 表示程序中不同运算对象的个数,令 H 表示“程序长度”,则有 H = n1  log2 n1 + n2  log2 n2 这里, H 是程序长度的 预测值,它不等于程序中语句个数。 在定义中,运算符包括: 算术运算符 赋值符( = 或 := ) 数组操作符 逻辑运算符 分界符(,或 ;或 : ) 子程序调用符 关系运算符 括号运算符 循环操作符等。 图 程序图的例 子 C 输入 D E H 输入 K 输出 L 结束 A 开始 B F G J 12 特别地,成对的运算符,例如“ BEGIN„ END”、“ FOR„ TO”、“ REPEAT „ UNTIL”、“ WHILE„ DO”、“ IF„ THEN„ ELSE”、“(„)”等都当做单一运算符。 运算对象包括变量名和常数。 ② 实际的 Halstead 长度 设 N1 为程序中实际出现的运算符总个数, N2 为程序中 实际出现的运算对象总个数, N为实际的 Halstead 长度,则有 N = N1 + N2 ③ 程序的词汇表 Halstead 定义程序的词汇表为不同的运算符种类数和不同的运算对象种类数的总和。 若令 n 为程序的词汇表,则有 n = n1 + n2 图 是用 FORTRAN 语言写出的交换排序的例子。 SUBROUTINE SORT( X, N) DIMENSION X( N) IF( N .LT. 2) RETURN DO 20 I = 2, N DO 10 J = 1, I IF ( X( I) .GE. X( J)) GO TO 10 SAVE = X( I) X( I) = X( J) X( J) = SAVE 10 CONTINUE 20 CONTINUE RETURN END 图 一个交换排序程序的例子 因此有: 预测的词汇量 H = n1  log2 n1 + n2  log2 n2 = 10  log2 10 + 7  log2 7 = 实际的词汇量 N = N1 + N2 = 28 + 22 = 50 程序的词汇表 n = n1 + n2 = 10 + 7 = 17 ④ 程序量 V,可用下式算得 V = ( N1 + N2 )  log2 ( n1 + n2 ) 它表明了程序在“词汇上的复杂性”。 其最小值为 V* = ( 2 + n2*)  log2 ( 2 + n2* ) 这里, 2 表明程序中至少有两个运算符:赋值符“ :=”和函数调用符“ f ( )”, n2* 表示输入/输出变量个数。 对于图 的例子,利用 n1, N1, n2, N2,可以计算得 V = ( 28 + 22 )  log2 ( 10 + 7 ) = 204 等效的汇编语言程序的 V= 328。 这说明汇编语言比 FORTRAN 语言需要更多的信息量(以bit 表示)。 ⑤ 程序量比率(语言的抽象级别) L = V*∕ V 或 L = ( 2∕ n1 )  ( n2∕ N2 ) 这里, N2 = n2  log2 n2。 它表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。 其倒数 D = 1∕ L 运算符 计数 运算对象 计数 可执行语句结束 7 X 6 数组下标 6 I 5 = 5 J 4 IF( ) 2 N 2 DO 2 2 2 , 2 SAVE 2 程序结束 1 1 1 .LT. 1 n2= 7 N2= 22 .GE. 1 GO TO 10 1 n1= 10 N1= 28 13 表明了实现算法的困难程度。 有时,用 L 表达语言的抽象级别,即用 L 衡量在表达程序过程时的抽象程度。 对于高级语言,它接近于 1,对于低级语言,它在 0~ 1 之间。 下面列出的是根据经验得出的一些常用语言的语言抽象级别。 语 言 L 的平均值 English Prose(英语散文) PL/1 ALGOL68。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。