计算机软件技术基础2-1 程序设计语言_第1页
计算机软件技术基础2-1 程序设计语言_第2页
计算机软件技术基础2-1 程序设计语言_第3页
计算机软件技术基础2-1 程序设计语言_第4页
计算机软件技术基础2-1 程序设计语言_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第二章 程序设计语言

§2.1高级程序设计语言概述§2.2高级程序设计语言实现计算的方式§2.3高级程序设计语言的基本特征

§2.4面向对象程序设计语言的基本特征§2.5网络计算机时代的编程语言§2.6小结12.1高级程序设计语言概述

程序的表达手段是程序设计语言。程序设计语言是人-机交换信息的媒体;是表达软件(程序)的工具;是人-人交换信息的工具。软件的开发和使用,协作开发、使用修改都要读程序,程序设计语言必须规范化和标准化。最初的语言是机器语言。机器语言在内存中开辟两个区:数据区存放数据;指令区存放指令。CPU从指令区第一个地址开始逐条取出指令并释义执行,直到所有的指令都被执行完。一般的指令格式如下:操作码操作数操作数表中列出了三种类型的指令:2

DATA SEGMENT

XX DBX

YY DB? DATAENDS CODESEGMENT

ASSUMECS:CODE,DS:DATA START:MOVAX,DATA

MOVDS,AX

MOVAL,XX CMPAL,0

JGEBIGR MOVAL,0FFH

MOVYY,AL

HLT

JEEQUT BIGR:MOV AL,01H

MOV YY,AL

HLTEQUT:MOV YY,AL

HLTCODEENDS

ENDSTART ;数据段开始;X值存入XX单元;YY单元留作存函数Y的值;以上是数据段;代码段开始;CS段中装入代码,DS段中装入数据;执行开始;;将XX中的值转移到运算器AL;将运算器AL中的值与0比较;如果大于等于0就跳BIGR;X<0,将-1放入运算器;将运算器中的数移到YY中;停止;若等于0就跳到EQUT;将数01H移到运算器;将运算器中的数移到YY中

;运算器中是0则移到YY中

;代码段结束;结束MASM写的汇编程序3main(){intx,y;cinx;if(x>0)y=1elseif(x=0)y=0elsey=-1coutx,y;}

用类VC编写的程序

VC程序更接近数学公式。与机器的运算器、寄存器和内存地址无关。高级语言是面向计算过程的,与解题的步骤有关。

42.2 高级程序设计语言实现计算的方式机器只知道根据机器语言指令来执行程序,高级语言程序必须通过翻译变成机器语言程序,这个工作一般由翻译程序自动完成的。把一种语言翻译成另一种语言的程序叫做翻译器(如C++翻成C)。把高级语言程序翻译成机器语言程序有两种做法:编译和解释,相应的翻译程序分别叫做编译器和解释器。52.2.1 编译器工作原理第一步词法分析。一个高级语言程序是编译(程序)器的输入。编译器逐行扫描程序,首先是识别符号串:关键字、字面量、标识符(变量名、数据名)、运算符、注释行、特殊符号(续行、语句结束、数组等)这六类符号,分别归类等待处理。这个过程就是词法分析(LexicalAnalysis)。第二步作语法分析(SyntaxAnalysis)。这时一个语句就作为一串记号(token)流由语法分析器处理。按照语言的文法检查每个语法分析树,判定是否为合乎语法的句子。如果是合法句子就以内部格式把这个语法树保存起来,否则报错。这样直至检查完整个程序。第三步做语义分析(SemanticAnalysis)。对各句子的语法树做检查:运算符两边类型是否相兼容;作哪些类型转换(例如实数向整数赋值要取整);是否控制转移到不该去的地方;是否有重名或者使语义含糊的记号等。如果有错转到出错处理,否则生成中间代码。6第四步中间代码生成.中间代码是向目标码即机器语言的代码过渡的一种编码,其形式尽可能和机器的汇编语言相似,以便下一步的代码生成。中间码不涉及具体机器的操作码和地址码。采用中间码的好处是可以在中间码上作优化。第五步优化。对中间码程序做局部优化和全局优化,使运行更快,占用空间最小。局部优化是合并冗余操作、简化计算,例如x:=0;可用一条“清零”指令替换.全局优化包括改进循环、减少调用次数和快速地址算法等。第六步代码生成。由代码生成器生成目标机器的目标码(或汇编)程序,要作数据分段、选定寄存器等工作,然后生成机器可执行的代码。第七步连接加载:高级语言源程序经编译后得到目标码程序,但它还不能立即装入机器执行,一般情况下它是不够完整的。如程序中用到abs(),sin()这些函数,可直接调用,不需求绝对值、求正弦的程序,已作为目标码存放在机器中。编译后得到的目标模块还需进行连接.连接程序(即Linker)找出需要连接的外部模块并到模块库中找出被调用的模块,调入内存并连接到目标模块上,形成可执行程序。把执行程序加载(Loading)到内存中合适的位置,即可执行。72.2.2高级语言程序的解释执行

对高级语言源程序采取解释执行的方式.解释执行需要有一个解释器(Interpreter),它将源代码逐句读入。先作词法分析,建立内部符号表;再作语法和语义分析,即以中间码建立语法树,并作类型检查。完成检查后把每一语句压入执行堆栈,压入后立即解释执行。操作系统的命令、BASIC、VB、Prolog、LISP、Java、JavaScript、Postscript都是解释执行的,各种应用软件提供的界面语言(一般都很小)多半是解释执行的。解释器不大,工作空间也不大,能根据程序执行情况决定下一步做什么是它的优点,解释执行难于优化、效率较低,是该语言的缺点。编译型语言由于可进行优化(有的编译器可作多次优化),目标码效率很高,是目前软件实现的主要方式。语言编写的源程序,都需要进行编译、连接,才能生成可执行程序。编译时花费时间但程序的执行效率提高。82.3高级程序设计语言的基本特征

高级程序设计语言从20世纪50年代以来己有一千多种,随着软件技术的发展不断地出现新版本,每一个新版本都增加新的机制。下面介绍程序设计语言最基本的特征。2.3.1变量、表达式、赋值用高级语言编程是为了对数据实施计算,将输入的数据经过表达式的计算得到输出数据。参与计算的数据、结果在编程时是不存在的。只能用变量表示它。如己知三角形三边长度求而积:s:=0.5*(a+b+c);area:=sqrt(s*(s-a)*(s-b)*(s-c));其中a,b,c,s,area是变量,0.5是常量,“+”和“*”是运算符,sqrt是平方根函数,它们构成了表达式。“:=”是赋值号。表达式是常量、变量、函数调用或者由它们和运算符组成的序列。表达式中的变量都是有值的.赋值号左端的变量在写程序时可以没值,即使有值,计算执行之后也会被赋成新值。用变量写程序的好处是通用,以上语句不仅可以算出三边长为3、4、5的三角形面积,任何三角形面积都可以算出(只要输入a、b、c的正确值即可)。一个计算只要有了明确的数学表达式(也就是该计算的数学模型)编程是比较容易的.程序中的一条语句对应着计算机的一条命令(用一条或多条指令来实现)。一个赋值语句就是一条赋值命令。92.3.2程序的控制结构程序约定自上向下、自左向右地执行,即顺序地执行语句(或表达式)。但不仅限于此,计算机之所以能自动计算,它能通过判断将程序转到应该执行的地方。人们就是通过巧妙地安排控制转移,使计算机实施算法。1.最基本的程序控制语句无条件转移语句:在汇编语言时代就有了Jump指令使执行跳转,对应的高级语言语句是无条件转移语句:gotoloop;其中loop是跳转到的语句的标号(数字或标识符)。条件转移语句:加上条件判断子句if(E)就是条件转移语句:If(E)gotoloop;其中E是条件(布尔)表达式,求值结果是‘真’、‘假’值。如果为‘真’转移到标号为l的语句,为‘假’则按顺序执行下一条语句。有了这两个语句再加上简单语句(赋值、调用、输入/出),就可以实现程序的任何执行控制。102.结构化程序的控制结构

goto语句相互交织使设计出的程序控制结构成为不可分解的一个整体。尽管算法设计精巧,但牵一发而动全身。程序一大,修改很困难。显式使用goto

语句使得任何写错转移语句标号的小错误都会导致灭项之灾。使程序控制逻辑是结构化的,显式使用goto

语句,程序依然难于阅读。早期的编程语言是语句级的.用简单准语句集合加goto构成复杂的程序控制。然而显式地使用goto语句是极其危险的。这是因为:三种结构化的基本控制结构11出了错易于找出错误并修改易阅读导致易扩充、修改,大程序易于分析。程序控制结构清晰,是它用关键字控制程序块(语句组)。任何控制转移不能进入这些控制块,除非入口。块中转出也不能直接转到程序其他处,只能转到出口。在出/入口增加检查语句就使得程序错误真正局部化。程序块级(语句组)控制采用语句括号使程序逻辑与表示法结构完全一致。可直接编程。程序语言结构化以后,编程对流程图的依赖就很少了。Nassi-Schneldermann提出了结构化流程图(主要取消流线及箭头),因没有直接用类似结构化编程语言的伪代码方便而没有流行起来。结构化控制结构的优点:12无假块条件分支和嵌套if语句

if(E)thenSTendif

if(E1)thenS1elseifE2thenS2…elseSm

endif

无假块条件语句是正规条件语句的简化,很常用。嵌套语句在否定部分用关键字elseif,有的语言用elsif。只有当所有条件均有‘假’时才执行else块。逐个检查m个条件效率很低,有时似无必要。3.结构化编程语言的其他控制结构结构化程序只需三种基本结构重复和嵌套。但为了方便编程,第三代语言派生出许多结构。以下简略说明。(1)条件分支13case语句也叫分情形语句。根据条件变量Z的值单独执行S1,S2…,Sn,执行完Si自动跳到endcase(C语言例外,它要加上break才跳。否则执行Si+1到Sn)。case语句流程图14(2)循环结构do-until和for结构

do-until语句形式是doSuntilE,先执行再判断,若E为‘真’不再循环。正好和先判断再执行的do-while语句是相反的。将它改成do-while结构十分容易。条件取反,先执行一次S块。do-until流程图15for-do语句以控制变量增减值或枚举集合值计数的循环。for-do是do-while的另一种变体结构,其书写格式有多种变体。

for-do流程图16(3)顺序控制gotoloop 多数语言作为历史遗留保留,不提倡使用,Java取消了该语句。break C/C++中用于跳出块到endcase(switch)。continue 仅用于循环,立即结束本次循环,作下次循环。exit 立即跳到末端出口。abort(STOP)强行停止本程序。delayXX 延迟XX时间后继续执行。raise-exception 引发异常,处理异常。执行了raise后跳到exception指明的异常处理段执行,处理后不再返回。在Java、C++中是try-catch-finally语句,把可能出现异常的代码放入try块(它包含catch、finally两种块),通过throw引发,catch捕捉后处理,finally为可选的善后处理。通常把一切影响正常顺序执行的,如调用/返回、前跳、延迟、异常、控制语句都归为顺序控制。常见的有以下语句:172.3.3 数据类型计算机中计算对象(不管是常量、变量)都是有类型的,不能把一个实数和逻辑‘真’值(true)相加。指出数据类型的一个目的就是要避免这类错误的发生。各语言转换函数(inttoreal或realtoint)不尽相同,有的是把类型名作为转换函数名,不兼容的类型,如整数和布尔一般不能转换,但C语言例外。18常用的基本类型int/integer 整型对应为数学中整数real/float/double 实型(浮点类型)对应为数学中实数logical/Boolean 布尔型(逻辑型)只有‘真’、‘假’值char/character 字符型ASCII码的所有可见字符string 字符串类型enum 枚举类型,用户预定义的一串标识符最常见的最基本的数据类型就是纯量类型,程序设计语言提供了下面几种基本数据类型:floatx,y; //x,y是单精度浮点数intiCount,doubledbPert//整型和双精浮点conststringsPASSWORD=”Espresso”//串常量boolfFinished//布尔型变量CommandButtona //对象变量variantmyVar //变体变量符号常量、变量则要先声明类型才能使用。例如VC中可以这样声明:19数组类型

数组的特征是所有元素均为同一类型。charstr[15];

声明了16个元素的数组,每个元素都是字符串类型。因为隐含数组每一元素从0下标开始,声明时只要指出下标值的上界。如果每一元素又是一数组那么就可以得到如矩阵一样的二维数组:doubleMatrix[9][9];是10*10=100元素的方阵,元素类型为双精度浮点数。第一下标是行,第二下标是列。使用时只能一个元素接着一个元素去赋值。Matrix(2,3)=30.23//第3行第4列元素赋以30.23变量代表单个数据值叫纯量变量。如果代表多个(数组)或多种(记录)值就叫它结构型数据的变量。先来说数组:20记录类型

structperson{ charname[15];intage; charsex[8]; chartelnumber[15]; charlable[9];}student[99];相同或不同类型数据组成的结构叫记录.记录型记录了对象的属性信息,记录的各个组成部分,称为记录域,各个域的数据类型可以不相同。下面给出用VC声明的一个例子:21指针类型指针类型是一种很重要的数据类型,但同时也是一种简单却不大好理解的数据类型。在讲述指针之前,首先来看一个例子(采用C语言来描述):

int i; //定义一个整型变量I i=1; //i赋值为1 i=i+1; //表达式计算 计算机语言中的变量代表的只是计算机内存中的一个存储单元。这个单元中存放的内容是变化的,所以把它叫做变量。

每个变量都有一个名字(标识符),对应为存储单元的地址,存储单元的内容为变量的值。引用变量的值时直接把变量名放到用值的地方(赋值语句的两边)。程序运行时按地址存取内容。如果某个变量的值是内存中的地址.这个变量叫指针变量。指针变量示意图22C语言中指针类型,以类型指明符‘*’表示。它所指向的对象是有类型的。

inti,*p;//声明i为整型,P为整型对象的指针charc,*pCh;//声明c为字符型,pCh

为指向字符里对象指针

‘*’放在变量标识符之前,出现在类型标识符之后,指明它所修饰的标识符是指向该类型对象的指针.p是指向整型的指针,*p是p所指向的无名变量的代名词.声明完成后变量p有存储单元但无内容.

C语言中指针类型232.3.4过程及数据传递函数sin的自变量(参数)为x,并指出其函数(返回)值是Double类型.每当程序中出现求正弦时,直接调用该过程,称函数引用,即引用该函数的(返回)值。一个主程序中写三段相似代码的执行情况是一样的,只是省写了两次,多了三次实参和形参匹配(置换)的执行过程。求正弦值的程序被分离开来,可以被多次调用,这种分离出来的部分叫子例程(routine),执行完后依然返回原处。带返回值的叫函数过程,不带返回值的叫子例程过程.简称子程序。在C语言中统称为函数。使用过程可以降低程序复杂性、提高编程效率、使程序结构变得消晰明了。过程(函数)24函数的语法形式类型标识符函数名(形式参数表)形式参数说明{说明部分语句}函数的返回值通过return语句返回。返回值的类型为定义的函数类型,若return语句中表达式类型与函数类型不一致,则转换为函数类型。无返回值的函数,定义为void类型。若无参数,写void是被初始化的内部变量,寿命和可见性仅限于函数内部若不说明类型,一律自动按整型处理,若为void即为无返回C语言函数的定义及调用25函数有两类库函数I/O,分类,转换,诊断,目标控制,图形,接口,进程控制,处理,数学,文本窗口,内存,杂务,时间和日期用户自定义函数从使用角度C语言中函数的作用,就与其它程序中的子程序一样,以模块的形式出现,而且允许一个函数被多次调用,但不允许自己调函数自己本身。26函数有两类函数形式角度有参函数,定义:类型标识符,函数名(形式参数分配表列)形参说明{说明部分语句 }无参函数,定义:类型标识符,函数名(){说明部分语句}27函数的调用调用前先说明函数原型:在调用函数的说明部分按如下形式说明:类型标识符被调用函数名(含类型说明的形参表)调用形式函数名(实参)嵌套调用C语言不允许嵌套定义,但可以嵌套调用递归调用函数直接或间接调用自身计算机软件技术基础28/**例***函数的定义和调用,两数相加**************/main(){floatadd(floatx,floaty);floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}29/****例*******库函数的调用***********************//*Thisprogramusesthetextwindowsfunctionsto*//*demonstratetheuseofthelibraryfunction*/#include"stdio.h"#include<stdlib.h>#include<conio.h>#include<graph.h>main(){inti,j;charbuffer[80];_clearscreen(_GCLEARSCREEN);_setvideomode(_TEXTC80);

clearthescreensetthedisplayascolorandtextmodel30while(!kbhit()){for(i=0;i<=15;i++){_settextcolor(i);for(j=48;j<=90;j++){/*sprintfisafunctionwhichtransfertheascii*//*value(j)tocharformatandthenstoreintothe*//*arraynamedasbufferinthisprogram*/sprintf(buffer,"%c",j);_outtext(buffer);}}}}16kindsoftextcolorshowtheasciivaluefrom48to90,i.e.form0~9,:;<=>?@,A~Z31/***例***函数返回值为定义的函数类型,*//*由于已定义为int型,输入实数就出错**/main(){inta,b,c,d;floate;printf("Pleaseinputthreedatas\n");scanf("%d,%d,%d",&a,&b,&c);d=max(a,max(b,c));e=max(a,max(b,c));printf("Thelargestdatainputedis%d\n",d);printf("Thelargestdatainputedis%f\n",e);}max(x,y)intx,y;{intz;z=x>y?x:y;return(z);}322.3.5变量的生命期和Static变量

程序中变量生命期随其声明所在程序块而异。程序一执行完它的所有数据变量均失去意义,它所在的存储区则可另行分配其他程序装入执行。因此,主程序中变量的生命期比过程中变量生命期要长,内嵌的子过程其变量生命期更短,最长的是文件变量,它放入磁盘,程序没有了它依然存在,所以按“生命期”的长短有:持久变量 除非人为销毁全局变量 出了程序便失去定义静态局部变量 见下文自动变量(局部变量) 出了所在块便失去定义循环控制变量 出了循环便失去定义常常有一种需要,一个局部变量在它所在的局部程序块消失后依然保留其值,又不希望它是全局变量被该局部块以外的程序引用。例如伪随机数发生器,为使伪随机数每次调用新值,则上次数是生成下次数的种子,如不希望其他操作影响这个发生器,此时用Static(静态)变量更方便。332.3.6 输入/输出

程序的输入/输出分作两大类:一类是程序之间以文件形式进行数据传递;另一类是人一机交互,把人们可识别的形式(字符串、数)按一定格式输入到程序变量中。输出则相反,按用户要求的格式显示或打印。这一般由高级程序设计语言以过程调用(标准过程)的形式实现。过程在高级语言内部通过调用操作系统的系统调用完成。Scanf(“%d%d%d,&n1,&n2,&n3)/*%d表示读入一个十进制整数,&n1表示读到n1的存储单元中。*/Printf(“DF,CF=%12.7%12.7f\n”,df,cf)输出:DF,CF=__35.2272410___0.0000000C语言的输出语句功能很强且具有计算功能;输出变量处直接写表达式,可以输出其结果值。例如:Printf(“DF,CF=%12.7f%12.7f\n”,a+b*df,3.0/7.0)C语言把格式合并到输入(scanf)和输出(printf)函数中,这组函数在终端上功能很强,一般形式是输入/出一个串,串中特殊符号“%”批示格式,出现几次“%”串后跟几个待输入/出的变元。例如:342.4面向对象程序设计语言的基本特征面向对象语言是过程语言的进一步发展,面向对象程序设计(90年代-现在)(ObjectOrientedProgramming—OOP)模块:(对象)类---属性(数据)和方法(操作或功能)组成代表语言:Smalltalk,C++,Java程序设计范式=对象+消息人眼睛,鼻子..,直立行走…吃饭、走路、笑、工作…汽车发动机,轮子…陆地行进、变速、变向…2.4.1面向对象程序设计概述

351、面向对象和面向过程程序设计面向过程程序设计:功能抽象(核心)、自顶向下设计、逐步求精(基本思想)面向对象程序设计:对象的抽象(类)和封装(核心)、类的认定和设计以及建立在类上的类组织关系。362、面向过程程序设计举例学生注册管理系统的设计过程对当前系统进行任务设计(模块化)任务分解(子任务模块化)子任务在分解,…….,一直到原子任务算法实现原子任务。373、面向对象程序设计举例学生注册管理系统的设计过程学生类的认定(学生信息属性、学生信息的操作)学生类的设计(数据成员、函数成员)应用程序的实现classstudent{

private:charname[20];intage;boolsex;………

public:search();edit();insert();del();save();……};voidmain(){studentsts[87];sts[0].edit();…}38类与抽象数据类型(封装和接口)C/S模式和消息传递继承多态(重载和虚函数)模板(*)C++的异常处理(*)组件技术(*)4、面向对象程序设计基本概念392.4.2类与抽象数据类型暴露接口、隐藏实现细节用户没有必要知道实现细节开发者需要修正开发过程中留下的bug,以及升级的需要C++中使用关键字private对信息进行隐藏,public公开类的接口信息隐藏封装(encapsulation)就是把每个对象的数据(属性)和操作(行为)包装在一个类中,并尽可能隐藏对象的内部细节。一般限制直接访问对象的属性,而应通过操作接口访问,这样使程序中模块之间关系更简单、数据更安全。对程序的修改也仅限于类的内部,使得由于修改程序所带来的影响局部化。40类的组成=数据成员(属性)+函数成员(方法)将数据成员和函数成员结合成一个有机整体的过程,就是封装封装的有机整体就是抽象数据类型,C++中称之为类面向对象的方法进行分析设计时首先需要确定抽象数据类型,也就是类的认定。换一个角度,抽象数据类型也是面向对象方法中对事物的一个抽象概括,如上面的classStudent,该类就是对学生信息的一个概括。类的具体实例称为对象,对象是对抽象数据类型的一个具体化,如studentzhangsan;可以生成一个具体的学生对象zhangsan.[注]在面向对象程序设计中,int类型也可以被看成抽象数据类型。inta;就说明了一个整型对象a.41封装和面向对象程序422.4.3C/S模式与消息使用面向对象方式设计和实现的程序具有与众不同的编程模式。在面向对象程序中,类和对象表现为服务器,使用类和对象的模块(如C++中的函数)表现为客户,客户通过特殊的方式请求服务,这个方式就是消息(消息可以包含参数)。客户/服务器模式消息(message)相当于过程语言的过程调用,可带实在参数:方法(method)则相当于过程定义,带参数也是形式参数,一定要有方法体(执行语句集).面向对象中只有消息一方法,没有过程调用一过程体的说法。举例:zhangsan.insert(s);可以把zhangsan这个对象的信息添加到一个对象数组中。432.4.4继承性继承性:是自动地共享类、子类和对象中的方法和数据的机制,它是面向对象技术所独有的。继承性支持代码重用。继承的传递性:如果C1继承C2,C2继承C3,则C1(间接)继承C3。多重继承:一个子类具有多个超类时,它可以继承它们的结构和方法。举例:classPerson{charIDcard[18];charname[20];………..};classStudent:publicPerson{charstudentcode[8];chardeparment[15];……………};Student类继承了Person类的属性和方法。44类继承的实例:假设某公司的雇员分为两类:计时雇员和月薪雇员,而他们的工资计算方式是不同的。比如月薪员工有医疗保险而计时员工却没有。月薪员工又分为两类:专业人员和项目经理。类似地,他们的工资计算方式也是不同的。比如项目经理可以有项目提成而专业人员则没有。显然,首先要定义一个雇员类,它记录了所有雇员都拥有的属性和方法。然后再定义一个计时雇员类,它继承了雇员类的属性和方法,并有自己专有的属性和方法,同样,月薪员工继承了雇员类的属性和方法并有自己的专有特性。当然,根据需要,可以再定义两个类:专业人员类和项目经理类,它们都是月薪员工类的子类。经过分析,可得到图所示的类继承图.雇员信息继承关系45每个类的属性和方法如下:462.4.5多态性多态性:(polymorphism)是指允许不同类的对象对同一消息作出的响应不相同。即允许把同一消息发送给超类及其子类不同对象的能力。一般类中定义的属性或行为,被特殊类继承后,可以具有不同的数据类型或者是表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义多态性作用:允许超类及各子类的对象各自以不同的方法响应同一消息,即所谓的“同一接口,多种方法”。在实际使用的时候有2种方式:编译时的多态性——静态连编:编译时就将对象和方法的代码连接起来,其优点是执行速度快,所需内存小,缺点是灵活性差;运行时的多态性——动态连编:运行时才按照具体的数据类型和参量数来确定将哪个方法同对象连接起来,其优点是具有相当大的灵活性,有利于建立类库,便于重用和扩充。47多态性举例

voidEmployee::Print_List(){ Employee*Scan; for(Scan=Link;Scan!=NULL;Scan=Scan->Link) Print_Empl();};voidManager::Print_List(){ cout<<”\n\nManager:\n”;//打印经理题头

Print_Empl();//打印经理记录数据

cout<<”\nEmployeeSupervised:\n”; Employee::Print_List();//打印所辖雇员表};注意到上述类中有许多方法是同名的,但是,由于它们所属类不同,编译器不会弄混。例如Print_List方法:这时p一>Print_List()就是多态的,有时是父类Employee实例的数据,有时是子类Manager实例数据,因为面向对象允许子类实例就是父类实例。*p所代表的既可以是雇员也可以是经理,这种多态性的好处是不因雇员经理数量多少而更改程序.48总之:通过使用面向对象程序设计的抽象、封装、继承和多态性等机制,程序更易于维护、更新和升级。利用代码可重用性,程序员可以在程序中大量使用成熟的类库,从而缩短程序的开发时间,提高程序员的工作效率和程序的可靠性。492.5网络计算机时代的编程语言网络时代的软件部署:面向对象语言和技术是分布式客户/服务器计算时代的产物。客户站点即客户对象,服务器站点就是服务器对象,它们相互发消息,共同协作完成应用。它们可以建立在局域网、广域网上,把每个对象安装到各个站点上。网络时代的软件开发:分布式客户/服务器计算时代,服务器提供的程序往往是事先编好了的.客户端只要编一些“使用”服务器提供的“服务”(程序运行后的结果)的简单对象(程序),就完成了应用开发。只有不存在这种服务时才去开发服务器端的程序。再者,开发客户端和服务器端程序也不是像单主机计算时代那样,基本上是从第一句写到最后一句,而是在系统提供的控件、构件(系统类)的基础上,选定参数生成实例对象。网络时代的软件应用:Internet把全世界计算资源联接起来,世界上有无数资源,如何找到它是关键问题。找到之后,只需订阅(租赁),到时候发消息,它回复你计算结果。这如同打电话付费一样。“软件就是服务”,可以想象,应用程序使用发生了重大变化。网络时代软件开发专业的分工:软件开发多限于应用服务提供商(ASP),他们可以做得十分完关。在自己选定的业务范田内,把功能件做成标准的构件.并由他们自己升级维护:使用者只要有一个连接各种服务的小程序,开发者的工作重心是问题分析、建立计算模型、建立计算框架、连接上选定的构件(填满框架)。网络计算:简介502.5.1HTML和XML

HTML:网络计算在网站之间传递的是主页。主页按http协议传递,页面格式是HTML(超文本标记语言)。每个站点上都有浏览器可以识别以约定标签标记过的正文,标签成对形如:<tag>正文</tag>,标签层层嵌套,如一本书先章、节、段落后复合语句、简单语句。经过标记之后一段正文信息就成为结构化数据。传到另一站点后,浏览器读出这段正文,就原封不动地转移了,即使是图文并茂的多媒体文档也照传无误。XML:但HTML约定的60多个标签表达能力有限。它只知道传递的内容是符号串和二进制块。于是,人们发展了可以由用户定义标签的XML可扩展的置标语言)语言,从而可描述页面的数据内容。页面格式由XSL或CSS子语言描述.XML可描述数据关系比较复杂的数据结构,如图、表、树、索引文件和数据库中定义的数据关系。在数据库服务器站点上根据不同客户要求,从库中取出数据放入XML文档,传送到不同站点的客户机上,各站点上的客户就可以按标签理解并使用它们。脚本语言:尽管HTML和XML在当今万维网上传送信息(写主页)是不可或缺的工具,但它们不是传统意义上的编程语言.它们只能描述、传递数据,不能表达对这些数据的操作.也就是客户接到数据库中的数据后还要自己编写程序完成数据处理。为此,发展了各种脚本语言,脚本语言随同Web页面一起传送到另一站点,该站点的浏览器叮以立即执行。512.5.2脚本语言有常规的基本类型和算术逻辑运算,有弱化的可变类型;有变量、表达式、赋值语句;有if--then_else和迭代控制(do_while、for_do);有函数和过程调用机制;有封装和可见性控制(public、private):与可视界面、键盘、鼠标联系紧密。借助可视界面工具编程。而可视界面本身是用面向对象实现的。例如,窗体就是类,在其中定义属性(全局变量)和方法或事件,运行时给出值就是实例对象。支持事件驱动,用户或其他对象可随机驱动;一般都有到大语言的接口:有限定的背景(应用领域)。例如,支持一般小型Windows应用程序,如VB(VBScript):支持数据库应用.如Delphi、PowerBuilder:支持网络客户端应用的,如JavaScript;支持打印控制的,如PostScript、PCL。脚本语言(ScriptLanguage)是小型的编程语言.它是依附于某一特定环境下的编程语言,它们的特点是:脚本语言的语法特征小巧而简单多采用解释执行源代码。基于对象而不是面向对象(只有语言内定义的简单继承,没有用户定义的继承,甚至没有显式的类机制)。522.5.3网络编程语言为了在网络各结点上共同完成协作计算,为了程序能随主页到处传送,迫切需要一个全新的与平台无关的编程语育。因为已有的编程语言和本机操作系统联系太深,编译后的目标码就是所在机器的目标码,特别是编译后优化代码完全要取决于目标码指令系统不同的机器。同一源代码程序在两个机器上生成的目标码程序不同早有定论。1996年由Sun公司研制的Java可以做到平台无关.以下结合Java语言介绍网络编程语言的特点。Java称为纯面向对象语言,它在C++成功的基础上,进行了创新改进,采取“改造”C++的策略,基本是C++哪里不合适就改哪里.53Java虚拟机(JVM)的建立.所谓虚拟机就是不管你操作系统的平台是什么,建立一个解释Java代码的执行系统(RuntimeSystem),正确地执行。本机操作系统是实在地机器执行系统.是实现虚拟机的手段。每台机器若都能实现虚拟机的功能,则Java的平台无关性就得到第一层的保证。第二层,执行的代码必须统一。Java源代码是统一的,但编程可执行代码就不一定了。如不同类型字长不统一,有的整型数32位,有的64、128位。再如复合操作码本可简化操作.但不同系统复合习惯不同,带来微小差别……所以,Java采用泛代码(Unicode)的中间码技术。泛代码也叫字节码(bytecode),操作码和最小字长都是16位的双字节。这样,Java源代码变为所有虚拟机都可执行的中间码,保证大家对Java源程序理解一样,执行结构一样。其示意图如下所示。平台无关54JVM上执行Java程序的过程

55编译----解释执行Java代码是解释执行的,这是指它的中间代码。从Java源代码要经过编译器Javac翻译,这不妨碍源程序在类库支持下派生类,因为类支持也是中间码。Java虚拟机首先要装入类,检查代码(安全)后解释执行。为了提高解释效率,发展了即时编译技术(Just-in-time)。即对于多次重复或耗时较长的段落编译后,作为模块暂存,下次遇到则直接执行目标码。即时编译技术目前还在向智能化方向发展。更为纯粹的面向对象语言Java无全程变量,无主函数main(),从而函数全改方法。类中的方法均缺省为‘虚’函数,更加支持动态加载。取消C++中的模板而用动态的实例类型化Object类。为了封装更干净,取消了C++的头文件和C的预处理。一个或多个功能相关的类组成为包(package,即名字空间),从而为构件规范化提供了基础。支持多线程多线程即共享资源的并行执行的‘子进程’。可以提高图形用户界面的交互性能。C++中多线程是由程序员控制锁来完成的。Java的Java.lang包提供Thread类大为简化了多线程就用程序的开发。线程概念后面介绍。56方法型构(接口)和方法体可以显式分开在C++中己经实现,方便了编程和修改。只要接口(及其所带参数)不变,方法体可随意修改而不影响该方法的程序。然而,把接口作为类型有其更深远的意义。接口类是一组方法型构而无方法体,除有常量外没有属性。接口类和普通类一样可以嵌套和继承,且可以多继承,可以声明接口实例。接口类由普通类实现(写出各方法的体)。比C++的强类型更强,要求显示方法声明,编译器可以发现错误消息。取消了指针,杜绝了内存的非法访问。增设自动无用单元回收集,减少内存分配带来的问题。特

温馨提示

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

评论

0/150

提交评论