250 likes | 481 Views
现代软件工程. 计算机信息工程学院 2004 年 9 月. 授课教师:李德生 答疑时间:周三下午 答疑地点:计算机应用教研室 E_mail: Lids_cs@126.com. 第六章 编码. 6.1 程序设计语言. 6.2 程序设计风格. 6.3 编码工具. 退出. 6.1 程序设计语言. 6.1.1 程序设计语言的分类. 6.1.2 程序设计语言的特点. 6.1.3 程序设计语言的选择. 退出. 6.1.1 程序设计语言的分类. 大体上,程序设计语言分为以下几类: ( 1 )机器语言
E N D
现代软件工程 计算机信息工程学院 2004年9月
授课教师:李德生 答疑时间:周三下午 答疑地点:计算机应用教研室 E_mail: Lids_cs@126.com
第六章 编码 6.1 程序设计语言 6.2 程序设计风格 6.3 编码工具 退出
6.1 程序设计语言 6.1.1 程序设计语言的分类 6.1.2 程序设计语言的特点 6.1.3 程序设计语言的选择 退出
6.1.1 程序设计语言的分类 大体上,程序设计语言分为以下几类: (1)机器语言 (2)汇编语言 (3)高级语言 由于高级语言种类繁多,我们可以从应用特点、语言内在特点和对客观系统的描述三个不同的角度来对高级语言进行分类。
1、从应用特点的角度来分 (1)基础语言(例:FORTRAN,BASIC,COBOL和ALGOL) (2)结构化语言(例:ALGOL,PL/1,PASCAL,C,Ada) (3)专用语言(例:APL,LISP,PROLOG,BLISS,FORTH)
2、从语言内在特点的角度来分 (1)系统实现语言(例:C语言) (2)静态高级语言(例:FORTRAN、COBOL) (3)块结构高级语言(例:PASCAL,ALGOL) (4)动态高级语言
3、从描述客观系统的角度来分 (1)面向过程语言 数据结构+算法 (2)面向对象语言 对象+消息 例:Delphi、Visual Basic、JAVA、C++。
6.1.2程序设计语言的特点 1.名字说明 2.类型说明 3.选择控制结构 4.循环控制结构 5.程序对象的局部性 6.变量的局部共享 7.异常处理 8.独立编译
6.1.3程序设计语言的选择 一般情况下,我们采用高级语言来编程。 选择具体高级语言类型的原则: (1)系统的应用领域 (2)用户的要求 (3)软件的执行环境 (4)目标系统的性能要求 (5)程序员的知识水平 (6)软件的可移植性要求
6. 2 程序设计风格 6.2.1 程序内部的文档 6.2.2 数据说明 6.2.3 语句构造 6.2.4 输入/输出 6.2.5 效率 退出
6.2.1 程序内部的文档 程序内部的文档包括: 恰当的标识符(变量和标号)的名字; 适当的注释; 程序的视觉组织。
1、标识符的命名 标识符包括模块名、变量名、常量名、标号名、子程序名以及数据区名、缓冲区名等。这些名字的选取应含义鲜明,能正确地提示程序对象所代表的实体。这对于帮助阅读者理解程序是很重要的。例如,表示次数用times,表示总量用total等。名字的长度不应限制,但也不宜过长,太长了容易出错,应选择精炼且意义明确的名字,这样才能简化程序语句,改善对程序功能的理解。如果名字使用缩写,那么缩写规则应该一致,并且应该给每个名字加上注解,以方便阅读。
2、程序的注释 程序的注释分为两种:序言性注释和功能性注释。 序言性注释通常安排在每个程序模块的起始部分,它是对程序的整体说明,对于理解程序本身具有引导作用。其格式如下: 有关本模块功能说明; 主要算法; 接口描述:包括调用形式,参数描述以及子模块清单; 有关数据描述:包括重要的变量及其用途、约束或限制条件,以及其它有关信息; 模块位置:在哪一个源文件中,或隶属于哪一个软件包; 开发简历:包括模块设计者姓名,复审人姓名,复审日期,修改日期及有关说明等。
功能性注释嵌入在源程序体内,用以描述其后的语句或程序段的处理功能。书写功能性注释,要注意以下几点:功能性注释嵌入在源程序体内,用以描述其后的语句或程序段的处理功能。书写功能性注释,要注意以下几点: 描述的对象是一段程序,而不是每一个语句; 适当使用缩进和空行,使程序与注释容易区别; 注释一定要准确。不精确的甚至是错误的注释不仅对理解程序毫无帮助,反而会妨碍对程序的理解。
3、程序的视觉组织 程序中代码的布局对于程序的可读性也有很大影响。适当的利用空格、空行和移行能使程序的逻辑结构更加清晰。空格的合理应用还可以突出运算的优先性,避免发生运算的错误。
6.2.2 数据说明 为了使数据更容易理解和维护,应遵循一些简单的原则: (1)数据说明的次序应当规范化。 (2)当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。 (3)如果设计时使用了一个复杂的数据结构,则应注解说明用程序设计语言实现这个数据结构的方法和特点。
6.2.3 语句构造 语句构造应遵循的原则是:每条语句应该简单而直接,不应为了片面追求效率而使代码变得过于复杂。 人们在长期的实践中总结了以下一些规则: 不要为了节省空间而把多个语句写在同一行; 用空格或可读的符号使语句的内容更加清晰; 尽量避免复杂的条件测试; 尽量避免使用“非”条件的条件语句; 避免过多使用循环嵌套和条件嵌套; 利用括号使逻辑表达式或算术表达式的运算次序清晰直观; 尽可能使用库函数; 让编译程序作简单的优化。
6.2.4 输入/输出 在设计和程序编码时,应考虑输入和输出风格原则: 对所有输入数据都进行校验,以保证每个数据的有效性; 检查重要的输入项组合的合法性; 使得输入的步骤和操作尽可能简单,并保持简单的输入格式; 输入一批数据时,使用输入结束指示符,不要要求用户说明输入项数; 在以交互式输入/输出方式进行输入时,要指明可以使用的选择值或界限值; 应允许缺省值; 当程序设计语言对输入/输出格式有严格要求时,应保持输入格式与输入语句的要求一致; 给所有的输出加注释,并设计输出报表格式。
6.2.5 效率 通常,效率主要指占用处理机时间和主存区域两个方面。好的编码可以提高效率,在我们进一步讨论这个问题之前,应该记住三条原则: 第一、效率是一个性能要求,因而应该在需求分析阶段确定代码效率方面的要求; 第二、通过好的设计可以提高效率; 第三、程序的效率和程序的简明程度是一致的,不应该为了提高代码效率而牺牲程序的清晰性和可读性。
1、代码效率 在把详细设计结果用代码来实现时要注意一些原则: 在编码之前,先化简算术表达式和逻辑表达式; 特别注意嵌套的循环,以确定是否有语句可以从循环内层移到循环外层; 尽量避免使用多维数组和复杂的表格; 尽量使用执行时间短的算术运算; 尽量避免混合使用不同数据类型的量; 尽量使用整型算术表达式和逻辑表达式。 有些编译程序具有自动优化的功能,在强调效率的应用领域,尽量使用有这样的编译程序,以自动生成高效的目标代码。
2、存储效率 主存储器的容量曾经很大程度上制约了程序的效率。目前,在大型计算机中,由于操作系统页式调度的特点,一般来说,代码局部性和通过结构化构造来维护功能是提高效率的有效方法。 在微处理机中,如果能利用的存储容量很小,就要考虑高级语言的编译程序在存储压缩方面的功能,有时则必须选择使用汇编语言。
3、输入/输出的效率 从编码的角度来看,人们总结了一些简单的指导原则来提高输入/输出的效率: 所有的输入/输出都应该有缓冲,以降低用于通信的开销; 对辅助存储器(如磁盘)的访问,应选用最简单最直接的方式; 涉及到辅助存储器的输入/输出时,应该以块为单位进行传送; 这些指导原则适用于软件工程的设计和编码两个阶段。
6.3 编码工具 为了提高编码的效率,保证程序的可靠性,我们经常使用一些编码工具。 首先要用的当然是编辑工具了。选用合适的编辑工具可以大大方便编程,提高效率。 编译程序的好坏也会影响编码的效率。一方面,好的编译程序应该是程序员的好助手,能够帮助程序员及时准确地诊断出程序中的差错,减少程序开发的成本。另一方面,编译程序还应该能够生成高效率的机器代码,也就是代码优化。
现在的软件系统往往是集体开发,一个大的软件系统往往包含许多模块,这些不同的模块可能分散在几个不同的文件或库里。为了得到最终的可执行代码,必须先将各个模块进行分别编译,然后再进行连接。由于模块的数量很多,而且这些模块往往都是相互影响和制约的,如果某个模块的源代码改变了,那么受此模块影响的所有其它模块都必须进行再编译、再连接。我们可以借助一些工具来完成这项工作。如UNIX的MAKE工具。现在的软件系统往往是集体开发,一个大的软件系统往往包含许多模块,这些不同的模块可能分散在几个不同的文件或库里。为了得到最终的可执行代码,必须先将各个模块进行分别编译,然后再进行连接。由于模块的数量很多,而且这些模块往往都是相互影响和制约的,如果某个模块的源代码改变了,那么受此模块影响的所有其它模块都必须进行再编译、再连接。我们可以借助一些工具来完成这项工作。如UNIX的MAKE工具。 利用MAKE程序能保持模块间的协调关系。程序员将程序不同模块之间的依赖关系以及更新模块时必须进行的操作告诉MAKE程序,这样,MAKE程序就能够自动检索出那些“过时”了的,需要进行再编译的模块,并对所发现的过时模块执行说明信息中规定的更新操作,从而使目标文件永远保持最新的版本。