第6章语言、程序和软件 本课件制作修改自陆汉权主编《计算机科学基础(第2版)》电子教案(PPT版本): 教材《计算机科学基础(第2版)》,陆汉权 主编,电子工业出版社,2015年8月,ISBN 978-7-121-26609-6
内容 程序和指令 程序设计语言 翻译系统:程序的程序 高级语言的概念 怎样编写程序 软件工程简介
6.1 概述 程序和软件是两个不同的概念,程序是算法的实现;软件是“程 序加上该程序的文档”。 软件开发是一个过程,软件设计的任务之一就是选择计算机“语 言”,使用这个语言编写完成任务的“代码”。最终得到的代码 就是程序。 可视化程序设计成为今天程序设计的主流 。
6.2 程序和指令 算法:解决问题的步骤。 程序:计算机进行某种任务操作的一系列步骤的总和。 程序:按步骤执行 6.2 程序和指令 算法:解决问题的步骤。 程序:计算机进行某种任务操作的一系列步骤的总和。 程序:算法+语言,算法的实现。 程序:按步骤执行 如一个加法程序的步骤为: 输入被加数和加数 进行加法运算 将加法运算得到的结果即和数输出 程序是一组计算机指令的有序集合。
6.2.2 指令和指令系统 指令(Instruction)和指令系统(Instruction Set) 指令就是计算机执行的最基本的操作。如处理器从内存中读取一个 数据,进行算术运算,或者是逻辑判断等,都属于一条指令的操作 。 指令系统是所有指令的集合。 从计算机硬件和软件的关系来看,指令及指令系统是计算机硬件和 软件的接口。 指令和指令系统构成计算机处理器的重要部分,又是整个程序的基 础。 从CPU角度看,指令是计算机处理器执行的二进制代码。
指令作为计算机软件和硬件的接口 软件 硬件 指令
指令的3种主要类型 数据传输类指令——将数据从一个地方(源)传输到另外一个地 方(目的) 算术/逻辑运算类指令 一般把“取出”操作叫做“读”(Read),把“存入”操作叫做“写”( Write) 算术/逻辑运算类指令 包括基本的算术运算和逻辑、比较运算等。 控制操作类指令——改变CPU执行指令的顺序 分为有条件转移和无条件转移;
6.3 程序设计语言 计算机程序设计语言的级别就是根据它们和机器的密切程 度划分的:越接近机器的语言级别越低,越远离机器的语 言越“高级”。 6.3 程序设计语言 计算机程序设计语言的级别就是根据它们和机器的密切程 度划分的:越接近机器的语言级别越低,越远离机器的语 言越“高级”。 面向机器硬件的机器语言 二进制语言,用二进制机器指令来编写程序 汇编语言 机器语言的符号化,一般用英文单词或缩写表示机器指令,因此 也是面向机器的。 面向过程的高级语言 接近数学描述求解问题的过程,它和机器没有直接关系。语法与 自然语言接近。 面向对象的高级语言
6.3.1 机器语言和指令 机器语言就是指令:二进制代码,能被计算机直接执行。 一条机器指令需要包含如下信息: 操作类型:有几十种到上百种,如加法、访问存储器、输入输出操作等; 操作数或者操作数的的存储位置:它是操作数的位置信息,如内存单元、 CPU内部寄存器,或指令中的立即数; 操作结果的存储地址:它说明将结果存储到什么地方; 下一条指令的地址信息:它说明到哪里去取下一条指令;
机器指令的一般格式 例:加法指令 一般指令隐含结果存放到第一个操作数的位置,下一条指令是顺序执行。
指令的执行过程
6.3.2 汇编语言 所有指令助记符的集合以及使用规则构成了助记符语言——汇编 语言(Assemble Language) 用容易记忆的文字符号来表示,这种符号叫助记符 所有指令助记符的集合以及使用规则构成了助记符语言——汇编 语言(Assemble Language) 例子(汇编语言的一条加法语句) ADD A,B 意思是将存储地址A和B的内容相加,结果存储在地址A或B的存储单 元(不同的计算机有不同的规定)。
汇编语言语句 与二进制的机器指令相比,汇编语言语句可读性较好 它仍然是一种面向计算机硬件的语言,程序员必须熟悉计算机硬 件结构、指令系统和指令格式等 程序移植性也较差 汇编程序——将用汇编语言编写的源程序(汇编语言程序)翻译 为“机器语言”的程序,它属于“翻译程序”
高级语言 面向过程的高级语言 面向对象的高级语言 是一种与机器指令系统无关、表达形式更接近于被描述问题的语言。 任何一种高级语言都有其语义和语法规定,程序员熟悉了该语言的规则 就可以灵活地设计出解决各种实际问题的程序。 分为两种类型 : 面向过程的高级语言 面向对象的高级语言
面向过程的高级语言 每一个语句都是为完成一个特定的任务而对计算机发出执行的命令,面向过 程就是程序员将解决问题的步骤用语言表述出来,构成程序。 Basic(Beginner ALL-Purpose Symbolic Instruction Code) 在计算机技术发展史上应用得最广泛的语言之一 适于编程初学者编程,简单易学 非计算机专业出身的编程者广泛使用 C语言 C是一种高级语言,被广泛用于专业程序设计 既有高级语言的优点,又有汇编语言的效率,因此也有人把它定位为“中级语言” 它的命令可直接对计算机内存单元中的数据进行操作,适合编写较接近硬件操作又 要求处理速度的程序
Pascal语言 Fortran语言 COBOL语言 Ada语言 Pascal——为纪念计算机先驱Pascal命名的 作为一种教学和应用开发语言被普遍接受 Fortran语言 第一个高级语言:IBM公司在1957年开发的 更适合于科学、数学和应用工程方面的应用,编程人员可用它方便地描述数学问题,解 决数学计算 COBOL语言 COBOL是一种专门的商用的高级程序设计语言 比较适用于存储、检索公司的财务信息,实现票据管理和工资报表等功能 Ada语言 它是为美国国防部开发署(DoD)设计的,由所有承包DoD工程的厂商统一使用的语言。 Ada还具有实时处理和并行处理能力。
面向对象的高级语言(OOPL,Object-Oriented Programming Language ) 封装(Encapsulation) 。 封装是指把对象的属性和操作结合在一起,构成一个独立体。隐蔽内 部信息,对于外界而言,只需知道对象所表现的外部行为,不必了解对象行为 的内部细节 继承(Inheritance) 。 继承是指子类可以拥有父类的属性和行为,提高了软件代码的复用性 ,定义子类时不必重复定义那些已在父类中定义的属性和行为。 多态性(Polymorphism) 。 多态性是指对象可以具有不同的行为。多态性机制不仅为软件的结构 设计提供了灵活性,还减少了信息冗余,提高了软件的可扩展性。
Visual Basic JAVA C++ Delphi Python 简称VB,BASIC引入了面向对象的设计方法 为开发图形界面的应用程序而设计的,比较简单易学 JAVA Sun Microsystem公司开发 具有纯面向对象、平台无关性、多线程、高安全性等特点 解决了困扰软件界多年的软件移植问题 C++ 它在C语言的基础上增加了面向对象程序设计的支持 Delphi Delphi使用Pascal编程语言,它是面向对象的,也是开发GUI程序很好的工具。 类似的语言或叫做开发工具的还有Borland公司的PB(Power Build)等 Python 它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。
其他语言 函数型语言:主要有LISP和Scheme 。 说明型语言:也叫逻辑语言,它被用于根据逻辑推理的原则回答问题。 超文本标记语言 :由一种格式标记和超链接组成的“伪语言”,主要用 于网络的信息服务。 Perl:一种“脚本语言”,程序以ASCII文本保存,只在执行时对程序进 行解释或者编译。 SQL :是一种结构化查询的语言。
基于组件的程序设计 基于组件的程序设计是微软提出的思想 COM(Component Object Model,组件对象模型),又称为中间 件 组件技术属于面向对象的程序设计技术 使用COM技术,一个新的应用系统的开发不必按照传统的方法进行所有 代码的编写,可以通过组件进行“组装”软件 组件与语言无关,以二进制代码形式发布 对于提高开发速度、降低开发成本、增加应用软件的灵活性、降低软件 维护费用很有帮助
6.4 翻译系统:程序的程序 人们通常使用计算机高级语言编写程序----能更好 地描述求 解问题步骤。 人们通常使用计算机高级语言编写程序----能更好 地描述求 解问题步骤。 计算机只能执行机器语言程序,其他语言编写的程序都需要经过 相应的翻译系统“翻译”。 翻译程序(语言处理系统)——翻译计算机程序 任务就是把其他程序翻译为机器语言程序 本身就是程序 是程序的程序 翻译程序归类为系统软件 不同的编程语言的翻译系统是不同的。
程序的翻译系统 翻 译 系 统 源程序 目标程序 用高级语言编写的程序通称为“源程序”,把翻译后的机器语言程序称为“目标程序”。 翻译程序根据功能的不同分为 解释程序(Interpreter,也叫做解释器) 编译程序(Compiled Program或称为编译器Compiler)
解释程序 对源程序代码进行逐句翻译,翻译一句执行一句 翻译过程中并不生成可执行文件 如果需要重新执行该程序,就必须重新翻译 对计算机的硬件和存储器要求不高,程序运行速度较慢 一般不提供任何分析和程序错误更正 JAVA,BASIC使用解释系统
编译程序 编译程序 将整个源程序代码文件一次性翻译成目标程序代码,最终生成 可执行文件。 编译后的程序可被单独执行,和翻译程序无关 类比:翻译一本书 编译系统只能够发现不合法的语句和表达,它并不能发现算法上的 错误 各种高级语言的开发环境中一般都包含了编译系统功能
使用编译系统的程序执行效率较高 。编译系统是一个十分复杂的程序 系统,它是一个信息加工流水线, 被加工的是源程序,最终产品是目 标程序。 大多数语言系统都将源程序的编辑 、翻译、调试、运行等功能集成为 开发环境(IDE)。
6.5 高级语言的概念 常量、变量和数据类型 标识符:以字母开头并以字母、数字和下划线组合而成。标识符可以表 述运算对象的名字。 数据类型 程序设计语言需要给参与运算的各种数据定义其类型,每一种数据类型都有其取值 范围。 一般程序设计语言的基本数据类型有三种:整型、实型和字符型。 其他 ,如Java语言有逻辑型(Boolean),VB语言有货币、日期/时间等类型。 语法规则要求运算对象的数据类型保持一致,如果不一致的话则按规则强制转换。
常量 变量 常量在程序执行过程中,这个量将固定不变。 程序中的常量有两种:文字常量、符号常量。 变量就是可以被改变的量。程序使用标识符代表变量的内存位置,程序员只需要对 这个变量进行赋值、运算即可。 变量在使用之前需要对其先行定义类型。 有些语言规定使用变量之前还必须先给这个变量赋一个初值。
构造数据类型 将基本类型和数据结构联系起来组成的新的、复杂的数据类型,一 般称为构造数据类型,也称为派生数据类型。 数组 结构和指针 使用一个标识符代表一组相同类型的数据,以下标形式区分各个元素。 结构和指针 结构可以表示复杂的数据记录。 指针是一种对变量访问的形式,存放的是数据变量的地址。 字符串、链表、队、树
6.5.2 基本语句 语句是使程序执行的动作,被翻译程序翻译成一条或几条指令。 赋值语句 表达式语句 复合语句 转移语句 返回语句 按规则将一个值存入到变量名所代表的存储单元中。 表达式语句 不同表达式构成的语句。 复合语句 用括号将多行语句定义为一个语句称为复合语句(语句块)。程序将复合语句视做一 个语句进行处理。 转移语句 著名的goto语句。 返回语句 通过调用的方法构造程序时,使用return语句可以将运算结果返回调用程序。 输入、输出语句
6.5.3 分支语句 实现分支结构的语句,根据条件决定程序下一步该执行程序的哪一条语句 或语句块。
6.5.4 循环语句 实现循环结构的语句为循环语句; 大多数高级语言有多种循环语句;
函数和方法 公共代码:函数或方法 通过调用函数或方法来获得其实现的功能 主程序调用子程序(函数),子程序运行结束后通过返回语句回到主 程序。 主程序调用时给出的参数称“实际参数”,而子程序中对应的参数称 为“形式参数”。 “实际参数”与“形式参数”要求类型一致、数 量一致、顺序一致 参数传递:值调用(实参的值传送给形参),引用调用(实参的地址 传送给形参)
6.6 怎样编写程序 程序设计不仅是编写程序代码,也是一个系统过程。通常把这个 过程分为6个步骤: 问题的定义 设计方案 编码 测试 编写文档 运行维护
理解问题 设计一个程序首先要了解问题,对问题进行清晰、明确的定义是解决问 题过程中最重要、也是最容易被忽略的一步。一个组织得好的程序项目 ,花在这个阶段的时间应该占到整个程序开发设计时间的25% ~ 30%, 甚至更多。 这项工作一般可由具有比较丰富程序设计经验的系统分析员来做。在这 个阶段主要弄清以下几个问题: 程序目标是什么?即程序需要解决什么样的问题 可能需要输入哪些数据? 数据具体的处理过程和要求是什么? 程序可能产生的数据输出以及输出形式是什么?
设计方案 在本阶段需要对问题设计出具体的解决方案,要一步一步地设计解决问 题的过程。其关键是设计出一个好的算法,并使用合适的逻辑结构。 要确定选择使用哪种编程技术或者选择哪种语言作为开发工具。 不同的语言适合不同的应用,通用语言能够适合大多数编程任务,而较 为特殊的应用则应选择针对性更强的其他语言。 同时,语言的选择还取决于编程者对语言的熟悉程度,当然也要看它是 否能够完成任务。
编写程序代码 在此阶段,使用所选择的编程语言,按照设计过程中形成的算法编写程 序代码。 在此阶段,要调试已编好的程序,找出程序中的逻辑错误和语法错误。 如果违反编程语言的语法规则,就会发生语法错误; 如果程序得到的输出不对,则可能是由于程序没有正确地实现算法,这是逻辑错误 。
寻找错误:程序测试 对准备交付的程序进行测试。 程序测试和纠正错误交错进行,但程序测试是“测试程序中的错误,而 不是使得程序中没有错误”。 常用的测试方法有: 黑盒测试是把一组测试数据输入程序,检查程序的结果是否是预期的。大多数专业 软件公司提供给用户的Beta(β)版也叫测试版,就是属于黑盒方法。 白盒测试一般是专业测试,输入一组特意设计的数据让程序执行,测试程序是否按 照设计流程要求执行。
编写程序文档 运行与维护 程序文档包括设计过程中形成的文档和设计完成后的使用 说明,文档形式有两种: 一种是在编写程序代码时在代码行后面加注释。 另一种是按照一定规则专门编写。 运行与维护 程序的安装、系统配置 对用户的培训 软件维护
6.7 软件工程 什么是软件开发 开发软件需要进行系统分析,设计,编码,测试。 大型程序无法由一个程序员完成,因此众多开发人员的协调、管理也是 软件开发需要考虑的问题。 开发软件不是一个单纯的计算机问题,这里面需要运用有关的系统分析 原理,需要建立必要的数据模型,需要使用工程管理的方法进行开发管 理。
软件生命周期 软件危机 软件工程:开发传统的大型工程一样去管理软件开发 和工业产品一样,软件也有一个生产、使用和消亡的过程,称为软件的 生命周期。 软件生命周期法从总体上包括分析、设计、实现(开发软件)和维护等 过程, 一般较大型的软件系统都需要经历以上这几个阶段,当新的系统替代原 系统后,原系统的生命周期也就结束了。
软件开发模型,建立开发过程模型是建立对软件开发过程的总体认 识和描述,主要有: 瀑布模型 增量模型 RAD模型
瀑布模型 这是软件开发过程最为流行的一个模型,包括了分析 、设计、实现(编码)、测试和维护5个方面,结构 自上而下,如瀑布流水一般,故得名瀑布模型。 由于它的线形特点,下一个过程必须在上一个过程结 束的基础上,如编写代码前,设计工作必须完成。 它的缺点是缺乏灵活性,无法解决软件需求不明确的 问题。
增量模型 又称为演化模型。 软件在该模型中是“逐渐”开发出来的。开发人员先开发出一部分程序,向用户展示, 用户提出修改意见,不断完善,最终获得满意的软件产品。 该模型具有较大的灵活性,适合于软件需求不明确、设计方案有一定风险的软件项目。 软件开发是一个迭代的过程。
RAD模型 业务建模。业务活动中的信息流被模型化,确定信息来源及流向和使 用者。 强调极快的开发周期。它主要用于大型信息系统的开发,包含了以下5个阶段。 业务建模。业务活动中的信息流被模型化,确定信息来源及流向和使 用者。 数据建模。业务信息流被精确定义为对象和属性以及对象间的关系。 处理建模。创建对这些数据对象的操作,如增加、删除、修改、检索 等。 应用生成。使用面向对象的技术,可使用工具软件进行开发。 测试和反复。强调复用,且测试复用在当前系统中的功用。
开发软件的过程 确定系统需求 系统设计 系统实现 运行维护 确定“做什么” 进行“如何做”的设计。包括确定可能的解决方案、评价方案、选择最佳方案 、确定运行环境(系统软件和硬件)。 系统实现 为开发(程序编码)建立环境,建设系统运行的环境,编制程序,进行基本的 测试。 运行维护 包括硬件维护、数据备份、数据恢复、监控系统信息流量及解决实际操作中的 其他问题。 修改应用程序中的错误,增加新的特性,对系统支撑软件升级的处理等
软件项目管理 项目管理(PM,Project Manager):简单地说就是“对项目进行的管理” 项目管理定义为:把各种知识、技能、手段和技术应用于项目之中以达到完成 项目的要求。 软件项目管理围绕项目计划、组织、质量、费用、控制、进度等任务展开。 项目管理者并不对资源的调配负责,而是通过各个职能部门调配并使用资源。 有效管理------“4P”原则 人员(People )、产品(Product)、过程(Process)、项目(Project)
思考题 什么是程序和程序设计? 指令、指令系统、程序、机器语言、汇编语言这些名词的含义是 什么,它们之间有什么关系? 什么是面向过程的程序设计,什么是面向对象的程序设计? 比较软件开发和程序设计之间的差别和相互关系。 有哪几种主要的软件开发模型? 软件测试的目的是什么,有几种测试方法? 什么是软件工程,什么是软件周期?