1、教案首页周次 日期 课时序 课 题软件编码教学目的要 求了解相关程序设计语言;了解编码风格;了解程序效率;掌握编码安全概念重 点程序效率、编码安全难 点程序效率、编码安全教学过程设 计及时间分配第六章 软件编码(2*45)第一节 程序设计语言(10)第二节 编码风格(20)第三节 程序效率(30)第四节 编程安全(30)教学场所或教学方法使用教具作 业课 后 记授课教师 第六章 软件编码用户与计算机交流信息必须使用程序设计语言,这就涉及到编码。所谓编码就是把软件设计的结果翻译成计算机可以理解的形式,即用某种程序设计语言书写的程序。作为软件工程的一个步骤,编码是软件设计的结果,因此,程序的质量主
2、要取决于软件设计的质量。但是,程序设计语言的特性和编码途径也会对程序的可靠性、可读性、可测试性和可维护性产生深远的影响。6.1 程序设计语言编码的目的是为了指挥计算机按人的意志正确工作,即使用选定的程序设计语言,把模块过程描述翻译为用程序设计语言书写的源程序。程序设计语言是人和计算机通信的最基本的工具,程序设计语言的特性不可避免地会影响人思维和解决问题的方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度,因此,编码之前的一项重要工作就是选择一种适当的程序设计语言。本节将从软件工程的观点,简单介绍几个和程序设计语言有关的问题以保证编码阶段工作的顺利进行。6.1.1程序
3、设计语言分类 自 1960 年以来人们已经设计和实现了数千种不同的程序设计语言,但是只有其中很少一部分得到了比较广泛的应用。现有的程序设计语言虽然品种繁多,但它们基本上可以分为面向机器语言和高级语言(包括超高级语言 4GL )两大类。 1面向机器语言 面向机器语言包括机器语言和汇编语言。这两种语言的选择依赖于相应的机器结构,其语句和计算机硬件操作相对应。每种汇编语言都是支持该语言的系列计算机所独有的,因此,其指令系统因机器而异,难学难用。从软件工程学观点来看,生产率低,容易出错,维护困难,所以现在的软件开发一般不会使用汇编语言。但它的优点是易于系统接口,编码译成机器语言效率高,因而在某些使用高
4、级语言不能满足用户需要的个别情况下,可以使用汇编语言编码。 2高级语言 高级语言的出现大大提高了软件生产率。高级语言使用的概念和符号与人们通常使用的概念和符号比较接近,它的一个语句往往对应若干条机器指令,一般说来,高级语言的特性不依赖于实现这种语言的计算机,通用性强。对于高级语言还应该进一步分类,以加深对它们的了解。我们可以分别从应用特点和语言内在特点两个不同角度对高级语言进行分类。 从应用特点看,高级语言可以分为基础语言、现代语言和专用语言三类。 (1)基础语言 基础语言是通用语言,它们的特点是出现早、应用广泛,有大量软件库,为最广泛的人所熟悉和接受。属于这类语言的有: BASIC , FO
5、RTRAN , COBOL 和 ALGOL 等。这些语言创始于是乎20世纪50年代或60年代,部分性能已老化,但随着版本的更新与性能的改进,至今仍被使用。 FORTRAN 是使用最早的高级语言,它适合于科学计算。其缺点是数据类型不丰富,对复杂数据结构也缺乏支持。 COBOL 创建于50年代,是商业数据库处理中应用最广的高级语言。它广泛的支持与事物数据处理有关的各种过程技术。其优点是数据部、环境部、过程部分开,程序适应性强,可移植性强且使用近似于自然语言的语句,易于理解。但其缺点是计算功能弱、编译速度慢、程序不够紧凑等。 BASIC是60年代为适应分时系统而设计一种交互式语言,用于一般数值计算与
6、事务处理。优点是简单易学,具有交互功能 ,因此成为许多程序设计初学者的入门语言,对计算机的普及起了巨大作用。 ALGOL语言包括ALGOL60和ALGOL68。是一种描述计算过程的算法语言。它对PASCAL语言的产生有强烈的影响,被认为是结构化语言的前驱。其缺点是缺少标准的输入输出和结构使用的换名参数。 (2)现代语言 现代语言又称结构化语言,也是通用语言。这类语言的特点是直接提供结构化的控制结构,具有很强的过程能力和数据结构能力。 ALGOL是最早的结构化语言(同时又是基础语言),由它派生出来的PL1,PASCAL,C以及Ada等语言正被应用在非常广泛的领域中。 PASCAL是第一个系统的体
7、现结构化程序设计概念的现代高级语言。它的优点主要是模块清晰,控制结构完备,数据结构和数据类型丰富,且表达能力强,可移植性好。因此在科学计算、数据处理及系统软件开发中应用广泛。 C语言最初是作为UNIX操作系统的主要语言开发的,现在已独立于UNIX成为通用的程序设计语言,适用于多种微机与小型计算机系统。它具有结构化语言的公共特征,表达简洁,控制结构、数据结构完备,运行符和数据类型丰富,而且可移植性强,编译质量高。其改进型C+已成为面向对象的程序设计语言。 Ada是迄今为止最完善的面向过程的现代语言。适用于“嵌入式”计算机系统。它支持并发处理与过程间通讯,支持异常处理的中断处理,并且支持通常有汇编
8、语言实现的低级操作。Ada是第一个充分体现软件工程思想的语言,它既是编码语言又可作为设计表达工具。 (3)专用语言 专用语言的特点是,具有为某种特殊应用而设计的独特的语法形式。一般说来,这类语言的应用范围比较狭窄。例如, APL是为数组和向量运算设计的简洁而又功能很强的语言,然而它几乎不提供结构化的控制结构和数据类型;BL1SS是为开发编译程序和操作系统而设计的语言;FORTH是为开发微处理机软件而设计的语言,它的特点是以面向堆栈的方式执行用户定义的函数,因此能提高速度和节省存储;L1SP和PROLOG两种语言特别适合于人工智能领域的应用。 从语言的内在特点看,高级语言可以分为系统实现语言、静
9、态高级语言、块结构高级语言和动态高级语言等四类。 1)系统实现语言是为了克服汇编程序设计的困难而从汇编语言发展起来的。这类语言提供控制语句和变量类型检验等功能,但是同时也容许程序员直接使用机器操作。例如,C语言就是著名的系统实现语言。 2)静态高级语言给程序员提供某些控制语句和变量说明的机制,但是程序员不能直接控制由编译程序生成的机器操作。这类语言的特点是静态地分配存储。这种存储分配方法虽然方便了编译程序的设计和实现,但是对使用这类语言的程序员施加了较多限制。因为这类语言是第一批出现的高级语言,所以使用非常广泛。COBOL和FORTRAN是这类语言中最著名的例子。 3)块结构高级语言的特点是提
10、供有限形式的动态存储分配,这种形式称为块结构。存储管理系统支持程序的运行,每当进入或退出程序块时,存储管理系统分配存储或释放存储。程序块是程序中界限分明的区域,每当进入一个程序块时就中断程序的执行,以便分配存储。ALGOL和PASCAL就属于这类语言。 4)动态高级语言的特点是动态地完成所有存储管理,也就是说,执行个别语句可能引起分配存储或释放存储。一般地说,这类语言的结构和静态的或块结构的高级语言的结构不同,实际上这类语言中任何两种语言的结构彼此间也很少类似。这类语言一般是为特殊应用而设计的,不属于通用语言。 综上所述:从软件工程的观点来看,程序设计语言的分类可由图 6-1简单表示。其中高级
11、语言的分类可由图6-2表示。图 6-1 程序设计语言的分类 图 6-2 高级语言的分类 6.1.2程序设计语言的特点 程序设计语言是人与计算机交流的媒介。软件工程师应该了解程序设计语言各方面的特点,以及这些特点对软件质量的影响,以便在需要为一个特定的开发项目选择语言时,能做出合理的选择。下面从几个不同侧面简单讨论程序设计语言的特点。 (1)名字说明 预先说明程序中使用的对象的名字,使编译程序能检查程序中出现的名字的合法性,从而能帮助程序员发现和改正程序中的错误。某些语言(例如 FORTRAN和BASIC)并不要求用户显式地说明程序中所有对象的名字,第一次使用一个名字被看作是对这个名字的说明。然
12、而在输入源程序时如果拼错了名字,特别是如果错输入的字符和预定要使用的字符非常相像(例如,字母o和数字0,小写字母l和数字1),那么因此而造成的错误是较难诊断的。 (2)类型说明 类型说明和名字说明是紧密相联的,通过类型说明用户定义了对象的类型,从而确定了该对象的使用方式。编译程序能够发现程序中对某个特定类型的对象使用不当的错误,因此有助于减少程序错误。规定必须预先说明对象的类型还有助于减少阅读程序时的歧义性。类型检查的概念最早是在 ALGOL60中引入的,以后又显著地强化了这个概念,像PASCAL这样的程序设计语言,还允许用户定义与他们的特定应用有关的自己的类型,并且可以再用自己定义的类型说明
13、其他程序对象。用户甚至可以定义记录、链表和二叉树等复杂的结构类型。程序设计语言中的类型说明不仅仅是一种安全措施,它还是一种重要的抽象机制。对类型名字的定义使得用户可以引用某些复杂的实体,而不必考虑这些实体的表示方法。 (3)初始化 程序设计中最常见的错误之一是在使用变量之前没对变量初始化,为减少发生错误的可能性,应该使程序员对程序中说明的所有变量初始化。另一个办法是在说明变量时由系统给变量赋一个特殊的、表明它尚未初始化的值,以后如果没给这个变量赋值就企图使用它的值,系统就会发出出错信号。 (4)程序对象的局部性 程序设计的一般原理是,程序对象的名字应该在靠近使用它们的地方引入,并且应该只有程序
14、中真正需要它们的那些部分才能访问它们。通常有两种提供局部变量的途径, FORTRAN等绝大多数系统实现语言提供单层局部性,块结构语言提供多层局部性。如果名字的特性在靠近使用这些名字的地方说明,程序的阅读者就很容易获得有关这些名字的信息,因此多层次的局部性有助于提高程序的可读性,此外,具有多层次局部性的语言鼓励程序员尽量使用局部的对象(变量或常量),这不仅有助于提高可读性,而且有助于减少差错和提高程序的可修改性。但是,在块结构语言中如果内层模块说明的名字和外层模块中说明的名字相同,则在内层模块中这些外层模块的对象变成不可访问的。当模块多层嵌套时,可能会由于疏忽在内层模块中说明了和外层模块中相同的
15、名字,从而引起差错。特别在维护阶段,维护人员往往不是原来写程序的人,更容易出现这种差错。虽然用单层局部性语言写的程序可读性不如多层局部性的,但是却容易实现程序单元的独立编译。 (5)程序模块 块结构语言提供了控制程序对象名字可见性的某些手段,主要是在较内层程序块中说明的名字不能被较外层的程序块访问。此外,由于动态存储备配的缘故,在两次调用一个程序块的间隔中不能保存局部对象的值。因此,即使是只有一两个子程序使用的对象。如果需要在两次调用这些子程序的过程中保存这个对象的值,也必须把这个对象说明成全过程的,也就是程序中所有子程序都可以访问的,然而这将增加维护时发生差错的可能性。从控制名字的可见性这个角度来说,块结构语言提供的机制是不完善的,需要某种附加的机制,以允许用户指定哪些局部名字可以从说明这些名字的程序块外面访问,还应该能够要求某个局部变量在两次调用包含它的程序块的过程中保存它的值。 (6)循环控制结构 最常见的循环控制结构有 FOR语句(循环给定次数),WHILE_DO语句(每次进入循环体之前测试循环结束条件)和REPEAT_ UNTIL语句(每执行完一次循环体测试循环结束条件)。但是,实际上有许多场合需要在循环体内任意一点测试循环结束条
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1