- 1、本文档共39页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
高级语言程序设计方法学第15章-10
第 15 章
第 15 章 平台无关语言
高级程序设计语言宗旨之一是平台无关,即用户会了某种语言到任何能实现该语言的环境上即
可编制程序而不需其它知识,在该语言的某个环境上编制的程序拿到有该语言实现的另一个环境上
可以照样运行,程序的计算,语义不变。传统上将其称之为可移植性(portability),前者程序员可
移植、后者程序可移植。由于高级语言源程序最终总要在不同操作系统、不同指令系统、不同内码
格式的具体机器上实现,可移植性始终不能完全彻底解决。例如两不同指令系统的目标码程序语义
完全等价是不可能的,只能使之差异最小,一般情况下不影响计算逻辑。业界几十年来一直为此努
力,到 80 年代初 Ada 已声称可以做到程序和程序员可移植。它的办法是:
[1] 语言定义是与机器无关的,几与机器相关部份(如基之类型和输入/输出等)做成预定义程序
包。保证 Ada 写的程序可移植,执行语义微小差别可由预定义包查出。
[2] 提出完整的可移植环境(APSE),分三层。第一层核环境(KAPSE)是操作系统的抽象,即应用
程序接口集。接口是规范化(大体一致)的。第二层,最小 Ada 程序设计支持环境 MAPSE,保证 Ada
程序编译,连接、加载、运行,排错……程序动作基本一致,当然要包括支持程序包函数库。也是
可移植性的基本保证。第三层,支持程序开发和动作的各种工具,尽可能相同。
[3] 语言中向用户开放属性机制,使程序员能得知每种类型实现状态以及运行时的某些状态值。
当有不一致时可采取补救措施。
90 年代网络计算兴起,对平台无关语言提出了更高要求。因为一个不断扩充的异质网不可能每
个站点都提供庞大的可移植环境,更不能统一操作系统。经常是几个不同的机器计算一个应用(系统),
即一处开发加载到另一处立即可用。联合开发的程序交互可用。可移植性上升为平台无关性。
1996 年出现的 Java就是在这种需求之下开发出来的。本章讨论 Java 语言设计特点及其保证平
台无关的机制。
除此而外,网络计算中还用到两类平台无关语言: 置标语言(严格说不属于程序设计语言)和脚
本语言(严格说不能做到平台无关)是网络客户必须掌握的语言,而且随着网络计算技术的成熟,它
们的重要性会与日俱增,本章一并介绍。
15.1 平台无关语言的实现策略
网络协议保证网络上两站点间文件的传输。文件中的数据(即使有较复杂的数据结构)一般可以
复原。如果文件中是程序,接受站点只能看作字节流。无法在本机上执行。除非机器同构操作系统
相同。网络能做到的是把程序作为字符流数据传过去。
实现程序传输,并在任何站点上执行是平台无关语言的第一需求。现在的问题是传什么与怎样
执行。
(1) 传输源程序
要求语言的定义完全是机器无关的,每一接受站关配备一翻译器以屏蔽本机的特殊性,并配备
与机器相关的预定义程序包(类似 Ada)以支持程序连接和运行。
翻译器可以是编译器可以是解释器。
编译器可以使目标代码效率高,但经本机优化其语义差异偏大。
解释器则相反效率较低、语义差异偏小。对于小型语言可采用此种方案(如脚本语言)。
(2) 传中间代码
第 1 页
第 15 章
编译技术中中间代码是抽象机器码,是对实现世界的抽象,故平台无关。传中间代码是一个可
行方案。传出后再翻成本机代码时几乎可以直接对应,语义差异小。编译时所需环境在源程序所在
机器上配备,接受站点无需,且不必传递。再一个优点是可以尽早发现源程序错误,增加传输有效
性。
接受站点处理简化(省去了编时间),可以解释执行。解释器屏蔽本机特性。最初的 Java 即采用
编译—中间代码—解释执行方案。
(3) 传中间代码再编译
解释执行效率是低的。如果接受到中间代码程序后对它进行编译生成本机目标代码并优化,此
时可得到高质量目标码,优化的语义差异比在高层作优化语义差异小。这样编译要付出时间,当程
序较大或多次执行的程序块,它比解释执行效率高。当程序较小时得不偿失。
(4) 传中间代码编译——解释执行
为了弥补(3)的不足可对中间代码解释执行。若得知重复执行的有大块,则将该块编译,如循环
块、多次调用
文档评论(0)