版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编码设计(主讲赵元哲)西安电子科技大学研究生院课程程序设计语言的选择程序设计途径与编写程序的风格保护性编程冗余编程1程序设计语言的选择
翻译过程在编程步骤中,要把详细设计的表达式翻译成编程语言的构造,编译器接受作为输入的源代码,源代码生成作为输出并从属于机器的目标代码(obj),然后编译器把输出目标代码进一步翻译成机器代码(它是真正指令),由CPU执行。
程序设计的语言分类:基础语言(BASIC,FORTRAN,COBOL,ALGOL)
结构语言(PL/1,PASCAL,C.ADA)
专用语言(FORTH,PROLOG,LISP)
系统实现语言(C)语言分类静态高级语言(COBOL,FORTRAN)
动态高级语言块结构高级语言(ALGOL,PASCAL)
可视化编程语言(VB,VC,PB,BC,C++BUILDER)
程序设计语言特点与特性
编程语言的特点命令式语言(c)、面向对象式语言(c++)、函数式语言(lisp)、逻辑型语言(prolog)心理学观点在编程中,人的因素极其重要,所以,语言的心理学特性对代码的翻译和实现的设计都有重要影响。
1)一致性一致性是表示某种语言使用一致的符号、采用看似任意的限制以及支持语法或语义例外规则的程度。例如,FORTRAN用圆括号作数组下标的界限符,算术运算有限次序的修改符等,容易引起难以觉察的错误。
2)
多义性编程语言的多义性是程序员的理解。一般一条语句一个解释。有时却有多种解释。
3)
紧凑性
紧凑性是一种面向代码信息量的表示.度量紧凑性的语言属性有:
(1)该语言支持结构化构造和逻辑“块”的程度
(2)
所用的关键字和缩写词的种类
(3)
数据类型和缺省特性的品种
(4)
算术运算和逻辑运算的数量
4)
局域性编程语言的综合特性,当语句可以组合为程序块,结构化构造可以直接实现,设计代码和合成代码具有高的模块性和聚合时,局域性就高.
5)
线性:一种心理特性.它与保持功能域的概念紧密联系。即当遇到一个逻辑运算线性序列时,人容易理解;外延分支和外延大的循环都违反处理的线性,而结构化构造的直接实现有助于编程语言的线性。工程观点以具体的软件开发项目的需要为基础,注意源代码的工程特性:
(1)易于把设计翻译为代码;
(2)编译器效率;
(3)源代码可移植性:源代码不修改或很小修改,直接搬到另一编译器,环境变了,源码不变;
(4)开发工具的可用性:许多编程语言有调试工具,
内部编辑,源码控制,浏览器,宏处理器,反向工程工具和其他工具;
(5)可维护性:源码必须可读,并能根据设计的变化进行修改等。技术观点数据结构的复杂性问题数据实时处理能力数据库操作问题
选择一种语言
因为一种语言不可能同时满足各种需求,应该对各种需求(项目应用领域、软件开发方法、执行环境等)进行权衡,比较各种可用语言的适用程度,选择最适用的。
用于评价语言的准则:(1)一般的应用领域,(2)算法和计算的复杂性
(3)软件运行环境
(4)性能考虑
(5)数据结构的复杂性
(6)软件开发人员的知识
(7)好的编译器或交叉编译器的可使用性.
2程序设计途径与编写程序的风格
l程序设计方法论
方法论:
自上而下:程序可读性好,可靠性高。
自下而上:局部优化:系统整体性差,但能及时发现算法是否可行,返工性好。二种方法各有优缺点:在软件预研和攻关,技术积累时采用自下而上,在紧迫工程时,采用自上而下.
l程序设计自动化
三种途径实现程序设计自动化l程序设计工具
1.编译程序它是最基本的程序设计工具,它可以诊断出程序中的错误,减少开发成本,生成高效率的机器代码
2.代码管理系统l编码风格编码风格实际上是一种编码原则,编码对象是有两个:
机器:编码要为机器所理解与执行
人:能读懂,方便使用与维护编码风格最重要的有两条:简单和清晰。与编码风格有关的因素:
代码的文档化、数据说明方法、语句构造处理、I/O技术。L代码文档化
代码文档化是从选择标识符(变量、标号)的名字开始,接着是写程序和安排注释,最后是程序的整个视觉组织形式。所有的编程语言都允许用自然语言在程序中进行注释,问题在于:
(1)多少注释才算够?
(2)
注释应该放在什么位置?
(3)
注释是否会使逻辑流不清楚?
(4)
注释是否会使读者误解?
(5)
注释是否会使程序不可维护?很难回答,但必须清楚:软件必须包含代码的内部说明,开发者可以用注释的方法对代码内部进行说明。L注释(注释范例):
①序言性注释:应该安排在模块的起始部分,内容有:
(1)说明每个模块的用途,指明它的功能
(2)接口描述,包括:调用序列,每个参数的描述,以及所有从属模块清单。
(3)讨论有关数据,包括:重要的变量和它们的用途、限制或约束条件,以及其他必要的信息。
(4)开发历史,包括:模块设计人姓名,评审人姓名及日期、修改说明及日期。②功能性注释:
应嵌入在源代码体内,描述处理功能。注释基本原则是:注释要解释程序代码,提供附加说明。此外,还应做到:
(1)
注释是说明代码块,而不是注释每一行代码。(2)
使用空行或缩格,以易于区分注释和代码。
(3)
注释一定要正确,以免引起错误,造成误解。序言性注释:功能性注释:当使用PDL表示进行详细设计时,设计文档可以作为注释直接嵌入在源代码体内,十分有效,当修改设计或代码时,确保设计和代码都能维护。(1)数据说明的次序应规范化,可使数据属性更容易寻找,有利于测试、纠错和维护。
(2)当多个变量名在一条语句说明时,变量名的次序应按字母顺序排列。
(3)如果设计中,确定了一个复杂的数据结构,就应该用注释说明在编程语言实现时的特点。l语句构造
软件逻辑构造是在设计时确定的,每个语句构造则是编码步骤中的一部分。语句构造应当遵守的原则是:
每条语句应当简单而直接,不应为了追求运行效率而使代码变得复杂化,让人难以理解。为了提高代码的可读性,最好一行只写一条语句(因为许多编程语言允许一行写多条语句)。还应采用缩排的方式,这样可以使程序段的逻辑结构和功能特征更加清晰。单条源代码(语句)的简化方法如下:(1)避免使用复杂的条件测试。(2)排除测试条件的“非”。(3)避免多重循环嵌套或条件嵌套。(4)用括号的方法使逻辑表达式或算术表达式更加清晰。(5)用空格或可读的符号使语句内容更加清晰。(6)只使用国家标准。(7)要想着,如果代码不是我编写的,我也能读懂它。
总之,一句话:要力求直接了当,简单明了。
l
I/O
I/O的风格不是在编码时确定的,是在软件需求分析和设计中确定的。但编码时,I/O的实现方式决定了用户对系统特征的可接受程度。不管软件的性质是批处理,还是交互的,在设计和编码时,都应考虑下述有关I/O风格原则:(1)检查所有输入数据的有效性。(2)检查输入项上的重要组合的合法性。(3)
保持简单的输入格式。(4)使用数据结束说明符,不应要求用户规定输入项目的数量。(5)用标记标明交互的输入请求,应规定可以使用的选择值或边界值。(6)当编程语言对格式有严格的要求时,应保持输入格式的一致性。(7)给所有输出加标记,并设计所有输出报告。l
效率
有三条准则应该指出的:(1)效率是一种性能要求。因此,应当在软件需求时规定。软件效率应按实际需要来要求,而不是越高越好。(2)
一个良好的设计可以提高效率。(3)
代码效率与代码的简单性紧密联系。
追求效率建立在不损害程序可靠性和可读性基础上!提高效率的根本途径:设计方法、数据组织、算法,而非简单的语句调整!l
代码效率
源代码的效率与详细设计阶段所确定的算法效率直接相关。但编码风格也会影响运行速度和对内存的需要。一般可以使用以下准则:(1)在进行编码以前,应简化算术表达式和逻辑表达式。(2)要细心的评价嵌套循环,以确定能否把一些语句或表达式移到循环外边。(3)
应尽量避免使用多维数组。(4)
应尽量避免使用指针和复杂的列表。(5)
采用快的算术运算。(6)
即使语言允许,也不要采用混合数据类型。(7)只要可能,应当采用整型算术表达式和布尔表达式。l
内存效率
内存限制大多已是过去的事了。低成本内存提供了大的物理地址空间,虚存管理为应用软件提供了巨大的逻辑地址空间,对于这样的环境,内存效率不等于使用最小内存。
内存效率必须注意考虑操作系统的分页特征,代码局域性或通过结构化构造功能域的管理是减少分页和提高效率的最好办法。尽管低成本、高密度内存芯片发展很快,但在嵌入式微处理器领域中,内存限制仍是一个非常实际非常重要的问题。如果系统需求(如高容量低成本产品)要求最小内存,必须非常细心的对高级语言的编译程序进行估算,或作为最后的手段,也可以采用汇编语言。l
I/O效率当讨论I/O效率时,有两类I/O要考虑。(1)
由人支配的I/O。
(2)
取决于其他设备的(如磁盘或另一台计算机)的I/O。提高I/O效率的简单原则:(1)
I/O要求的数量应当减至最小。(2)所有I/O应当缓存,以减少过多的通信次数。(3)对于辅存(如磁盘),应当选择和使用最简单的可接受的存取方法。(4)辅存设备的I/O,应当是块状的。终端和打印机的
I/O,应当考虑设备的特性,以提高质量和速度。(5)要记住,如果超高效的I/O不能被人们所理解,那么这样的I/O是没有价值的。Defensiveprogrammingisaformofdefensivedesignintendedtoensurethecontinuingfunctionofapieceofsoftwareinspiteofunforeseeableusageofsaidsoftware.TheideacanbeviewedasreducingoreliminatingtheprospectofMurphy'sLawhavingeffect.Defensiveprogrammingtechniquesareusedespeciallywhenapieceofsoftwarecouldbemisusedmischievouslyorinadvertentlytocatastrophiceffect.Defensiveprogrammingisanapproachtoimprovesoftwareandsourcecode,intermsof:
Generalquality-Reducingthenumberofsoftwarebugsandproblems.
Makingthesourcecodecomprehensible-thesourcecodeshouldbereadableandunderstandablesoitisapprovedinacodeaudit.
Makingthesoftwarebehaveinapredictablemannerdespiteunexpectedinputsoruseractions.西方的“墨菲定律”(Murphy'sLaw)。“墨菲定律”是这样说的:Anythingthatcangowrongwillgowrong.:“凡事只要有可能出错,那就一定会出错。”3保护性编程(defensiveprogramming)最常见的defensiveprogramming方法是加assertion(就是一种强制检查),比如:
在访问一个内存地址之前,先检查指向那里的指针是否有效。在win32平台上可以加入<assert.h>,然后就可以用assert(bool)这个函数。如果检查出这里有错,程序就会被中断在这行语句处,同时在终端打印出文件名、行号、和assert的内容.对于认为编写程序可以做到完全没有错误的人来说,在软件中建立检查的意义不大。相反,对于相信软件中总会有遗留错误的人来说,进行软件内部的错误检查则是一项重要策略,这种策略就是保护性编程。保护性编程技术可分为主动和被动两种:
主动保护技术周期性的或在空闲时间对整个程序或数据库进行搜索,用以发现异常情况。
被动保护技术是在到达检查代码时,对程序的某些部分进行检查。反对保护性编程人员提出了许多逃避保护性编程的理由:(1)“我们的程序中即使有错误,也是很少的,所以不需要保护性编程。”(2)“要求采用他人的程序来检查和发现我的程序错误,这是不公正的。”(3)“错误检查降低了计算机系统的速度,而且还要求额外的内存。”(4)“错误检查要占用很多编程时间。”(5)“可以在我的程序中加入错误检查,不过一旦程序通过测试,就应把它撤去。”
对这些反对意见的回答,都直接或间接的与程序中预料的错误数及其潜在后果有关。
如果相信错误无所不在,即有相当数量的错误在晚期发现是不可避免的,就必须采用保护性编程。
如果这种保护在测试阶段对我们有帮助,则肯定要在程序操作使用时继续将其包括在内。
如果承认错误会出现这一事实,则比起因出现错误所带来的责难来说,增加一些工作量是有意义的。
另一方面,基于运行时间、存储空间和编程费用等方面的反对意见:仅当保护性编程要求设计增加的资源量相当大时需慎重考虑。事实上,只有在极少数情况下,保护性编程所要求增加的资源量才会相当大,以致不得不放弃考虑这种技术。
Yourdon曾提出过一个建设性意见:
在设计过程的早期就把保护性编程包括进去。在设计过程中,大多数设计在填充可用存储空间时,其规模都增加的很快,如果企图在设计过程的结尾再引入保护性编程,则肯定已没有剩余空间。而且在近乎完成的设计中,移动任何部分挤出空间的任何做法,都会招致强烈的反对。但如果在一开始就把保护性编程包括进来,在希望增加新的保护性特征时,就能容易的避开设计中的讨价还价。
另一个要考虑的重要事项是检查哪些项目?尽管可以不受冗余编程概念的约束并检查不合理的情况,如果企图检查所有项目,实质上是实现冗余编程。关于这个问题,Shooman建议设计人员先准备以下列表,以利于做出正确的判断。
(1)可能需要检查的项目表,应附有对编程时间、运行时间及存储要求的开销估计。
(2)各种类型错误出现的期望数据表,应标出每种类型错误可能造成的后果。研究这些信息有助于设计者确定应进行的检查。保护性编程中的典型检查项目(1)来自外部设备的输入数据(范围、属性)。(2)由其他程序提供的数据。(3)数据库(数组、文件、结构、记录)。(4)操作员的输入(性质、顺序)。(5)栈的深度。(6)DOCASEI中的I范围(并计算GOTO)。
(7)数组界限。(8)表达式中出现零分母的可能性。(9)所期望的程序版本是否在运行(最后系统重新组合的日期)。(10)通过其他程序或外部设备的输出。
以上讨论的所有保护技术都是被动式保护技术,因为必须等到某个输入之后才能开始检查。而主动式保护技术则既可在处理输入信息期间使用,也可在系统空闲或等待下一次输入时使用。
几种应用主动式保护技术的例子。
(1)存储器范围检查如果只在存储器的某些块中存放了某种类型和范围的数据,则可经常检查这些条件。
(2)标志验证如果采用标志来指示系统的状态,则可经常对它们作独立的检查。
(3)逆翻译有时必须将数据或变量值从一种代码或系统翻译为另一种代码或系统,可以利用反变换来检查原始值的翻译是否正确。(4)状态验证在多数情况下,复杂系统由多个操作状态,它们可以采用某些特定的存储值来表示。如果能够独立的验证这些状态,就可以进行检查。
(5)连接检查使用链表结构时,可以对其连接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 林木育种的遗传进化评价与选择考核试卷
- 新教材高中政治10.1树立创新意识是唯物辩证法的要求作业1含解析新人教版必修4
- 2022-2023年全国医师定期考核题库附答案
- 重庆人文科技学院《外国刑法学》2022-2023学年期末试卷
- 重庆人文科技学院《烘焙实务》2021-2022学年第一学期期末试卷
- 重庆人文科技学院《复变函数》2022-2023学年第一学期期末试卷
- 重庆人文科技学院《大众健身操》2022-2023学年第一学期期末试卷
- 安全质量管理员岗位职责
- 重庆三峡学院《高级笔译》2023-2024学年第一学期期末试卷
- 重庆三峡学院《电气新技术综述与研讨》2023-2024学年期末试卷
- 小学心理健康教育人教六年级下册目录生命只有一次教学设计
- 小学劳动课教案三年级上册5篇
- 2021版特种设备目录
- 五年级上册美术课件-第4课 未来的交通工具丨赣美版
- 最新爆破安全规程
- 主题班会课防盗
- 支委会委员选举计票单
- 近三年无重大违法违规情况的说明
- 幼儿园整合式主题活动设计案例《温馨家园》
- 荒漠区生态治理(麦草沙障、植物固沙)施工方案
- 大学生职业生涯规划大赛参赛作品ppt课件
评论
0/150
提交评论