Java的平台无关性

Posted NYfor2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的平台无关性相关的知识,希望对你有一定的参考价值。

前言

在接触Java的时候,经常能听到Java的特点之一就是:“一次编译,到处运行(Write Once, Run Anywhere)”。这种特点对于Java来说,有什么好处呢?Java又是怎么支持这一特性呢?本文简单对这个特点简单介绍一下。

什么是平台无关性?

平台无关性,就是在一种语言在计算机运行时,不受其平台的约束。

换句话说,源码不做任何修改就可以在多个平台上运行。

平台无关性有什么好处?

平台无关性对于一个语言的发展来说,意味着它可以运行在电脑、打印机等多种设备,这也决定了这个语言流行的广度。

而且平台无关性为开发者减少了开发和部署到多种平台的精力和时间成本,开发者为了程序在多种平台运行时尽可能达到高效,需要深入了解语言的特性,进一步推进语言优化,从一定程度上也推进了语言发展的深度。

怎么支持平台无关性?

编程语言分为低级语言和高级语言,机器语言和汇编语言属于低级语言,可以直接用计算机指令编写程序;而C、C++等属于高级语言,用语句编写程序,是不能直接被计算机识别并执行的。真正被计算机执行的是由0和1组成的二进制文件。

所以,想让计算机识别我们编写的高级语言程序,需要将程序翻译成0和1组成的二进制文件。这个翻译的过程称为“编译”,执行这个过程的工具称为“编译器”。

在介绍支持平台无关性的要求之前,我们先来看一个例子。

 

C语言是编译型语言,没有平台无关的特性。编译型语言的代码在某平台编译后的文件,可以直接在该平台下运行。我们先简单了解一下C语言的编译过程:① 预处理;②编译;③汇编;④链接

C语言在编译过程中,其与平台有关的部分在第二步编译过程,这里的编译是指经过预处理之后的程序转换成特定汇编代码,而编译后生成的汇编代码会因不同的CPU和环境而有所不同

如果在转换成二进制文件前的汇编代码都不能适用于任何平台,何谈平台无关性呢?此外,平台不同,C语言的基本数据类型的值域占位宽度也会不同(如int类型,在16位操作系统中占2个字节,在32位操作中占4个字节,在64位操作系统中占8个字节)。

 

所以,个人总结,语言实现平台无关性有以下要求:

  • 编译过程中,在编译成机器代码前的代码可在任何平台下都能运行

  • 语言的基本数据类型的值域和行为,不应因平台的改变而有所改变

 

铺垫了那么多,接下来进入正题啦。

Java为什么要实现平台无关性?

  1. 支持多变的网络环境。现在程序大多在网络环境进行部署,网络将各式各样的计算机和设备连接起来。实现平台无关性,程序能够在不做任何改动的情况下,在网络环境中的任何计算机运行起来。

  2. 支持网络化嵌入式设备。目前工作场所中的各种嵌入式设备,如打印机,往往通过网络连接起来。实现平台无关性,可以简化对这类设备的系统管理。

  3. 减少开发者部署程序的精力和时间成本。

Java怎么实现平台无关性?

从上文我们可以知道,要实现平台无关性得做到几件事:

  • 在汇编器编译成机器代码之前的代码,在各平台上都可以运行

  • 语言的基本数据类型的值域和行为,由语言来定义,不受平台的影响

这里先祭上Java编译过程示意图:

接下来,我们来看看Java实现平台无关性的三大主力军。

Java虚拟机(JVM)

不同的平台下的硬件和操作系统肯定也不一样,而且光是不同的硬件和操作系统的指令就已经不大相同了。所以要想做到平台无关,最重要的是要做到可以根据相应的硬件和操作系统,生成对应的二进制文件。

这一任务,由Java虚拟机完成,不同的操作系统书上需要安装对应的Java虚拟机。

虽说Java语言是平台无关性的,但JVM的确是平台有关的,在此的平台无关性是相对的(对于开发者来说,算是平台无关)

Java能做到跨平台,Java虚拟机功不可没,因为Java虚拟机是Java文件及其编译文件与硬件和操作系统之间的桥梁。

Class文件

JVM不会直接执行Java文件,实际上,JVM不仅被Java语言所使用,还有如Scala、Jython等语言的编译过程也使用JVM。也就是说JVM运行的时候并不依赖于Java语言,能在JVM上运行的文件是Class文件。

各种运行在不同平台上的虚拟机都统一使用字节码(Byte Code)组成的Class文件进行交互,而Class文件是由javac处理Java文件后得到的。

Class文件可以在任何平台上被创建,也可以被任何平台上的JVM装载运行。它的格式有着严格的定义,所以Class文件是构成平台无关性的基石之一。

Java语言规范

Java编程语言也在用它自己的方式支持这Java平台无关性事业的发展:它的基础数据类型的值域和行为是由语言自己定义的,不像C语言的是由平台决定。举个栗子,Java语言中,int类型无论是在16位操作系统、32位操作系统和64位操作系统下,都是占4个字节。

 

总结一下,Java通过规定Java语言中基本数据类型的取值范围和行为,统一Java文件编译成Class文件,并且最后由Java虚拟机将Class文件转换成对应平台的二进制文件,才实现了平台无关性。

 

结语

在总结平台无关性的时候特地标注“个人总结”,是因为这里的总结是为下文介绍Java实现平台无关性服务的。如果需要更加深入了解平台无关性,可以参考一下以下资料。

 

参考资料:

浅谈Java平台无关性

Java是如何实现平台无关性的

C为什么不能跨平台

为什么Java可以跨平台c/c++不可以吗

以上是关于Java的平台无关性的主要内容,如果未能解决你的问题,请参考以下文章

平台无关性

深入理解Java虚拟机 理解平台无关性

Java 平台无关性的基石

JVM,Java怎样实现一次编译到处运行(平台无关性)

62.类文件结构(平台无关性类文件结构)

Java的平台无关性