第11章程序设计语言与编码编码——以详细设计说明书为输入,将该输入用某种程序设计语言翻译成计算机可以理解并最终可运行的代码的过程。本章介绍程序设计语言的特点、发展和分类、开发时选择程序设计语言的标准、编程质量与程序设计语言的关系、编程标准和编程风格,最后简单介绍目前程序设计的支持环境。11.1程序设计语言11.1.1程序设计语言的特点语言的几种特性。1)一致性(Uniformity)指语言中采用的标记(Token)法协调一致的程度。例如“”在C语言中即可以在声明中表示其后的变量为指针变量,又可作间接访问运算符,还可以作乘法运算符,这种“一词多用”、一致性不好的语言程序不仅可读性差,而且在编写程序的过程中容易出错。11.1.1程序设计语言的特点语言的几种特性。2)二义性(ambiguity)语言的二义性是指语言是否允许使用具有二义性的语句。允许使用二义性语句的语言在可理解性和可修改性上都要差一些。11.1.1程序设计语言的特点语言的几种特性。3)紧致性(compactness)紧致性是指程序员写程序时必须记忆的关于语言的信息总量。决定紧致性的指标包括:①语言对结构化的支持程度。②关键字及操作符的数目,显然关键字和操作符的数目越多,则紧致性越差。③标准函数的个数及复杂程度。通常紧致性和一致性是矛盾的。在选择程序语言时,必须在这两者之间找到平衡点。11.1.1程序设计语言的特点语言的几种特性。4)局部性(locality)局部性是指语言的模块化和信息隐藏特性。一个局部性差的语言必然会导致程序的复杂性增加。比如,一种不具有块机制的语言,那么信息的作用域必然是全局的,程序的走向也是全局的,从而导致程序的复杂性增加,可读性、可修改性和可维护性都会相应降低。程序设计语言其他连带的特性:1)将设计翻译成代码的难易程度设计阶段的输出是编码阶段的输入,因此以设计说明书为输入编写代码时程序语言对设计概念的支持程度就决定了翻译过程的难易。如果在分析阶段和设计阶段采用的是面向对象的方法,而在编码阶段采用的是面向过程的语言,那么这种翻译就比较困难。程序设计语言其他连带的特性:2)编译器所生成代码的效率对于实时或时间关键性的项目来说,除在设计和编码时对效率进行充分的考虑外,高效率的编译器也是必须的。好的编译器会对程序作最佳的性能优化。不同语言生成的目标系统的效率不同,即使是同一种语言,采用不同的编译器,目标系统的效率也会不同。程序设计语言其他连带的特性:3)源代码的可移植性选择一种可移植性强的语言可以为代码的重用和项目的移植奠定好的基础。源代码的可移植性也是选择开发语言要考虑的因素。4)配套的开发工具主流的语言都有良好的集成开发环境(IDE)。其中不仅包括源代码的编辑器、编译和连接器、调试器,同时还包含配置管理工具、安装部署工具以及代码的转换工具。11.1.2程序设计语言的发展和分类第一代:机器语言和汇编语言,也称为低级语言。第二代:第一代和第三代的过渡语言。这代语言是50年代末至60年代初出现的,这些语言应用面广,有大量成熟的程序库。这代语言包括FORTRAN、COBOL、BASIC等。11.1.2程序设计语言的发展和分类第三代语言:高级语言。高级语言通常被分成三类:1)通用高级语言。Algol60,C、Pascal,PL/1,Modula-2和Ada等。2)面向对象的语言,如C++、Java、Smalltalk等。3)专用语言,专用语言只用于特定的领域。LISP和Prolog适用于人工智能领域;APL是为数组和向量运算设计的语言;而Forth则用于开发微处理器软件。专用语言可移植性和可维护性较差。11.1.2程序设计语言的发展和分类第四代语言(4GL)4GL还局限在某些领域内,如数据库查询语言。程序生成器代表了更为通用的一类4GL,程序生成器可以将更为自然的语言描述翻译成第三代语言程序,进而更好地消除设计和代码之间的语义断层。11.1.3程序设计语言的选择标准选择语言时要考虑的因素:1)项目的应用领域2)项目中算法和计算的复杂性3)项目中数据结构的复杂性4)用户的性能需求5)软件运行的环境6)软件开发人员开发水平。7)可用的编译器和交叉编译器。11.2编程质量与程序设计语言程序的可靠性、可维护性和效率通常由程序设计语言、源代码的质量、和语言的实现机制决定的。11.2.1程序设计语言与可靠性程序设计语言的可靠性是指程序设计语言本身不出错或对错误的纠正能力。如:JAVA由于其抛弃了指针和动态存储分配等易于出错的语言特性。从而具有较高的可靠性。11.2.2程序设计语言与可维护性程序设计语言的可维护性通常指这种语言编写的程序被理解,被修改及调整和改进的难易程度。程序设计语言的可维护性一般由下面几个因素决定:①程序设计语言的一致性和紧致性一致性刻画了语言标记的语义单义性,因此一致性好的语言的可维护性要好于一致性差的语言。②程序设计语言的语法规则语法规则的严格程度也影响语言的可维护性和可读性,语法要求严格的语言要比语法自由的语言的可维护性差些。因为修改和理解语法严格的语言要困难些。比如FORTRAN和Perl语言,其语法要求很严格。因此其可维护性与C/C++等语法较自由的语言相比要差些。11.2.3程序设计语言与效率不同程序设计语言在程序的效率上的差异很大。程序设计语言的效率由下面因素决定:①程序设计语言的实现机制;解释性程序(如解释BASIC)和编译成中间语言然后又解释执行的语言(如JAVA)的效率一般要远远低于编译语言。②程序语言对系统底层的访问和控制能力;设计良好的低级语言程序效率最高。③编译器的效率;11.3编程标准编码的依据是详细设计说明书。编码的任务就是按照详细设计说明的要求写出满足要求的代码。设计阶段的成果基本上决定了系统的可修改性和可维护性。在编码阶段,遵循下述原则,将有助于编写清晰、紧凑、高效的程序。从而进一步提高程序的可修改性、可维护性和可测试性。编码原则1)编写易于修改和维护的代码编码阶段,在设计基础上对程序进行进一步的数据和操作的分离有利于代码和数据的单独改变。2)编写易于测试的代码在编码阶段对代码的可测试性进行考虑可以减少测试阶段的工作量。以条件编译和注释的方法融入源代码中,是一种有效的增加代码可测试性的手段。编码原则3)编写详细的程序文档程序文档一般指以注释的形式嵌入程序中的代码描述。程序文档应该与程序保持高度一致。程序文档应该包括下列内容①代码的功能;②代码的完成者;③代码在整个软件系统中的位置;④代码编制、复审时间;⑤保留代码的原因;⑥代码中如何使用数据结构和算法。程序文档的例子/************************************************Modualname:gameserverFunction:gameserverforrealtimegameinformationprocessAuthor:chejinhuiCreatedate:2003/11/12Platform:IA32,WindowsModifylist:2003/11/14line28shouldbe=2003/11/15line29......***********************************************/程序文档的例子/*----------------------------------------------------------includestdio&socketlibarary-----------------------------------------------------------*/#includeiostream.h#includewinsock2.h/*----------------------------------------------------------Globalvararea-----------------------------------------------------------*/intiUserCount;程序文档的例子/*---------------------------------------------------InitializeSocketSubsysteminput:noneoutput:DLLinitializeresult0:faultother:success---------------------------------------------------*/程序文档的例子intInitSockInterface(){WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);//startsocketsubsystemerr=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return0;}程序文档的例子//seeifsocketversionmeetourrequest(mustbe2.2)if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();return0;}}/*---thisistheendofprogramdocumentdemo---*/编码原则4)编程中采用统一的标准和约定,降低程序的复杂性软件组织通常会制定一份“编码规范”,程序员在编写代码时。必须严格按照“编码规范”编写代码。表13-1是软件组织“编码规范”的通用格式和内容。表13-1编码规范规范项规范内容1排版排版格式,如缩进、块语句、分行等2注释规范注释的格式3标识符命名规范标识符的命名规则4可读性为提高可读性所作的规范,如禁止使用技巧性高的语句5变量、结构规范变量和结构的定义,如禁止局部与全局变量同名等6函数、过程规范函数的定义,如“不要设计多用途面面俱到的函数”7可测性为提高可测性的规范,如“用断言确认函数的参数”等8程序效率为程序效率所作的规范,如“循环体内工作量最小化”9质量保证为提高软件质量所作的规范,如“防止内存操作越界”编码原则5)分离功能独立的代码块形成新的模块将功能独立的代码块独立出来形成新的模块,增加模块的内聚度,有利于代码的重用和可修改性。11.4编程风格不同的程序员可能具有不同的编程风格,有时候很难说哪种风格好,哪种风格不好,比如在分支语句之后的语句块,一些程序员可能习惯这样:if(ab){.......}而另外的程序员喜欢这样:if(ab){......}11.4编程风格一般的软件组织允许程序员在不影响代码的可读性、可修改性、可测试性、可维护性的基础上使用自己的风格编写程序。但是有些规则则是所有程序员必须遵守的。好的编程风格应遵循的规则1)节简化(economy)①不使用不必要的变量和函数②避免变量重名,变量重名可导致很难被发现的错误。③尽量减小代码量。④尽量减少代码的执行时间,提高执行效率。⑤避免功能冗余的模块。⑥尽量不使用全局变量。好的编程风格应遵循的规则2)模块化(Modularity)①确保物理和逻辑功能密切相关。②限定一个模块完成一个独立的功能,提高模块的内聚度。③检查代码的重复率,重复多的代码,要抽出来作为一个单独的模块。好的编程风格应遵循的规则3)简单化(Simplicity)①采用直接了当的算法,避免使用技巧性高和难懂的代码。②使用简单的数据结构,避免使用多维数组、指针和复杂的表。③注意对象命名的一致性。④以手工的方式简化算术和逻辑表达式。好的编程风格应遵循的规则4)结构化①按标准化的次序说明数据;②按字母顺序说明对象名③使用读者明了的结构化程序部件;④采用直截了当的算法;⑤根据应用背景排列程序各个部分;好的编程风格应遵循的规则4)结构化(structure)⑥不随意为效率而牺牲程序的清晰度和可读性;⑦让机器多做烦琐