计算与软件工程_第1页
计算与软件工程_第2页
计算与软件工程_第3页
计算与软件工程_第4页
计算与软件工程_第5页
已阅读5页,还剩18页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 计算环境计算机(Computer),是一种利用电子学原理根据一系列指令来对数据进行处理的机器。本章介绍计算机的基本工作原理,以及其与程序开发密切相关的基础知识。1.1计算机与程序设计Software)是一系列按照特定顺序组织的电脑数据和指令的集合。程序(Program)设计是给出解决特定问题程序的过程,是构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。1.1.1冯结构尽管计算机技术自20 世纪40 年代第一部电子通用计算机诞生以来以来有了令人目眩的飞速发展,但是今天计算机仍然基本上采用的是构实现了实用化的通用计算机。程序结构,即冯结构。这个结与周围的所

2、有其他机器相比,数字计算机最独特的特点在于其功能的多样性。一个由有限硬件组件的计算机却可以执行无限的任务队列,从交互式到字处理到科学计算。这种卓越的灵活性看似理所当然,而其实这都是“程序(stored program)”概念的功劳。这个概念在 20 世纪 30 年代曾被几位著名数学家形式化描述过,到现在它仍然被认为是现代计算机史上最具意义的发明。跟许多科学上的突破一样,程序概念的基本其实相当简单。计算机基于固定的硬件,能够执行固定的指令集。同时,这些指令能够被当成构件模块,组成任意的程序。而且,不同于 1930 年以前的机械计算机,这些程序的逻辑并没有被嵌入到硬件中,而是被到计算机的设备(me

3、mory)里,跟数据一样,成为所谓的“”。因为计算机的操作时通过当前正在执行的来向用户展示其功能,所以每次向计算机中载入不同的程序时,同样的硬件可以实现完全不同的功能。程序概念是很多抽象的、应用型计算机模型的关键,其中最著名的是通用图灵机(1936)和冯机(1945)。图灵机描述虚拟的简单计算机的抽象机。主要用来分析计算机系统的逻辑基础。相比之下,冯机是实际应用型的体系结构,它几乎是今天所有计算机的基础。冯体系结构的基础是一个处理器单元(CPU,Central Prosing Unit),它与设备(memory device)即内存进行交互,负责从输入设备(input device)接收数据,

4、向输出设备(output device)发送数据。这系结构的是程序的概念:计算机内存不仅着要进行操作的数据,还着指示计算机运行的指令。下面让来详细了解这系机构。CPU内存输出算术逻辑单元(ALU)(数据内存+ 指令内存)寄存器输入控制器图 1.1 冯体系内存(Memory)冯机的内存中存有两种类型的信息:数据项(data items)和程序指令(programming instruction)。对这两种信息通常采用不同的方式来处理,在某些计算机里,它们被分别到不同的内存区域中。尽管它们具有不同功能,但两种信息都以二进制数形式在具有通用结构的随机器中(续的固定宽度的单元阵列,也称为字即 word

5、,或者单元,每个单元都有一个独立的地址)表示。因此,一个独立的字(代表一个数据项或是一条指令)通过它的地址来制定。数据内存(Data Memory):高级程序(high-level programs抽象的元件(artifacts),例如变量(variables)、数组(arrays)和对象(objects)。这些数据抽象被翻译成机器语言后,就变成一连串的二进制数,在计算机的数据内存中。一旦通过指定的地址,在数据内存中找到对应的单元,就可以对该内存单元进行读操作和写操作,对于读操作,是获取这个字的值;对于写操作,则是将新值存入指定的内存单元中,取代原来的旧值。指令内存(Instruction M

6、emory):当高级命令被翻译成机器语言时,它变成一系列的二进制字(word),这些字代表机器的指令。这些指令被计算机操作的每一步,CPU 从指令中取出一个字,对其进行在计算机的指令内存中。在,从而执行指定的指令,然后计算下一条将要执行的指令。因此,改变指令中的内容会完全改变计算机的操作。驻留在指令内存中的指令格式遵守机器语言的规一些计算机中,每个操作得规范机器代表其操作数的代码是用一个单一字长的指令来表示的。其他计算机在讲这个规范分为几个单字来表示。处理器(Central Prosing Unit)CPU 是计算机体系的,负责执行已被加载到指令内存中的指令。这些指令告诉 CPU去执行不同的计

7、算,对内存进行读/写操作,以及根据条件跳转去执行程序中的其他指令。CPU 通过使用三个主要的硬件要素来执行这些任务:算术逻辑单元(ALU,Arithmetic-LogicUnit),一组寄存器(registers)和控制单元(controit)。算术逻辑单元(ALU):ALU 负责执行计算机中所有底层的算术操作和逻辑操作。比如,典型的 ALU 可以执行的操作包括:将两个数相加;检查一个数是否为整数;在一个数据字中进行位操作;等等。寄存器(Registers):CPU 的设计是为了能够快速地执行简单计算。为了提高它的性能,将这些和运算相关的数据暂存到某个局部器中是十分必要的,这远比从内存中搬进搬

8、出要好。因此,每个 CPU 都配有一组高速寄存器,每个寄存器都能保存一个单独的字。控制单元(Controit):计算机指令用二进制代码来表示,通常具有 16、32 或 64位宽。在指令能够被执行之前,必须对其进行,指令里面包含的信息向不同的硬件设备(ALU,寄存器,内存)发送信号,指使它们如何执行指令。指令的过程是通过某些控制单元(Controit)完成的。这些控制单元还负责决定下一步需要取出和执行哪一条指令。CPU 操作现在可以被描述成一个重复的循环:从内存取出一条指令(字);将其;执行该指令,取下一条指令;如此反复循环。指令的执行过程可能包含下面的一些子任务:让 ALU 计算一些值,控制寄

9、存器,从设备中一个字,或向设备中写入一个字。在执行这些任务的过程中,CPU 也会计算出下一步该执行哪一条指令。寄存器(Registers)内存时很慢的过程。当 CPU 被指示去取内存地址 j 的内容是,下面的一些过程会连续发生:(a)j 从 CPU 传到 RAM;(b)RAM 的直接逻辑选中地址为 j 的寄存器;(c)RAMj的内容传回到 CPU。寄存器也能够提供同样的数据功能,但没有来回的数据传递和寻址开销。首先,寄存器位于 CPU,所以对它们的几乎可以瞬间完成;其次,与数百万个内存单元相比,寄存器数量非常少。因此,机器语言指令可以使用短短的几个位就能制定要操作得寄存器在什么位置,这样指令格

10、式也更短。基于不同的目的,不同 CPU 采用不同数量、不同类型的寄存器。在一些计算机体系结构中,每个寄存器可以有多种用途。数据寄存器(Data Register):这些寄存器为 CPU 提供短期服务。比如,当计算(a-b)*c 时,必须首先计算(a-b)的值并记住它。虽然这个结果可以暂时地被到单元中,但更好的办法是在 CPU即数据寄存器中。寻址寄存器(Addressing Resister):为了进行读写,CPU 必须连续内存中的数据。这样须确定被的内存子(word)所在的内存地址。在某些情况下这个地址作为当前指令的一个部分给出,而其他某些情况下它依赖于前面一条指令的执行结果。对于后者,这个地

11、址应该被到某个寄存器中,使得该寄存器的内容在今后的操作中能够被当做单元的地址这就需要用到寻址寄存器。程序计数器寄存器(Program counter resister):执行程序时,CPU 必须总是知道下一条指令在指令内存中的地址。这个地址保存在一个特殊的寄存器即程序计数器中(或称 PC, Program Counter)。PC 的内容就被当作从指令内存中取指令的地址。因此,在执行当前指令的过程中,CPU 通过两种方式更新 PC 的内容:1)如果当前指令布包扣 goto 指令,PC 增 1 以便使指针指向程序中的下一条指令;2)如果当前指令中包含需要执行的goto n 命令,则 CPU 将 P

12、C 置为 n。输入和输出(Input and Output)计算机使用一组输入输出(I/O)设备来与其外部环境进行交互。这些设备包括屏幕、键盘、扫描仪、网络接口卡、光驱等,还有一些复杂的集成在汽车、系统、医疗器械等机器中的计算机。这里需考虑这些设备本身的构造,主要是因为:首先,每个设备代表一块独立的的机器,需要相关的工程知识;其次,计算机科学家设计不同的方案将这些不同外设的物理细节封装起来,让计算机能够以相同的方式对他们进行操作,其中最简单的实现技巧之一就是I/O 映像(memory-mapped I/O)。I/O 映像的基本是:创建 I/O 涉及的二进制仿真,使其对于 CPU 而言,“看上去

13、”就像普通的内存段。特别地,每个 I/O 设备在内存中都分配了独立的区域,作为它的“内存映像”。对于输入设备(键盘、鼠标等),内存映像能连续不断地反映设备的物理状态;对于输出设备(屏幕、扬声器等),内存印象连续地驱动设备的物理状态。当外部事件作用于输入设备时(比如,在键盘上按键或者移动鼠标),某些特定的值就被写入它们各自对应的内存映像中。同样地,想要控制某些输出设备(比如,在屏幕上画图或者一首歌曲),就将一些特定值写入它们各自对应的内存映像。从硬件的角度来看,这个方案需要所有的 I/O设备提供类似于单元的那种接口。从的角度来看,需要对每个 I/O 设备定义交互协议,这样程序才能正确地它。若有大

14、量可用的计算机和 I/O 设备,就不难明白各类在计算机体系结构中所起的重要作用。I/O 内存映像体系的实际应用是很有意义的:CPU 以及整个的设计可以完全不依赖于要与计算机进行交互的 I/O 设备,也不依赖于 I/O 设备的数量和种类。无论何时将新的 I/O设备与计算机连接,所要做的只是为其分配一个新的内存映像并它的址(这些配置工作是由操作系统来完成的)。这样依赖,程序可以通过操控 I/O 内存映像中的比特数据来实现相应物理I/O 外设的操作。1.1.2机器语言与汇编语言机器语言(machine language)是一种指令集的体系。这种指令集,称机器码(machine code),是电脑的

15、CPU 可直接解读的数据。机器语言是计算机唯一能接受和执行的语言。机器语言由二进制码组成,每一串二进制码叫做一条指令。一条指令规定了计算机执行的一个动作。一台计算机所能懂得的指令的全体,叫做这个计算机的指令系统。不同型号的计算机的指令系统不同。指令通常由几个字节组成,第一个字节是操作码,它规定了计算机要执行的基本操作;后面的字节是操作数,它规定了操作对象或操作对象的地址。机器语言是直接用二进制代码指令表达的计算机语言,指令是用0 和1 组成的一串代码,它们有一定的位数,并分成若干段,各段的编码表示不同的含义,例如某台计算机字长为 16 位,即有 16 个二进制数组成一条指令或其它信息。16 个

16、 0 和 1 可组成各种排列组合,通过线路变成电信号,让计算机执行各种不同的操作。如某种计算机的指令为 1011011000000000,它表示让计算机进行一次加法操作;而指令 1011010100000000 则表示进行一次减法操作。它们的前八位表示操作码,而后八位表示地址码。从上面两条指令可以看出,它们只是在操作码中从左边第 0 位算起的第 6 和第 7位不同。这种机型可包含 256(=28)个不同的指令。机器语言或称为二进制代码语言,计算机可以直接识别,不需要进行任何翻译。每台机器的指令,其格式和代码所代表的含义都是硬性规定的,故称之为面向机器的语言,也称为机器语言。它是第一代的计算机语

17、言。机器语言对不同型号的计算机来说一般是不同的。使用机器语言编写程序是一种相当烦琐的工作,既难于也难于操作,编写出来的程序全是由 0 和 1 的数字组成,直观性差、难以阅读。不仅难学、难记、难检查、又缺乏通用性,给计算机的推广使用带来很大的。最早的程序设计语言都采用机器语言来编写。当时,要在计算机上运行的所有算法都必须直接用机器语言来表达,计算机才能接受。算法的运算序列包括运算对象和运算结果都必须转换为指令序列。其中的每一条指令都以编码(指令码和地址码)的形式出现。与算法语言表达的算法,相差十万八千里。对于没受过程序设计专门训练的人来说,一份程序恰似一份天书,让人看了不知所云,可读性极差。用机

18、器语言表达算法的运算、数据和控制十分繁杂琐碎,因为机器语言所提供的指令太初等、原始。机器语言只接受算术运算、按位逻辑运算和数的大小比较运算等。对于稍复杂的运算,都必须一一分解,直到到达最初等的运算才能用相应的指令替代之。机器语言能直接表达的数据只有最原始的位、字节、和字三种。算法中即使是最简单的数据如布尔值、字符、整数、和实数,也必须一一地到位、字节和字中,还得一一分配它们的单元。对于算法中有结构的数据的表达则要麻烦得多。机器语言所提供的控制转移指令也只有无条件转移、条件转移、进入子程序和从子程序返回等最基本的几种。用它们来构造循环、形成分支、调用函数和过程得事先做许多的准备,还得靠许多的技巧

19、。直接用机器语言表达算法有许多缺点。大量繁杂琐碎的细节牵制着程序员,使他们不可能有的时间和精力去从事创造性的劳动,执行对他们来说更为重要的任务。如确保程序的正确性、高效性。程序员既要驾驭程序设计的全局又要深入每一个局部直到实现的细节,即使智力超群的程序员也常常会顾此失彼,屡出差错,因而所编出的程序可靠性差,且开发周期长。由于用机器语言进行程序设计的思维和表达方式与人们的较长时间职业训练的程序员才能胜任,使得程序设计曲高和寡。大相径庭,只有经过为了克服机器语言上述的缺点,出路在于程序设计语言的抽象,让它尽可能地接近于算法语言。为此,人们首先注意到的是可读性和可移植性,因为它们相对地容易通过抽象而

20、得到改是,很快就出现汇编语言。这种语言对机器语言的抽象,首先表现在将机器语言的每一条指令符号化:指令码代之以符号,地址码代之以符号地址,使得其含义显现在符号上而不再隐藏在编码中,可让人望文生义。其次表现在这种语言摆脱了具体计算机的限制,可在不同指令集的计算机上运行,只要该计算机配上汇编语言的一个汇编程序。这无疑是机器语言朝算法语言靠拢迈出的一步。但是,它离算法语言还太远,以致程序员还不能从分解算法的数据、运算和控制到汇编才能直接表达的指令等繁杂琐碎的事务中解脱出来。用能反映指令功能的助记符表达的计算机语言叫汇编语言。它是符号化了的机器语言。用汇编语言编写的程序叫汇编语言源程序,计算机无法执行。

21、必须用汇编程序把它翻译成机器语言目标程序,计算机才能执行。这个翻译过程称为汇编过程。汇编语言是用助记符表示指令功能的计算机语言。与机器语言相比,汇编语言具有以下的几个特点:第一,它使用符号来表示操作码和地址码,这种符号便于,称为码。第二,汇编程序自动处理写十进制数。分配,毋需程序员做分配工作。第三,程序员可以直接书例如,要计算 c=7+8,可以用如下几条汇编命令:其中(ACC)表示累加器中的值,等等。如此简单的汇编语言,只是符号形式的机器语言,但用它来编写程序或阅读已经编写好的程序比起机器语言来要简单和方便多了。这就是计算机语言发展中的第二代语言汇编语言。人们使用这种助记符编写程序后,要是计算

22、机能够接受,还必须把编好的程序逐条翻译成二进制编码的机器语言。当然,这个工作并不是有程序员来完成,而是有称为“汇编程序”的程序自动完成的。汇编程序的功能就是把由汇编语言编写的程序(称为汇编语言源程序)翻译成机器语言程序,计算机才能执行该程序。这个翻译过程称为汇编。汇编语言比起机器语言在很多方面都有很大的优越性,如编写容易、修改方便、阅读简单、程序清楚等,但在计算机语言系统中,把汇编语言仍然列入“低级语言”的范畴,它仍然是属于面向机器的语言,也就是说,不同的计算机可以有不同的指令集。1.1.3操作系统综观计算机之历史,操作系统(operating system,OS)与计算机硬件的发展关。操作系

23、统之本意原为提供简单的工作排序能力,后为辅助更新更复杂的硬件设施而渐渐演化。从最早的批量模式开始,分时机制也随之出现,在多处理器时代来临时,操作系统也随之添加多处理器协调功能,甚至是分布式系统的协调功能。其他方面的演变也类似于此。另一方面,在个人计算机上,个人计算机之操作系统因袭大型机的成长强大时,也逐步实践以往只有大型机才有的功能。,在硬件越来越复杂、操作系统位于底层硬件与用户之间,是两者沟通的桥梁。用户可以通过操作系统的用户界面,输入命令。操作系统则对命令进行解释,驱动硬件设备,实现用户要求。以现代观点而言,一个标准个人计算机的 OS 应该提供以下的功能:进程管理(Prosing mana

24、gement)内存管理(Memory management)文件系统(File system)网络通信(Networking)安全机制(Security)用户界面(Usererface)设备驱动程序(Device drivers)标号指令说明STARTGET 7;把 7 送进累加器 ACC 中ADD 8;累加器 ACC+8 送进累加器 ACC 中P;把累加器 ACC 送进C 中ENDSTOP;停机进程管理不管是常驻程序或者应用程序,他们都以进程为标准运行。当年运用冯结构建造计算机时,每个处理器最多只能同时运行一个进程。早期的 OS(例如 DOS)也不允许任何程序打破这个限制,且 DOS 同时只

25、有运行一个进程(虽然 DOS 自己宣称他们拥有终止并等待驻留(TSR)能力,可以部分且艰难地解决这问题)。现代的操作系统,即使只拥有一个 CPU,也可以利用多进程(multitask)功能同时运行复数进程。进程管理指的是操作系统调整复数进程的功能。由于大部分的计算机只包含一颗处理器,在单(Core)的情况下多进程只是简单迅速地切换各进程,让每个进程都能够运行,在多或多处理器的情况下,所有进程通过许多协同技术在各处理器或上转换。越多进程同时运行,每个进程能分配到的时间比率就越小。进程管理通常实践了分时的概念,大部分的 OS 可以利用指定不同的等级(priority),为每个进程改变所占的分时比例

26、。越高的进程,运行优先级越高,时间内占的比例也越高。交互式 OS 也提供某种程度的回馈机制,让直接与用户交互的进程拥有较高的值。除了进程管理之外,OS 尚有担负起进程间通信(IPC)、进程异常终止处理以及死锁(Dead Lock)侦测及处理等问题。内存管理大部分的现代计算机器架构都是层次结构式的,最快且数量最少的暂存器为首,然后是高速缓存、空间、配置与器以及最慢的磁盘设备。而 OS 的器管理提供查找可用的空间以及交换器和低速设备内容等功能。此类又被称做虚拟内存管理的功能大幅增加每个进程可获得的空间(通常是 4GB 或)。然而这也带来了降低运行效率的缺点,严重时甚至也会导致进程。器管理的另一个重

27、点活动就是借由 CPU 的帮助来管理虚拟位置。如果同时有许多进程于设备上,操作系统必须防止它们互相干扰对方的器内容(除非通过某些器空间可以达成目标。协议在可控制的范围下操作,并限制可的器范围)。分区每个进程只会看到整个有些位置被 OS 保留而器空间(从 0 到器空间的最大上限)被配置给它自己(当然,)。CPU 事先存了几个表以比对虚拟位置与实际器位置,这种方法称为页(paging)配置。借由对每个进程产生分开独立的位置空间,OS 也可以轻易地一次某进程所占据的所有器。如果这个进程不器,OS 可以退出进程并将器自动。磁盘与文件系统所谓的文件系统,通常指称管理磁盘数据的系统,可将数据以目录或文件的

28、型式每个文件系统都有自己的特殊格式与功能,例如日志管理或不需磁盘重整。OS 拥有许多种自带文件系统。例如 Linux 拥有非常广泛的自带文件系统,如 ext2、ext3、ext4、ReiserFS、Reiser4、GFS、GFS2、OCFS、OCFS2、NILFS 与文件系统。Linux 也支持非本地文件系统,例如XFS、JFS、FAT与NTFS。另一方面,Windows 能支持的文件系统只有 FAT12、FAT16、FAT32 与 NTFS。NTFS 系统是 Windows 上最可靠与最有效率的文件系统。其他的 FAT都比 NTFS 老旧,且对于文件长度与分区磁盘能力都有很大限制,因此造成很

29、多问题。而UNIX 的文件系统多半是UFS,而 UNIX 中的一个分支Solaris 最近则开始支持一种新式的 ZFS。网络许多现代的 OS 都具备操作主流网络通信协议 TCP/IP 的能力。也就是说这样的操作系统可以进入网络世界,并且与其他系统诸如文件、与扫描仪等资源。安全大多数 OS 都含有某种程度的机制。机制主要基于两大理念:OS 提供外界直接或间接数种资源的管道,例如本地端磁盘驱动器的文件、受保护的系统调用(System call)、用户的隐私数据与系统运行的程序所提供的服务。OS 有能力认证(Authorization)资源的请求。允许通过认证的请求并无法通过的请求,并将适当的权力(

30、Authentication)给此请求。有些系统的认证机制仅简略地把资源分为或非,且每个请求都有独特的辨识号码,例如用户名称。用户界面大部分的 OS 都包含图形用户界面。有几类较旧的 OS 将图形用户界面与紧密结合,例如最早的Windows 与 Mac OS。这种方法可提供较快速的用户界面反应能力,但是会有副作用,例如图形系统将导致整个系统。许多近代的 OS 已模块化,将图形接口的副系统与分开(Linux 与 Mac OS X)。许多 OS 允许用户安装或创造任何他们喜欢的图形接口。大部分的 Unix 与 Unix 派生系统(BSD、Linux 与 Minix)通常会安装 X Window 系

31、统配合GNOME 或 KDE 桌面环境。而某些 OS 就没有这么弹性的图形用户界面,例如 Windows。驱动程序设备驱动程序(device driver),简称驱动程序(driver),是一个允许高级与硬件交互的程序,这种程序创建了一个硬件与硬件,或硬件与沟通的接口,经由主板上的总线或其它沟通子系统与硬件形成连接的机制,这样的机制使得硬件设备上的能。成为可设计驱动程序的主要目的在于操作抽象化,任何硬件模块,既使是同一类的设备,在硬件设计面上也有巨大差异。厂商推出的较新模块通常更可靠更有效率,控制方法也会有所不同。计算机与其 OS 不可能预期那些现有与新设备的变异之处,因此无法知道其操作方法。

32、为解决此问题 OS 通常会主动制订每种设备该有的操作方式,而驱动程序功能则是将那些 OS制订的行为描述,转译为可让设备了解的自定义操作手法。理论上适合的驱动程序一旦安装,相对应的新设备就可以无误地运行。此新驱动程序可以让此设备完美地切合在 OS 中,让用户察觉不到这是 OS 原本没有的功能。1.2高级语言由于汇编语言依赖于硬件体系,且助记符量记,于是人们又发明了更加易用的所谓高级语言。在这种语言下,其语法和结构更类似普通英文,且由于远离对硬件的直接操作,使得人们可以用更易理解的方式编写程序。高级语言并不是特指的某一种具体的语言,而是包括很多编程语言,如目前流行的 Java,C+JavaScri

33、pt 等,这些语言的语法、命令格式都不相同。,C#,(Visual)Basic,Objective-C,低级语言分机器语言和汇编语言,这两种语言都是面向机器的语言,和具体机器的指令系统密切相关。机器语言用指令代码编写程序,而汇编语言用指令助记符来编写程序。高级语言与计算机的硬件结构及指令系统无关,它有更强的表达能力,可方便地表示数据的运算和程序的控制结构,能更好的描述各种算法,而且容易学习掌握。但高级语言编译生成的程序代码一般比用汇编程序语言设计的程序代码要长,执行的速度也慢。所以汇编语言适合编写一些对速度和代码长度要求高的程序和直接控制硬件的程序。高级语言程序“看不见”机器的硬件结构,不能用

34、于编写直接机器硬件资源的系统或设备控制。为此,一些高级语言提供了与汇编语言之间的调用接口。用汇编语言编写的程序,可作为高级语言的一个外部过程或函数,利用堆栈来传递参数或参数的地址。程序设计语言从机器语言到高级语言的抽象,带来的主要好处是:高级语言接近算法语言,易学、易掌握,一般工程技术就可以胜任程序员的工作;只要几周时间的培训高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可性强,可靠性高;高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高;由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程序员得到解脱

35、,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高程序的质量。1.2.1编译和解释机器语言和汇编语言都是面向机器的,高级语言是面向用户的。用高级语言编写的程序叫做高级语言源程序,必须翻译成机器语言目标程序才能被计算机执行。高级语言的翻译有两种方式:编译方式和解释方式。编译方式:先由编译程序把高级语言源程序翻译成目标程序,执行时运行目标程序。解释方式:在运行高级语言源程序时,由解释程序对源程序边翻译边执行。算法最终要表达为具体计算机上的机器语言才能在该计算机上运行,得到所需要的结果。但汇编语言的实践启发人们,表达成机器语言不必一步到位,可以分两步走或者。即先表达成一种中间语言,然

36、后转成机器语言。汇编语言作为一种中间语言,并没有获得很大成功,原因是它离算法语言还太远。这便指引人们去设计一种尽量接近算法语言的规范语言,即所谓的高级语言,让程序员可以用它方便地表达算法,然后借助于规范的高级语言到规范的机器语言的翻译,最终将算法表达为机器语言。而且,由于高级语言和机器语言都具有规范性,这里的翻译完全可以机械化地由计算机来完成,就像汇编语言被翻译成机器语言一样,只要计算机配上一个编译程序。上述两步,前一步由程序员去完成,后一步可以由编译程序去完成。在规定清楚它们各自该做什么之后,这两步是完全独立的。它们各自该如何做互不相干。前一步要做的只是用高级语言正确地表达给定的算法,产生一

37、个高级语言程序;后一步要做的只是将第一步得到的高级语言程序翻译成机器语言程序。编译器(Compiler),是一种电脑程序,它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。它主要的目的是将便于人编写,阅读,的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高级语言,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。一个现代编译器的主要工作流程如下:源代码(source code) 预处理器(preprosor) 编译器 (compi

38、ler) 汇编程序 (assembler) 目标代码 (object code) 链接器 (Linker) 可执行程序 (executables)。解释器(reter)是一种把高级编程语言直接运行的翻译程序。解释器不会一次把整个程序翻译出来。它每翻译一行程序叙述就立刻运行,然后再翻译下一行,再运行,如此不停的进行下去,因此解释器的程序运行速度比较缓慢。相对地,编译器并不运行程序或原代码,而是一次过将其翻译成另一种语言,如机器码,以供多次运行而无需再经编译。其制成品无需依赖编译器而运行,程序运行速度比较快。1.3问题、算法与程序1.3.1问题人类使用“自然语言”来描述那些希望计算机解决。自然语言

39、通俗易懂,但是不能直接作为计算机的指令,最重要的原因就是它具有“歧义性”:为了推断出一句话的含义,听者通常需要根据说话人的发音、语调,语句的上下文来推断。例如:“羽毛球拍卖完了。”可以理解为没有羽毛球拍了,被卖完了;也可以理解为没有羽毛球了,被拍卖完了。如果把这种有歧义的自然语言作为指令提供给计算机,计算机如何执行?本质上,计算机仍是电子设备,它只能机械的执行明确的指令,如“Add A, B”是将两个数 A 和 B 相加。面对有歧义的自然语言,计算机将无所适从。1.3.2算法因此,第一步就是舍弃描述问题的自然语言中的歧义,将自然语言描述转换成一个无歧义的操作步骤,即算法。算法是一个逐步计算的过

40、程,该过程一定能够结束,而且每个步骤都能够被明确描述,并能被计算机所执行。以上这三个特点有专门的术语:“有限性”(finiteness):程序最终能够结束。“确定性”(definiteness):每个步骤都必须是明确的,不应存在歧义性。例如,“A与一个数相加”就是“不确定”的,因为不知道A 与哪一个数相加。“有效可计算性”(effective computability):每个步骤都能被计算机执行。例如,“A除以 0”就缺乏可计算性。要解决一个问题通常可以采用多种算法,有的算法可能需要的较少的计算时间;有的算法可能需要较少的的分析。空间。算法分析就是对一个算法需要多少计算时间和空间作定量程序1

41、.3.3第二步是使用一种程序设计语言把算法转换为程序。程序设计语言与自然语言不同,它不是在人类的交谈中演化形成的。相反地,程序设计语言是用于表达计算机指令的语言,不能存在歧义性。仍以“将两个数A和B相加”为例,C语言可以表示为“A+B”;而用某种机器的汇编语言表示,可以为“Add A, B”,其机器语言则为“0001001001000000”。1.3.4语言处理对于使用高级语言和汇编语言编写的程序而言,如果要在计算机上执行,必须将其翻译成执行程序作业的机器(目标机器)的指令,即机器语言。1.4虚拟机虚拟机(Virtual Machine),在计算机科学中的体系结构里,是指一种特殊的,它可以在计

42、算机和终端用户之间创建一种环境,而终端用户则是基于这个所创建的环境来操作。虚拟机是指可以像真实机器一样运行程序的计算机的实现。虚拟机最初被定义为“有效的、孤立的真实机器的副本”。例如,用 Java 编写的程序可以通过对Java 虚拟机发命令获得服务,取得期望的结果。程序不必为特定的操作系统或硬件编写。虚拟机根据它们的运用和与直接机器的相关性分为两大类。系统虚拟机提供一个可以运行完整操作系统的完整系统。相反,程序虚拟机为运行单个计算机程序设计,这意味它支持单个进程。虚拟机的一个本质特点是运行在虚拟机上的被局限在虚拟机提供的资源里它出虚拟世界。系统虚拟机基于这种虚拟机,用户可以运行任何操作系统,比

43、如可以在他们的虚拟电脑上运行不同的操作系统。常见的产品包括:VMare,VirtualBox,Parallels 等。程序虚拟机(Java 虚拟机)Java 虚拟机(Java Virtual Machine,JVM)是一个虚构出来的计算机,是通过在实际的 计算机上仿真模拟各种计算机功能来实现的。Java 虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM了与具体操作系统相关的信息,使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种上不加修改地运行。Java 虚拟机能够运行经过编译的 Java 目标代码。它能运行的Java 程

44、序包括独立的 Java 应用程序(application)和到浏览器中的 Java 小程序(applet)。经过编译的 Java 目标代码,称为 Java 字节码(byte code),再经过本地计算机上的 Java 解释器的解释,或者编译器的编译,就可以运行了。Java独立性在 Java和不依赖的结构中,Java 虚拟机处在的两部分组成,其中依赖于的位置。它的下方是移植接口,移植由依的部分称为适配器。Java 虚拟机通过移赖植接口在具体的操作系统上实现。因此,对于 Java 虚拟机 ,操作系统和底层的硬件是透明的。在 Java 虚拟机的上方,是 Java 的类和 Java API(Java

45、应用程序接口)。在 Java API 上,可以编写 Java 应用程序和 applet。所以,对于 Java 应用程序和 applet 这一层来说,操作系统和硬件更是透明的了。改。编写的 Java 程序,可以在任何 Java上运行而无需修Java 应用程序和 appletJava 基本 APIJava 标准扩展 API移植接口硬件硬件网络图 1.2 Java 虚拟机Java 安全性作为适用于网络编程的语言,安全性是必须要保证的。Java 虚拟机在 Java 安全体系中占有重要地位。至少有以下的 3 项安全保证是和 Java 虚拟机有关。第 1 项是内存的布局。在任何 Java 程序的字节码表示

46、中,变量和方法的都是使用符号,而不是使用具体的数字。用数字替代符号在运行时由解释器完成。对于编程来说,内存分配是透明的,不可能在编写程序的时候就知道内存的布局。编程无法通过指针任何的内存空间。第 2 项是字节码的检验。虽然 Java 编译器保证源代码不安全规范,但是当从其他地方Java 字节码时,并不能认为它是安全的。因为有可能是生成这些字节码的编译器本身有安全问题,也有可能是有人故意制作了一个Java 编译器,以侵入其他用户的系统。适配器 浏览器 操作系统适配器 操作系统Java 基本类Java 标准扩展类Java 虚拟机所以必须对字节码进行检验。字节码的一个重要特性是它的可性很强,能够对指

47、令集进行分析,并对其以后的行为做出一定的推断,这就为检验打下了基础。通过检验的程序,可以确保不存在等。的指针、不权限、不对象、不会导致操作数栈溢出,等第 3 项是字节码装载器的安全检查。因为字节码采用符号,内存布局在运行时确定,所以可以在字节码装入时将本地的类和外来的类严格区别开。本地的类共有一个的名字空间,外来的类每个网络节点一个名字空间。外来的类不能以任何方式对本地的类进行操作。这种机制为本地的类建立起一道安全屏障。2工程的发展2.1工程工程一直以来都缺乏一个的定义,很多学者、组织机构都分别给出了自己的定义。运用现代科学技术知识来设计并构造计算机程序及为开发、运行和这些程序所必需的相关文件

48、资料。- Barry Boehm工程是:1、将系统化的、严格约束的、可量化的方法应用于的开发、运行和,即将工应用于;2、在 1 中所述方法的研究。- IEEE工程术语汇编在 NATO 会议上给出的定义:建立并使用完善的工原则,以较经济-Fritz Bauer段获得能在实际机器上有效运行的可靠的一系列方法。工程是应用计算机科学、数学及管理科学等原理,开发的工程。工程借鉴传统工程的原则、方法,以提高质量、降低成本。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。-计算机科学技术百科全书普遍定

49、义:目前比较认可的一种定义认为:工程是研究和应用如何以系统性的、规范化的、可定量的过方法去开发和,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。作为从计算机科学中成长起来的一门新的学科的如下表所示:工程与计算机科学的区别可以简单表 2.1工程与计算机科学的区别工程计算机科学目标在时间、资源、这 3 个主要限制条件下构建满足用户需探索正确的计算和建模方法,从而改进计算方法本身。2.2开发生命周期开发生命周期(SDLC,Systems Development Life Cycle, SDLC)是的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系

50、统设计、编码、调试和测试、验收与运行、升级到废弃等阶段。这种按时间分程的方法是工程中的一种原则,即按部就班、逐步推进,每个阶段都要有定义、工作、或备查,以提高的质量。、形成文档以供交流问题定义此阶段是开发需求方共同,主要确定的开发目标及其可行性。需求分析在确定开发可行的情况下,对需要实现的各个功能进行详细分析。需求分析阶段是一个很重要的阶段,这一阶段做得好,将为整个开发项目的成功打下良好的基础。唯一不变的是变化本身。,同样需求也是在整个开发过程中不断变化和深入的,因此须制定需求变更计划来应付这种变化,以保护整个项目的顺利进行。设计此阶段主要根据需求分析的结果,对整个系统进行设计,如系统框架设计

51、,数据库设计等等。设计一般分为总体设计和详细设计。好的好的基础。设计将为程序编写打下良程序编码此阶段是将设计的结果转换成计算机可运行的程序代码。在程序编码中必须要制定,符合标准的编写规范。以保证程序的可读性,易性,提高程序的运行效率。求的系统。产品(比如办公包和编译器)。算法(比如排序法)和抽象比如哲学家进餐问题)。进度与时间表项目都有特定的进度与时间表研究项目一般不具有设置的进度与时间表关注点工程关注如何为用户实现价值。理论关注的是 本身运行的原理,比如时间复杂度,空间复杂度,和算法的正确性。变化程度随着技术和用户需求的不断变化, 开发 必须时刻调整自己的开发以适应当前的需求。同时 工程本身

52、也处于不断的发展中。对于某一种特定问题的正确解决方法将永远不会改变。测试在设计完成后要经过严密的测试,以发现在整个设计过程中存在并加以纠正。在测试过程中需要建立详细的测试计划并严格按照测试计划进随意性。试,以减少测试的运行是多方面的原因,生命周期中持续时间最长的阶段。在开发完成并投入使用后,由于不能继续适应用户的要求。要延续的使用,就必须对进行。的包括纠错性和改进性两个方面。2.3开发过程开发过程是指一个产品开发的方法,描述了开发中的任务和行为。常见的开发过程模型包括瀑布、螺旋、迭代、敏捷开发等。2.3.1编码-修补(code-and-fix)编码-修补生命周期模型(code-and-fix

53、life-cycle m)基本等同于完全的开发状态,今天仍然然有许多产品都是用所谓的“编码-修补生命周期模型”开发的。实现产品时没有需求或规格说明,也没有进行设计方面的尝试。开发者只是简单地将代码拼凑在一起,为满足客户的要求,多次改写该得很好,但对于合理规模的。尽管这种方法对于 100 行或 200 行的短程序可以操作产品来说,编码-修补模型则完全不能令人满意。如果修改在需求、规格说明和设计阶段进行,修改产品的花费相对会小些。但如果产品已经编出代码或者更糟地,产品已经交付并安装在客户计算机上,则修改产品的代价会大得令人不能接受。另外,对没有规格说明和设计文档的产品进行相当,而且发生错误的机会也

54、相当大。在那些用代码行唯一地度量项目进展的组织内,这个问题尤其突出,因为开发小组的成员们被迫从项目开始的第一天起尽可能多地辛辛苦苦编出一行行代码。编码-修补模型是最简单的开发方式,也是最糟糕的方式。2.3.2瀑布模型瀑布模型是最早出现的发的基本框架。开发模型,在工程中占有重要的地位,它提供了开瀑布模型(Waterfall M)是一个项目开发架构,开发过程是通过设计一系列阶段顺序展开的,从系统需求分析开始直到产品发布和,每个阶段都会产生循环反馈,因此,如果有信息未被覆盖或者发现了问题,那么最好“返回”上一个阶段并进行适当的修改。项目开发进程从一个阶段“”到下一个阶段,这也是瀑布模型名称的由来。瀑

55、布模型是按工序将问题化简,将功能的实现与设计分开,便于分工协作。将生命周期划分为制定计划、需求设计、程序编写、测试和运行等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。瀑布模型有以下优点:为项目提供了按阶段划分的检查点。当前一阶段完成后,只需要去关注后续阶段。瀑布模型有以下缺点:在项目各个阶段之间极少有反馈。只有在项目生命周期的后期才能看到结果。通过过多的强制完成日期和里程碑来各个项目阶段。2.3.3迭代式开发随着项目越来越复杂,传统的瀑布型开发流程不断地出以下问题:需求或设计中的错误往往只有到了项目后期才能够被发现例如:系统交付客户之后才发现原先对于需求的

56、理解是错误的,系统设计中测试阶段才能被发现。要到对于项目风险的控制能力较弱项目风险在项目开发较晚的时候才能够真正降低,往往是经过系统测试之后,才能确定该设计是否能够真正满足系统需求。项目常常延期完成或开发费用超出项目开发进度往往会被意外发生期,造成项目延期或费用超支。所打乱,需要进行返工或其他一些额外的开发周项目管理专注于文档的完成和审核来估计项目的进展情况项目经理对于项目状态的估计往往是确的,当他回答系统已完成了 80%的开发任务时,可能剩下 20%的开发任务实际上消耗的是整个项目 80%的开发资源。迭代式开发也被称作迭代增量式开发或迭代进化式开发,在迭代式开发方法中,整个开发工作被组织为一

57、系列的短小的项目,被称为一系列的迭代。采用这种方法,开发工作可以在需求被完整地确定之前启动,并在一次迭代中完成系统的一部分功能或业务逻辑的开发工作。再通过客户的反馈来细化需求,并开始新一轮的迭代。在迭代式的方法中,将整个项目的开发目标划分成为一些更易于完成和达到的阶段性小目标,这些小目标都有一个定义明确的阶段性评估标准。迭代就是为了完成一定的阶段性目标而所从事的一系列开发活动,在每个迭始前都要根据项目当前的状态和所要达到的阶段性目标制定迭代计划,整个迭代过程包含了需求、设计、实施(编码)、部署、测试等各种类型的开发活动,迭代完成之后需要对迭代完成的结果进行评估,并以此为依据来制定下一次迭代的目

58、标。与传统的瀑布式开发模型相比较,迭发具有以下特点:允许变更需求需求总是会变化的,它会导致延期交付、工期延误、客户不满意、开发受挫。通过向用户演示迭代所产生的部分系统功能,可以尽早地收集用户对于系统的反馈,及时改正对于用户需求的理解偏差,从而保证开发出来的系统真正地解决客户。逐步集成元素在传统的项目开发中,由于要求一下子集成系统中所有的模块,集成阶段往往要占到整个项目很大比例的工作量(最高可达 40%),这一阶段的工作经常是不确定并且非常棘手。在迭代式方法中,集成可以说是连续不断的,每一次迭代都会增量式集成一些新的系统功能,要集成的元素都比过去少得多,所以工作量和难度都是比较低的。尽早降低风险

59、迭代化开发的主要指导原则就是以架构为中心,在早期的迭代中所要解决的主要问题就是尽快确定系统架构,通过几次迭代来尽快地设计出能够满足需求的系统架构,这样可以迅速降低整个项目的风险。等到系统架构稳定之后,项目的风险就比较低了,这个时候再去实现系统中尚未完成的功能,进而完成整个项目。有助于提高团队的士气开发通过每次迭代都可以在短期内看到自己的工作成果,从而有助于他们增强信心,更好地完成开发任务。而在非迭代式开发中,开发只有在项目接近尾声时才能看到开发的结果,在此之前的相当长时间,大家还是在不确定性中摸索前近。生成更高质量的产品每次迭代都会产生一个可运行的系统,通过对这个可运行系统进试,在早期的迭代中

60、就可以及时发现缺陷并改正,性能上的瓶颈也可以尽早发现并处理。因为在每次迭代中总是不断地纠正错误,可以得到更高质量的产品。保证项目开发进度每次迭代结束时都会进行评估,来判断该次迭代有没有达到预定的目标。项目经理可以很清楚地知道有哪些需求已经实现了,并且比较准确地估计项目的状态,对项目的开发进度进行必要的调整,保证项目按时完成。容许产品进行战术改变迭代的开发具有更大的灵活性,在迭代过程中可以随时根据业务情况或市场环境来对产品的开发进行调整。例如为了同现有的同类产品竞争,可以决定采用抢先竞争对手一步的方法,提前发布一个功能简化的产品。迭代流程自身可在进行过程中得到改进和精炼一次迭代结束时的评估不仅要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论