第15章平台无关语言_第1页
第15章平台无关语言_第2页
第15章平台无关语言_第3页
第15章平台无关语言_第4页
第15章平台无关语言_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

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

5、类:JavaScript、VBScript/ActiveX脚本、LotusScript(Lotus公司的Notes群件产品中的脚本语言).9.2.1 HTML(Hyper-Text Markup Language) 用于描述Web主页,为所有OS上的浏览器所识; 设计编排多媒体主页(包括正文字体、图形、动画); 以超文本方式使用,可以链接任何网址上的各种多媒体文档,包括普通正文、HTML文档、GIF图形、TIFF图形;XBM位图、JPEG图形、Postscript文件、AIFF声音、AU声音、QuickTime影片、MPEG影片;. 标签。以尖括号括出的成对或单个标签给出页面编排信息。 文档编

6、排、引用描述:一个HTML文档文档简介信息文档内容标题链接名第i层编排此前为一段由此换行产生一个视窗宽度的水平分行符. 字符格式 逻辑描述:已定义单词重点词书或电影主题一段源代码由此键入状态信息特别强调 物理描述:此处黑体此处斜体此处打字机体. 内联图形 其它标签 列表:表项表项 (无号) (有号) 表项测试此表表项 (定义表) 预定义格式正文:此段文本格式已定 作者地址: . 扩展引用: 嵌入Java: 嵌入其它描述语言: .9.2.2 JavaScript语言 HTML语言是静态的,动态性和交互性不强。于是,Netscape公司开发了JavaScript(与之对应是Microsoft公司的

7、VBScript),扩充HTML文档的功能。 Javascript嵌入在HTML文本中,由浏览器解释执行。.以下是一个HTML文本中嵌入JavaScript的例子:function welcome() var s = “Hello world!”; document.write(s); /document是是HTML文档对象文档对象 /函数的定义函数的定义 welcome() / 函数的调用函数的调用这个例子将在浏览器中显示“ Hello world!”字符串。“document”是HTML文档对象,使用它的write方法可以在文档中写入文本。. JavaScript有以下特点: 与C、Jav

8、a相似的语法,如常规的变量、表达式、函数和控制语句等。 弱类型。有数字、布尔、字符串和空值类型。变量的确切类型取决于所赋给它数据的类型。 基于对象。把浏览器和HTML文档中的元素看作对象,对象有各自的属性。例如,浏览器对象是已被预定义的Navigator;HTML页面是document对象。程序员可以使用的对象及其属性是已经被浏览器定义和生成的,不能定义新的类和对象。因此,是基于对象而不是面向对象的。 事件驱动。定义了一组系统、鼠标事件。可以通过事件激活定义好的函数。 在客户端使用的小语言.一个统计HTML文档中超链接个数的程序: for(var i=0; idocument.links.le

9、ngth; i+) document.write(link+(i+1)+: +document.linksi.href+); document.write(There are +document.links.length+ links.);其中,其中,document是整个是整个HTML页面对象;页面对象;links是是document对象对象中的超链接对象数组,中的超链接对象数组,length、href又是又是links的属性,分别的属性,分别表示链接的数目、链接的内容表示链接的数目、链接的内容.该HTML在浏览器中的显示如下图所示:.9.3 Java语言9.3.1 Java是C+的网络应用

10、的扩充和改造 保留了高级语言的主要机制 与C+基本相同的字符集、标识符、关键字、运算符、特殊符号 比C+更加强化类型。增加了布尔类型,只保留数组类型;使用真正的类型转换(C+中的类型转换是“伪”的,目的是为了通过编译器的检查;Java中的类型转换在运行时真正发生,如果不能转换,系统会抛出异常) 保留声明、作用域、变量、表达式、语句、三种结构化控制; 保留并增强C+的异常;. 与C+相似的面向对象机制:类作为特殊类型、构造函数、初始化序列、实例变量、this/super、方法的覆盖与重载、成员可见性。 取消了C+不利于网络应用的机制: 指针。以对象引用代替指针; 取消头文件和预处理器(宏与机器相

11、关); C+中原有冗余:struct、union都被类代替; 不支持模板,动态束定功能可实现; 取消typedef; 不支持运算符重载;.9.3.2 平台无关性的解决 编译解释执行。Java语言实现平台无关的关键是使用了“编译-解释”执行方式。Java源代码经过编译,称为Java字节代码(byte-code)。Java虚拟机(VM)是字节代码的解释器。JavaVM是用软件构造的一个虚拟计算机,它由虚拟的寄存器、内存、堆栈等;字节代码就是这台虚拟计算机的指令。所有操作系统上的JavaVM执行一致的指令,这样,就屏蔽了各个平台之间的差异(如下图所示)。.Java字节代码JavaVM forWind

12、owsJavaVM forSolarisJavaVM forMac OSWindowsSolarisMac OSJava虚拟机是平台无关性的关键在不同的操作系统上有不同的Java虚拟机,向上有一致的接口(虚拟机的指令字节代码),向下针对不同的操作系统有不同的实现方式。. 即时编译(JIT: Just-in-Time Compile)。使用即时编译是为了提高Java程序的执行效率,是对Java解释器的改进。即时编译在虚拟机解释执行Java字节代码时发生。当虚拟机第一次调用某个方法时,不再直接解释这个方法的字节代码,而是用即时编译器将这个方法的字节代码编译成为本机目标代码,然后执行这些目标代码。即

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

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

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

16、wer . . . public 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 = n

17、ew User(); user.paint(c);/ 画圆 user.paint(r);/ 画方 / End of class Useruser对象的paint方法使用统一的方式调用对象c和r的draw方法,产生不同的结果。.接口实现多态示意图:. 以接口实现多继承。一个类可以实现多个接口,间接实现多继承,同时不影响类的继承结构。Object类 B类 A类 B B类 AA接口C继承继承继承继承实现实现接口D实现类接口实现. 以synchronized控制模块的同步 Java使用监控器(Monitor)作为线程同步的机制。每一个对象都有一个监控器与之相对应。可以用synchronized关键字请

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

19、的类:int java.lang.Integershort java.lang.Shortlong java.lang.Longchar java.lang.Characterbyte java.lang.Bytefloat java.lang.Floatdouble java.lang.Doubleboolean java.lang.Boolean. 数组也是一种对象。用new语句创建,且有length属性; 没有独立存在的全局变量、函数。程序完全由对象和类组成,甚至入口函数main也必须从属于某个类; 对象引用。所有非基本数据类型变量都是对象的引用。与指针相比,引用只能访问对象,不能访问内

20、存地址。比较 MyClass a; 这个声明语句: 在C+中将生成一个对象,名为a 在Java中只有一个对象的引用a,它不指向任何对象,只有再通过a = new MyClass()才能创建一个对象.再比较 MyClass myObject;/Java还要执行myObject = new MyClass(); myObject = otherObject; 在C+中,myObject始终指向声明时分配的存储区,赋值语句的效果只是将otherObject的值拷贝给myObject对象 在Java中,myObject和otherObject将成为同一个对象的引用,如下图所示。对象myObjectMy

21、Object myObject = new MyObject();myObjectotherObject对象对象myObject = otherObject;. 支持多线程编程 线程的状态初始态:线程对象被创建但没有被运行时的状态;运行态:线程对象被启动,进入CPU的调度队列,开始执行另外的运行线索;阻塞态:线程对象由于某种原因,不能继续执行,CPU不再为它分配时间片。但是,这时的线程仍然是有生命的,一旦条件满足,它能够再次进入运行态,继续执行剩余的任务;死亡态:线程执行完任务,或者被强行结束。进入死亡态后,该线程不能再次返回运行态。.Java线程状态的转化:Java的线程也是对象,由java

22、.lang.Thread类继承而来。Thread类中有run方法,子类线程覆盖这个方法,将需要执行的语句填入run方法中。这样,当该线程被启动时,它会自动执行run方法中的语句。. 线程原语。java.lang.Thread类中有如下方法:start / stop:启动和停止线程suspend / resume:悬挂和恢复线程sleep:使线程睡眠join:等待其它线程的停止interrupt:唤醒被阻塞的或是睡眠的线程yield:让出CPU时间,使其它线程执行. wait / notify (等待-唤醒)原语wait和notify方法是所有Java对象父类:java.lang.Object类

23、的方法。当一个线程拥有一个对象的监控器(通过synchronized关键字)时,它可以调用该对象的wait或notify方法。 调用wait方法,该线程将放弃该对象的监控器,并且被阻塞,直到其它线程调用了该对象的notify方法唤醒它为止。 调用notify方法,该线程将唤醒某个由于等待(调用了wait方法)而被阻塞的线程,将该对象的监控器交给它,使其恢复执行。. 以下是利用Java实现的生产者-消费者问题:import java.util.*;public class CPVector pool; /Vector是可以存储任何对象的表.这里 / 当作产品池.int product = 0;p

24、ublic 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 Producer(cp);consumer.start();/启动线程,使其运行它的run函数producer.start();.public CP()pool = new Vector();/CP类的构造函数类的构造函数.public synchronize

25、d 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(Produce: + product); if(pool.size() = EMPTY + 1)pool.notify();catch(InterruptedException e).public synchronized void consume()t

26、ry 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();catch(InterruptedException e) /End of class CP.CP类以监控器的方式来管理产品池。它封装了数据对象产品池,和操纵该对象的方法生产(produce)和消费(consume)方法,并且通过Java的同步机

27、制对这些方法的并发性进行控制。.以下是消费者类Consumerclass Consumer extends ThreadCP cp;public Consumer(CP cp)super();this.cp = cp;public void run()/线程的执行函数while(true) cp.consume();/调用监控器的consume方法 Thread.sleep(1000);/模拟做其它工作的时间 / End of class Consumer.以下是生产者类Producerclass Producer extends ThreadCP cp;public Producer(CP

28、cp)super();this.cp = cp;/ 构造函数public void run()while(true) duce();/调用监控器的produce方法 Thread.sleep(200);/模拟做其它工作的时间. 线程通信有以下几种方式:共享对象管道流异地线程之间可以通过socket或RMI进行通信以下是一个利用管道流(PipedStream)进行线程之间通信的例子。.import java.io.*;public class CommThreadspublic static void main(String args)/ 生成一个单向管道流PipedInputStr

29、eam in = new PipedInputStream();PipedOutputStream out = new PipedOutputStream(in);Thread sender = new Sender(out);Thread receiver = new Receiver(in);sender.start(); / 启动发送者线程receiver.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);System.out.println(Receiver: + sBuffer.toString();/ 输出得到的消息.class Sender extends ThreadPipedOutputStr

温馨提示

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

评论

0/150

提交评论