收藏 分享(赏)

第15章-平台无关语言.ppt

上传人:无敌 文档编号:1114113 上传时间:2018-06-12 格式:PPT 页数:53 大小:365.02KB
下载 相关 举报
第15章-平台无关语言.ppt_第1页
第1页 / 共53页
第15章-平台无关语言.ppt_第2页
第2页 / 共53页
第15章-平台无关语言.ppt_第3页
第3页 / 共53页
第15章-平台无关语言.ppt_第4页
第4页 / 共53页
第15章-平台无关语言.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、第09章 平台无关语言,使用平台无关语言的需求脚本语言Java语言,9.1 使用平台无关语言的需求,高级程序设计语言本应是平台无关的在高级语言中,数据、控制流等都是抽象的。源程序经过编译生成的目标码是与本地机紧密相关的。表现在:基本类型定义与及其字长相关;各机指令集不一,操作效果相当,实现过程有微小的差别;同一语言在相同编译和执行环境下,同一程序执行速度不一(硬件差异,优化次数);已采用增加可移植手段。设预定义环境(包)Ada;分出头文件 - 宏 - 编译文件C;,单主机时代,需要解决的主要问题是高级语言程序可移植性,以减少应用程序的开发费用,缩短开发周期。这时对平台无关性的要求不是十分迫切。

2、,局域网时代,需要在局域网内实现信息共享,有协作计算需求。网络协议栈实现了数据的平台无关;以文件共享形式实现;客户/服务器模式,程序可以不共享;只要局域网内使用相同或相互兼容的平台,也可以实现程序的共享。,Internet时代,对资源共享提出了新的要求:局域网的规模和结构是可控制的;但是,没有任何个人和机构可以控制Internet的构成。 Internet/Intranet包含各种类型计算机,是资源共享的平台。不论用户使用的是什么类型的计算机和操作系统,都可以浏览网络上的信息,使用网络中的资源。WWW(World Wide Web)是Internet上最广泛的信息发布/浏览方式。与FTP等以往

3、的方式相比较,WWW具有较强的动态性和交互性,需要完成复杂的应用(如电子商务等)因此,共享资源不但包括数据,也应包括程序。这就需要一种平台无关的语言。激烈的竞争迫使软件生产者不断降低开发成本,缩短开发周期。平台无关语言使开发者不需要为一个软件开发多个操作系统的版本,减少了开发费用和时间。,平台无关语言的实现:传送源代码 将源代码传送到目标机,先经过编译,生成目标机代码,再执行。前提是必须有不同平台的编译器,这种情况往往在编译时缺乏源代码原有的环境信息(全程量),且只能先编译存入目标码再运行。局域网时代服务器已经做过了。要实时运行只能是解释(也要求有完整的信息)型语言。传送目标代码 只有在相同或

4、相互兼容的平台之间才可以实现。如在Windows NT/9x组成的局域网中,可以在一台机器上调用执行其它机器上的应用程序。传送中间代码 中间代码由源代码经过编译生成。中间代码经过优化。中间代码传送到目标机上由解释器解释执行。Java语言使用的是这种方式。,9.2 脚本语言,脚本语言的概述:描述性语言(4GL);直接解释执行;操作系统界面语言的扩大泛shell;辅助开发(不是设计,但引用内部过程、函数、对象);,常见的脚本语言有:页面描述类:TELEX、Postscript、HTML、VPML;场景描述类:JavaScript、VBScript/ActiveX脚本、LotusScript(Lot

5、us公司的Notes群件产品中的脚本语言),9.2.1 HTML(Hyper-Text Markup Language),用于描述Web主页,为所有OS上的浏览器所识;设计编排多媒体主页(包括正文字体、图形、动画);以超文本方式使用,可以链接任何网址上的各种多媒体文档,包括普通正文、HTML文档、GIF图形、TIFF图形;XBM位图、JPEG图形、Postscript文件、AIFF声音、AU声音、QuickTime影片、MPEG影片;,标签。以尖括号括出的成对或单个标签给出页面编排信息。文档编排、引用描述:一个HTML文档文档简介信息文档内容标题链接名第i层编排此前为一段由此换行产生一个视窗宽

6、度的水平分行符,字符格式逻辑描述:已定义单词重点词书或电影主题一段源代码由此键入状态信息特别强调物理描述:此处黑体此处斜体此处打字机体,内联图形其它标签列表:表项表项 (无号) (有号) 表项测试此表表项 (定义表)预定义格式正文:此段文本格式已定作者地址: ,扩展引用: 嵌入Java:嵌入其它描述语言: ,9.2.2 JavaScript语言,HTML语言是静态的,动态性和交互性不强。于是,Netscape公司开发了JavaScript(与之对应是Microsoft公司的VBScript),扩充HTML文档的功能。Javascript嵌入在HTML文本中,由浏览器解释执行。,以下是一个HTM

7、L文本中嵌入JavaScript的例子:function welcome() var s = “Hello world!”; document.write(s); /document是HTML文档对象 /函数的定义 welcome() / 函数的调用,这个例子将在浏览器中显示“ Hello world!”字符串。“document”是HTML文档对象,使用它的write方法可以在文档中写入文本。,JavaScript有以下特点:与C、Java相似的语法,如常规的变量、表达式、函数和控制语句等。弱类型。有数字、布尔、字符串和空值类型。变量的确切类型取决于所赋给它数据的类型。基于对象。把浏览器和H

8、TML文档中的元素看作对象,对象有各自的属性。例如,浏览器对象是已被预定义的Navigator;HTML页面是document对象。程序员可以使用的对象及其属性是已经被浏览器定义和生成的,不能定义新的类和对象。因此,是基于对象而不是面向对象的。事件驱动。定义了一组系统、鼠标事件。可以通过事件激活定义好的函数。在客户端使用的小语言,一个统计HTML文档中超链接个数的程序: for(var i=0; i); document.write(There are +document.links.length+ links.);其中,document是整个HTML页面对象;links是document对象

9、中的超链接对象数组,length、href又是links的属性,分别表示链接的数目、链接的内容,该HTML在浏览器中的显示如下图所示:,9.3 Java语言9.3.1 Java是C+的网络应用的扩充和改造,保留了高级语言的主要机制与C+基本相同的字符集、标识符、关键字、运算符、特殊符号比C+更加强化类型。增加了布尔类型,只保留数组类型;使用真正的类型转换(C+中的类型转换是“伪”的,目的是为了通过编译器的检查;Java中的类型转换在运行时真正发生,如果不能转换,系统会抛出异常)保留声明、作用域、变量、表达式、语句、三种结构化控制;保留并增强C+的异常;,与C+相似的面向对象机制:类作为特殊类型

10、、构造函数、初始化序列、实例变量、this/super、方法的覆盖与重载、成员可见性。取消了C+不利于网络应用的机制:指针。以对象引用代替指针;取消头文件和预处理器(宏与机器相关);C+中原有冗余:struct、union都被类代替;不支持模板,动态束定功能可实现;取消typedef;不支持运算符重载;,9.3.2 平台无关性的解决,编译解释执行。Java语言实现平台无关的关键是使用了“编译-解释”执行方式。Java源代码经过编译,称为Java字节代码(byte-code)。Java虚拟机(VM)是字节代码的解释器。JavaVM是用软件构造的一个虚拟计算机,它由虚拟的寄存器、内存、堆栈等;字节

11、代码就是这台虚拟计算机的指令。所有操作系统上的JavaVM执行一致的指令,这样,就屏蔽了各个平台之间的差异(如下图所示)。,Java虚拟机是平台无关性的关键,在不同的操作系统上有不同的Java虚拟机,向上有一致的接口(虚拟机的指令字节代码),向下针对不同的操作系统有不同的实现方式。,即时编译(JIT: Just-in-Time Compile)。使用即时编译是为了提高Java程序的执行效率,是对Java解释器的改进。即时编译在虚拟机解释执行Java字节代码时发生。当虚拟机第一次调用某个方法时,不再直接解释这个方法的字节代码,而是用即时编译器将这个方法的字节代码编译成为本机目标代码,然后执行这些

12、目标代码。即时编译不是将整个类的字节代码进行一次性编译,而是只编译正在执行的函数,“边执行,边编译”。,小程序(applet)的传递运行方式小程序是可以在Web浏览器中执行的Java程序;Web浏览器中有一个Java虚拟机,和浏览器一起构成小程序的运行环境;浏览器根据HTML文档中的标志,从指定的URL下载小程序的类字节码(.class文件),装入到Java虚拟机中运行;小程序的出现提高了Web页面的交互性和动态性,使浏览器能够完成更加复杂的应用。Java虚拟机有内置的类装入机制,从文件系统或网络中下载类代码,然后在虚拟机中运行。浏览器下载运行小程序只是一个特例,这种机制可以被所有Java应用

13、程序使用。,9.3.3 Java为应用增加的新特性,两层封装:包类“包”是一组功能相近或联系紧密的类的集合,同一个包中的类之间有比较大的访问权限。包是一种对语言进行扩充的机制。Java的核心类库主要由以下几个包组成:java.lang - 基本类库java.io - 读、写流,文件,管道 - 网络java.awt - 界面、窗口,java.applet - 小程序类java.util - 通用工具:向量表、哈希表、栈“类”与C+的基本相同。Java只有单继承,类库呈树状结构,所有类都是java.lang.Object类的子类。,增加了接口(interface)的机制。接口是一种特殊的类,在接口

14、中只有函数的声明,而没有函数的具体定义(与C+的纯虚类相似)。接口可以继承,但不能直接由接口生成对象;以类实现(implements)接口,即在类中定义所有接口中声明的函数。我们可以把一个接口看成某种功能的规定,实现了接口,就是实现了某种功能。类的继承和接口的实现是多态的基础。,以接口实现多态。接口将函数的声明和实现分离,允许几个类同时享有一个接口。调用者不需要了解接口的具体实现,以统一的方式使用这些类的对象。下面是一个简单的例子:interface Drawer public void draw();/ 定义接口class Circular implements Drawer . . . p

15、ublic void draw()画一个圆; / 类Circular实现了Drawer接口,class Rectangle implements Drawer . . . public void draw()画一个矩形; / 类Rectangle实现了Drawer接口class User void paint(Drawer drawer)drawer.draw(); . . .,public static void main() Circular c = new Circular(); Rectangle r = new Rectangle(); User user = new User();

16、 user.paint(c);/ 画圆 user.paint(r);/ 画方 / End of class Useruser对象的paint方法使用统一的方式调用对象c和r的draw方法,产生不同的结果。,接口实现多态示意图:,以接口实现多继承。一个类可以实现多个接口,间接实现多继承,同时不影响类的继承结构。,以synchronized控制模块的同步Java使用监控器(Monitor)作为线程同步的机制。每一个对象都有一个监控器与之相对应。可以用synchronized关键字请求得到某个对象的监控器。在任何时刻,只能有一个线程可以拥有某个对象的监控器。如果有多个线程申请某个对象的监控器,系统会

17、阻塞这些线程。如果监控器的使用者释放了监控器的拥有权,系统就会唤醒某个申请该监控器的阻塞线程。,增加了修饰符final:变量或函数不能被重新赋值或定义。final变量就是常量;final方法是不能被子类覆盖的方法native:本地方法声明,其定义放在本地库中abstract:抽象方法/类。抽象方法是只有声明而没有定义的方法;含有抽象方法的类必须声明为抽象类transient:被声明为transient的变量不能在网络中传递,增强对象性所有的基本数据类型都有与之对应的类:int java.lang.Integershort java.lang.Shortlong java.lang.Longch

18、ar java.lang.Characterbyte java.lang.Bytefloat java.lang.Floatdouble java.lang.Doubleboolean java.lang.Boolean,数组也是一种对象。用new语句创建,且有length属性;没有独立存在的全局变量、函数。程序完全由对象和类组成,甚至入口函数main也必须从属于某个类;对象引用。所有非基本数据类型变量都是对象的引用。与指针相比,引用只能访问对象,不能访问内存地址。比较 MyClass a; 这个声明语句:在C+中将生成一个对象,名为a在Java中只有一个对象的引用a,它不指向任何对象,只有再

19、通过a = new MyClass()才能创建一个对象,再比较 MyClass myObject;/Java还要执行myObject = new MyClass(); myObject = otherObject; 在C+中,myObject始终指向声明时分配的存储区,赋值语句的效果只是将otherObject的值拷贝给myObject对象在Java中,myObject和otherObject将成为同一个对象的引用,如下图所示。,支持多线程编程线程的状态初始态:线程对象被创建但没有被运行时的状态;运行态:线程对象被启动,进入CPU的调度队列,开始执行另外的运行线索;阻塞态:线程对象由于某种原因

20、,不能继续执行,CPU不再为它分配时间片。但是,这时的线程仍然是有生命的,一旦条件满足,它能够再次进入运行态,继续执行剩余的任务;死亡态:线程执行完任务,或者被强行结束。进入死亡态后,该线程不能再次返回运行态。,Java线程状态的转化:,Java的线程也是对象,由java.lang.Thread类继承而来。Thread类中有run方法,子类线程覆盖这个方法,将需要执行的语句填入run方法中。这样,当该线程被启动时,它会自动执行run方法中的语句。,线程原语。java.lang.Thread类中有如下方法:start / stop:启动和停止线程suspend / resume:悬挂和恢复线程s

21、leep:使线程睡眠join:等待其它线程的停止interrupt:唤醒被阻塞的或是睡眠的线程yield:让出CPU时间,使其它线程执行,wait / notify (等待-唤醒)原语wait和notify方法是所有Java对象父类:java.lang.Object类的方法。当一个线程拥有一个对象的监控器(通过synchronized关键字)时,它可以调用该对象的wait或notify方法。调用wait方法,该线程将放弃该对象的监控器,并且被阻塞,直到其它线程调用了该对象的notify方法唤醒它为止。调用notify方法,该线程将唤醒某个由于等待(调用了wait方法)而被阻塞的线程,将该对象的

22、监控器交给它,使其恢复执行。,以下是利用Java实现的生产者-消费者问题:import java.util.*;public class CPVector pool; /Vector是可以存储任何对象的表.这里 / 当作产品池.int product = 0;public static int EMPTY = 0;public static int FULL = 25; public static void main(String args)CP cp = new CP();Consumer consumer = new Consumer(cp);Producer producer = new

23、 Producer(cp);consumer.start();/启动线程,使其运行它的run函数producer.start();,public CP()pool = new Vector();/CP类的构造函数.public synchronized void produce()try if(pool.size() = FULL)pool.wait(); product+; /produce a product. pool.addElement(new Integer(product);/put the product into the pool. System.out.println(Pr

24、oduce: + product); if(pool.size() = EMPTY + 1)pool.notify();catch(InterruptedException e),public synchronized void consume()try int i = pool.size(); if(i = EMPTY)pool.wait(); System.out.println(Consume: + pool.firstElement().toString(); pool.removeElementAt(0); if(pool.size() = FULL - 1)pool.notify(

25、);catch(InterruptedException e) /End of class CP.CP类以监控器的方式来管理产品池。它封装了数据对象产品池,和操纵该对象的方法生产(produce)和消费(consume)方法,并且通过Java的同步机制对这些方法的并发性进行控制。,以下是消费者类Consumerclass Consumer extends ThreadCP cp;public Consumer(CP cp)super();this.cp = cp;public void run()/线程的执行函数while(true) cp.consume();/调用监控器的consume方法

26、 Thread.sleep(1000);/模拟做其它工作的时间 / End of class Consumer,以下是生产者类Producerclass Producer extends ThreadCP cp;public Producer(CP cp)super();this.cp = cp;/ 构造函数public void run()while(true) cp.produce();/调用监控器的produce方法 Thread.sleep(200);/模拟做其它工作的时间,线程通信有以下几种方式:共享对象管道流异地线程之间可以通过socket或RMI进行通信以下是一个利用管道流(Pi

27、pedStream)进行线程之间通信的例子。,import java.io.*;public class CommThreadspublic static void main(String args)/ 生成一个单向管道流PipedInputStream in = new PipedInputStream();PipedOutputStream out = new PipedOutputStream(in);Thread sender = new Sender(out);Thread receiver = new Receiver(in);sender.start(); / 启动发送者线程re

28、ceiver.start();/ 启动接收者线程,class Receiver extends ThreadPipedInputStream in;public Receiver(PipedInputStream in)super();this.in = in;/ 得到管道流对象public void run()StringBuffer sBuffer = new StringBuffer();int b = 0;while(b != -1)/如果b=-1,表明已经读完 b = in.read();/从管道中读取信息 if(b != -1) sBuffer.append(char)b);Sys

29、tem.out.println(Receiver: + sBuffer.toString();/ 输出得到的消息,class Sender extends ThreadPipedOutputStream out;public Sender(PipedOutputStream out)super();this.out = out;/ 得到管道流对象public void run()String sMessage = HelloWorld!;/ 发送的消息是“HelloWorld!”。byte bMessage = sMessage.getBytes();/ 将消息转化成字节流out.write(

30、bMessage, 0, bMessage.length);out.flush();/ 发送消息,在这个例子中,通过java.io包提供的PipedInputStream和PipedOutputStream为两个线程创建了一个单向管道。Sender和Receiver线程可以通过这个管道传递消息。如果管道流建立在socket之上,线程之间就可以远程通信。,9.4 小结,Java的提出是以网络计算环境的发展为基础的,它不但是一种编程语言,而且是一个以Internet/Intranet为基础的网络计算平台。Java着重解决网络应用对软件提出的新要求:平台无关性、安全性、健壮性等,兼有简单、面向对象、

31、分布式、多线程等特点,成为网络时代的编程语言。,Java与JavaScript语言的区别Java语言是一种高级程序设计语言,有完整而严格的定义,源代码需要经过编译。不但可以编写浏览器中运行的小程序(applet),而且可以编写大型的应用程序。Java语言也是一种面向对象语言,继承、封装和多态特性明显。程序员可以扩展已有的类库,生成自己需要的模块。JavaScript是一种脚本语言,嵌入在HTML文本中,由浏览器解释执行。它基于对象,只能应用在浏览器中,而且只能使用浏览器中已有的对象、构件,实质上是对浏览器中各种构件(主要是图形元素)的简单操纵。JavaScript是对静态HTML文本的扩充,使Web页面的交互性和动态性都大为增强。“JavaScript(客户端)+CGI(服务器端)”直到目前都是一种广泛使用的模式。但是,面对Web应用的复杂化,JavaScript已经显得力不从心了。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报