第15章平台无关语言•使用平台无关语言的需求•脚本语言•Java语言15.1使用平台无关语言的需求•高级程序设计语言本应是平台无关的–在高级语言中,数据、控制流等都是抽象的。–源程序经过编译生成的目标码是与本地机紧密相关的。表现在:•基本类型定义与及其字长相关;•各机指令集不一,操作效果相当,实现过程有微小的差别;•同一语言在相同编译和执行环境下,同一程序执行速度不一(硬件差异,优化次数);–已采用增加可移植手段。•设预定义环境(包)——Ada;•分出头文件-宏-编译文件——C;•单主机时代,需要解决的主要问题是高级语言程序可移植性,以减少应用程序的开发费用,缩短开发周期。这时对平台无关性的要求不是十分迫切。•局域网时代,需要在局域网内实现信息共享,有协作计算需求。–网络协议栈实现了数据的平台无关;–以文件共享形式实现;–客户/服务器模式,程序可以不共享;–只要局域网内使用相同或相互兼容的平台,也可以实现程序的共享。•Internet时代,对资源共享提出了新的要求:–局域网的规模和结构是可控制的;但是,没有任何个人和机构可以控制Internet的构成。Internet/Intranet包含各种类型计算机,是资源共享的平台。不论用户使用的是什么类型的计算机和操作系统,都可以浏览网络上的信息,使用网络中的资源。–(WorldWideWeb)是Internet上最广泛的信息发布/浏览方式。与FTP等以往的方式相比较,具有较强的动态性和交互性,需要完成复杂的应用(如电子商务等)因此,共享资源不但包括数据,也应包括程序。这就需要一种平台无关的语言。–激烈的竞争迫使软件生产者不断降低开发成本,缩短开发周期。平台无关语言使开发者不需要为一个软件开发多个操作系统的版本,减少了开发费用和时间。•平台无关语言的实现:–传送源代码将源代码传送到目标机,先经过编译,生成目标机代码,再执行。前提是必须有不同平台的编译器,这种情况往往在编译时缺乏源代码原有的环境信息(全程量),且只能先编译存入目标码再运行。局域网时代服务器已经做过了。要实时运行只能是解释(也要求有完整的信息)型语言。–传送目标代码只有在相同或相互兼容的平台之间才可以实现。如在WindowsNT/9x组成的局域网中,可以在一台机器上调用执行其它机器上的应用程序。–传送中间代码中间代码由源代码经过编译生成。中间代码经过优化。中间代码传送到目标机上由解释器解释执行。Java语言使用的是这种方式。15.2脚本语言•脚本语言的概述:–描述性语言(4GL);–直接解释执行;–操作系统界面语言的扩大——泛shell;–辅助开发(不是设计,但引用内部过程、函数、对象);•常见的脚本语言有:–页面描述类:TELEX、Postscript、HTML、VPML;–场景描述类:JavaScript、VBScript/ActiveX脚本、LotusScript(Lotus公司的Notes群件产品中的脚本语言)15.2.1HTML(Hyper-TextMarkupLanguage)•用于描述Web主页,为所有OS上的浏览器所识;•设计编排多媒体主页(包括正文字体、图形、动画);•以超文本方式使用,可以链接任何网址上的各种多媒体文档,包括普通正文、HTML文档、GIF图形、TIFF图形;XBM位图、JPEG图形、Postscript文件、AIFF声音、AU声音、QuickTime影片、MPEG影片;•标签。以尖括号括出的成对或单个标签给出页面编排信息。–文档编排、引用描述:HTML一个HTML文档/HTMLHEAD文档简介信息/HEADBODY文档内容/BODYTITLE标题/TITLEAHREF=“被链接文件URL”链接名/AHi第i层编排/Hi此前为一段P由此换行BRHR产生一个视窗宽度的水平分行符–字符格式•逻辑描述:DFN已定义单词/DFNEM重点词/EMCITE书或电影主题/CITECODE一段源代码/CODEKBD由此键入/KBDSAMP状态信息/SAMPSTRONG特别强调/STRONG•物理描述:B此处黑体/BI此处斜体/ITT此处打字机体/TT–内联图形IMGSRC=图形所在URL–其它标签•列表:ULLI表项LI表项……/UL(无号)OL……………/OL(有号)DL……DL表项DD测试此表DL表项……/DL(定义表)•预定义格式正文:PRE此段文本格式已定/PRE•作者地址:ADDRESS……/ADDRESS•扩展引用:BLOCKQUOTE……/BLOCKQUOTE•嵌入Java:APPLETapplet程序属性/APPLET•嵌入其它描述语言:SCRIPTLANGUAGE=“语言名”………………/SCRIPT15.2.2JavaScript语言•HTML语言是静态的,动态性和交互性不强。于是,Netscape公司开发了JavaScript(与之对应是Microsoft公司的VBScript),扩充HTML文档的功能。•Javascript嵌入在HTML文本中,由浏览器解释执行。以下是一个HTML文本中嵌入JavaScript的例子:HTMLHEADSCRIPTLANGUAGE=JavaScriptfunctionwelcome(){vars=“Helloworld!”;document.write(s);//document是HTML文档对象}//函数的定义/SCRIPT/HEADBODYSCRIPTwelcome()//函数的调用/SCRIPT/BODY/HTML这个例子将在浏览器中显示“Helloworld!”字符串。“document”是HTML文档对象,使用它的write方法可以在文档中写入文本。–JavaScript有以下特点:•与C、Java相似的语法,如常规的变量、表达式、函数和控制语句等。•弱类型。有数字、布尔、字符串和空值类型。变量的确切类型取决于所赋给它数据的类型。•基于对象。把浏览器和HTML文档中的元素看作对象,对象有各自的属性。例如,浏览器对象是已被预定义的Navigator;HTML页面是document对象。程序员可以使用的对象及其属性是已经被浏览器定义和生成的,不能定义新的类和对象。因此,是基于对象而不是面向对象的。•事件驱动。定义了一组系统、鼠标事件。可以通过事件激活定义好的函数。•在客户端使用的小语言一个统计HTML文档中超链接个数的程序:HTMLBODYAHREF====JavaScriptfor(vari=0;idocument.links.length;i++){document.write(link+(i+1)+:+document.links[i].href+br);}document.write(pThereare+document.links.length+links.);/SCRIPT/BODY/HTML其中,document是整个HTML页面对象;links是document对象中的超链接对象数组,length、href又是links的属性,分别表示链接的数目、链接的内容该HTML在浏览器中的显示如下图所示:15.3Java语言15.3.1Java是C++的网络应用的扩充和改造•保留了高级语言的主要机制–与C++基本相同的字符集、标识符、关键字、运算符、特殊符号–比C++更加强化类型。增加了布尔类型,只保留数组类型;使用真正的类型转换(C++中的类型转换是“伪”的,目的是为了通过编译器的检查;Java中的类型转换在运行时真正发生,如果不能转换,系统会抛出异常)–保留声明、作用域、变量、表达式、语句、三种结构化控制;–保留并增强C++的异常;–与C++相似的面向对象机制:类作为特殊类型、构造函数、初始化序列、实例变量、this/super、方法的覆盖与重载、成员可见性。•取消了C++不利于网络应用的机制:–指针。以对象引用代替指针;–取消头文件和预处理器(宏与机器相关);–C++中原有冗余:struct、union都被类代替;–不支持模板,动态束定功能可实现;–取消typedef;–不支持运算符重载;15.3.2平台无关性的解决•编译解释执行。Java语言实现平台无关的关键是使用了“编译-解释”执行方式。Java源代码经过编译,称为Java字节代码(byte-code)。Java虚拟机(VM)是字节代码的解释器。JavaVM是用软件构造的一个虚拟计算机,它由虚拟的寄存器、内存、堆栈等;字节代码就是这台虚拟计算机的指令。所有操作系统上的JavaVM执行一致的指令,这样,就屏蔽了各个平台之间的差异(如下图所示)。Java字节代码JavaVMforWindowsJavaVMforSolarisJavaVMforMacOSWindowsSolarisMacOSJava虚拟机是平台无关性的关键在不同的操作系统上有不同的Java虚拟机,向上有一致的接口(虚拟机的指令——字节代码),向下针对不同的操作系统有不同的实现方式。•即时编译(JIT:Just-in-TimeCompile)。使用即时编译是为了提高Java程序的执行效率,是对Java解释器的改进。即时编译在虚拟机解释执行Java字节代码时发生。当虚拟机第一次调用某个方法时,不再直接解释这个方法的字节代码,而是用即时编译器将这个方法的字节代码编译成为本机目标代码,然后执行这些目标代码。即时编译不是将整个类的字节代码进行一次性编译,而是只编译正在执行的函数,“边执行,边编译”。•小程序(applet)的传递运行方式–小程序是可以在Web浏览器中执行的Java程序;–Web浏览器中有一个Java虚拟机,和浏览器一起构成小程序的运行环境;–浏览器根据HTML文档中的APPLET标志,从指定的URL下载小程序的类字节码(.class文件),装入到Java虚拟机中运行;–小程序的出现提高了Web页面的交互性和动态性,使浏览器能够完成更加复杂的应用。–Java虚拟机有内置的类装入机制,从文件系统或网络中下载类代码,然后在虚拟机中运行。浏览器下载运行小程序只是一个特例,这种机制可以被所有Java应用程序使用。15.3.3Java为应用增加的新特性•两层封装:包——类–“包”是一组功能相近或联系紧密的类的集合,同一个包中的类之间有比较大的访问权限。包是一种对语言进行扩充的机制。Java的核心类库主要由以下几个包组成:•java.lang-基本类库•java.io-读、写流,文件,管道•java.net-网络•java.awt-界面、窗口•java.applet-小程序类•java.util-通用工具:向量表、哈希表、栈–“类”与C++的基本相同。Java只有单继承,类库呈树状结构,所有类都是java.lang.Object类的子类。•增加了接口(interface)的机制。–接口是一种特殊的类,在接口中只有函数的声明,而没有函数的具体定义(与C++的纯虚类相似)。接口可以继承,但不能直接由接口生成对象;–以类实现(implements)接口,即在类中定义所有接口中声明的函数。我们可以把一个接口看成某种功能的规定,实现了接口,就是实现了某种功能。类的继承和接口的实现是多态的基础。–以接口实现多态。接口将函数的声明和实现分离,允许几个类同时享有一个接口。调用者不需要了解接口的具体实现,以统一的方式使用这些类的对象。下面是一个简单的例子:interfaceDrawer{public