详细介绍JAVA的可移植性

开发 后端
本文介绍的是java中的可移植性,主要从三个大的方面来给大家介绍的。希望对大家有帮助,一起来看。

Java技术强大的可移植性(portability)主要表现在三个各自独立的方面,分别是:

  • 源代码可移植性
  • CPU可移植性
  • 操作系统可移植性

下面讨论了这三种可移植性的特点和它们的不足。

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上具有普遍的运用前景。 同时它自身具有的防病毒的才能也使它在需要高牢靠性的运用中占有一席之地。 

责任编辑:于铁 来源: 互联网
相关推荐

2011-07-11 17:33:25

JAVA可移植性

2011-06-14 14:18:08

可移植性测试

2012-12-14 09:35:03

私有云应用程序可移植性OpenStack

2013-05-28 10:33:06

虚拟化虚拟机移植

2016-08-02 09:45:59

云计算

2023-10-13 09:00:00

云计算架构

2013-10-31 10:22:21

开源云Linux容器Docker

2009-07-17 13:42:36

Windows CE应WinCE可移植性

2009-08-17 10:17:01

C# Windows

2012-09-07 09:51:07

云互操作性云可移植性云计算服务

2024-03-01 09:09:56

云计算架构应用

2012-11-16 15:34:35

Cloud FoundVMware PaaS平台即服务

2020-10-26 14:32:39

AI 数据模型

2009-03-26 09:25:14

J2MEJCPJSR

2013-12-09 09:24:46

2013-04-02 09:25:20

PaaS 应用可移植性PaaS提供商平台即服务

2018-09-06 14:45:49

数据云转型云计算

2021-11-19 11:53:42

云计算混合云Kubernetes

2024-12-18 14:13:07

2024-11-22 09:00:00

云原生云计算云应用
点赞
收藏

51CTO技术栈公众号