找回密码
 注册帐号
查看: 1097|回复: 0

[电脑其他] 关于JAVA的可移植性

[复制链接]
发表于 2011-5-15 23:56:24 | 显示全部楼层 |阅读模式
1. JAVA作为一种编程语言:源代码可移植性   作为一种编程语言, JAVA提供了一种最复杂同时也是人们最熟悉的可移植性–源代码移植。 这意味着任意一个JAVA顺序, 不论它运转在何种CPU、操作系统或JAVA编译器上, 都将发生同样的结果。 这并不是一个新的概念。 人们使用C、C++也可以发生同样的效果。 但是使用C或C++编程人们可以有太多的选择, 在许多细节上它都没有严厉定义, 如:未初始化变量的值、对已释放的内存的存取、浮点运算的尾数值等等。 所以除非你一开始就严厉按照系统有关的概念来停止设计, 否则这种可移植性只能是一种理论上的想象而不能构成理论。 总之, 尽管C和C++有严密的语法定义, 它们的语意(symantics)定义还不是标准的。 这种语意上的不统一使得同一段顺序在不同的系统环境下会发生不同的结果。 有时即使系统状况完全相同而仅仅由于编译器的设置不同也会发生令人意想不到的结果。 而JAVA就不同了。 它定义了严密的语意结构, 而使编译器不承担这方面的工作。 另外, JAVA对顺序的行为的定义也比C和C++严厉, 如:它提供了内存自动回收功用(GarbageCollection), 使顺序不能访问越界内存;它对未初始化的变量提供确定值等等。 它的这些特功可以减小在不同平台上运转的JAVA顺序之间的差异, 也使得JAVA具有即使没有JAVA虚拟机的存在的状况下比C和C++更好的平台有关性。 然而, 这些特点也有它不利的一面。 JAVA想象运转于具有32位字节长度且每字节为8位的计算机上, 这就使得那些8位字长的计算机和一些巨型机不能有效的运转JAVA顺序。 在这样的平台上就只能运转那些可移植的C和C++顺序了。   2. JAVA作为一个虚拟机:CPU可移植性  大多数编译器发生的目的代码只能运转在一种CPU上(如Intel的x86系列), 即使那些能支持多种CPU的编译器也不能同时发生合适多种CPU的目的代码。 如果你需要在三种CPU(如x86、SPARC和MIPS)上运转同一顺序, 就必需编译三次。   但JAVA编译器就不同了。 JAVA编译器发生的目的代码(J-Code)是针对一种并不存在的CPU–JAVA虚拟机(JAVAVirtualMachine), 而不是某一实践的CPU。 JAVA虚拟机能掩盖不同CPU之间的差异, 使J-Code能运转于任何具有JAVA虚拟机的机器上。   虚拟机的概念并不是JAVA所特有的:加州大学几年前就提出了PASCAL虚拟机的概念;广泛用于Unix效劳器的Perl脚本也是发生与机器有关的两头代码用于执行。 但针对Internet使用而设计的JAVA虚拟机的特别之处在于它能发生安全的不受病毒威胁的目的代码。 正是由于Internet对安全特性的特别要求才使得JVM可以迅速被人们接受。 当今主流的操作系统如OS/2、MacOS、Windows95/NT都已经或很快提供对J-Code的支持。   作为一种虚拟的CPU, JAVA虚拟机对于源代码(SourceCode)来说是独立的。 我们不只可以用JAVA语言来生成J-Code, 也可以用Ada95来生成。 事实上, 已经有了针对若干种源代码的J-Code编译器, 包括Basic、Lisp和Forth。 源代码一经转换成J-Code以后, JAVA虚拟机就可以执行而不区分它是由哪种源代码生成的。 这样做的结果就是CPU可移植性。   将源顺序编译为J-Code的好处在于可运转于各种机器上, 而缺点是它不如本机代码运转的速度快。   3. JAVA作为一种虚拟的操作系统(OS)和图形用户界面(GUI):操作系统可移植性  即使经过重新编译, 大多数的用C和C++编写的Windows顺序也不能在Unix或Macintosh系统上运转。 这是为什么呢?由于顺序员在编写Windows顺序时使用了大量的WindowsAPI和中断调用, 而Windows顺序对系统功用的调用与Unix和Macintosh顺序有很大的差异, 所以除非将全套WindowsAPI移植到其它操作系统上, 否则重编译的顺序仍不能运转。   JAVA采用了提供一套与平台有关的库函数(包括AWT、UTIL、LANG等等)的方法来解决这个效果。 就象JVM提供了一个虚拟的CPU一样, JAVA库函数提供了一个虚拟的GUI环境。 JAVA顺序仅对JAVA库函数提出调用, 而库函数对操作系统功用的调用由各不同的虚拟机来完成。 JAVA也在它的OS/GUI库中使用了一种“罕见称号符”(least-commom-denominator)来提供对某种特定操作系统的功用调用, 即此功用只在特定环境下失效而在其它操作系统下则被疏忽。 这样做的好处在于可以针对某操作系统生成拥有人们熟悉的界面的使用顺序而同时此顺序又能在其它系统下运转。 缺点则是系统中的某些功用调用有很强的依赖性因此在JAVA的虚拟OS/API中难以实现。 遇到这种状况, 顺序员就只能写不可移植的顺序了。   总之, JAVA在可移植性方面的特点使它在Internet上具有广泛的使用前景。 同时它本身具有的防病毒的能力也使它在需要高牢靠性的使用中占有一席之地。文章由 suyin.tk 淘宝缩阴产品排行榜 整理,收集辛苦,希望能保留出处。
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

QQ|Archiver|手机版|小黑屋|依人网络官方网站 ( 陕ICP备19025998号-1 )

GMT+8, 2024-4-27 02:06 , Processed in 0.053840 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表