Java是如何实现平台无关性(跨平台)的?


相信对于不少Java开发来讲,在刚刚接触Java语言的时候,就据说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言能够迅速崛起并风光无限的一个重要缘由。那么,到底什么是平台无关性?Java又是如何实现平台无关性的呢?本文就来简单介绍一下。

一,什么是平台无关性

平台无关性就是一种语言在计算机上的运行不受平台的约束,一次编译,处处执行(Write Once ,Run Anywhere)。前端

也就是说,用Java建立的可执行二进制程序,可以不加改变的运行于多个平台。java

平台无关性好处后端

做为一门平台无关性语言,不管是在自身发展,仍是对开发者的友好度上都是很突出的。安全

由于其平台无关性,因此Java程序能够运行在各类各样的设备上,尤为是一些嵌入式设备,如打印机、扫描仪、传真机等。随着5G时代的来临,也会有更多的终端接入网络,相信平台无关性的Java也能作出一些贡献。网络

对于Java开发者来讲,Java减小了开发和部署到多个平台的成本和时间。真正的作到一次编译,处处运行。eclipse

二,平台无关性的实现

对于Java的平台无关性的支持,就像对安全性和网络移动性的支持同样,是分布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言规范、Class文件、Java虚拟机(JVM)等。ide

编译原理基础工具

讲到Java语言规范、Class文件、Java虚拟机就不得不提Java究竟是是如何运行起来的。idea

咱们在Java代码的编译与反编译那些事儿中介绍过,在计算机世界中,计算机只认识0和1,因此,真正被计算机执行的实际上是由0和1组成的二进制文件。操作系统

可是,咱们平常开发使用的C、C++、Java、Python等都属于高级语言,而非二进制语言。因此,想要让计算机认识咱们写出来的Java代码,那就须要把他”翻译”成由0和1组成的二进制文件。这个过程就叫作编译。负责这一过程的处理的工具叫作编译器。

在深刻分析Java的编译原理中咱们介绍过,在Java平台中,想要把Java文件,编译成二进制文件,须要通过两步编译,前端编译和后端编译:

前端编译主要指与源语言有关但与目标机无关的部分。Java中,咱们所熟知的javac的编译就是前端编译。除了这种之外,咱们使用的不少IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把.java代码转换成.class代码。

这里提到的.class代码,其实就是Class文件。

后端编译主要是将中间代码再翻译成机器语言。Java中,这一步骤就是Java虚拟机来执行的。

因此,咱们说的,Java的平台无关性实现主要做用于以上阶段。以下图所示:


咱们从后往前介绍一下这三位主演:Java虚拟机、Class文件、Java语言规范

Java虚拟机
所谓平台无关性,就是说要可以作到能够在多个平台上都能无缝对接。可是,对于不一样的平台,硬件和操做系统确定都是不同的。

对于不一样的硬件和操做系统,最主要的区别就是指令不一样。好比一样执行a+b,A操做系统对应的二进制指令多是10001000,而B操做系统对应的指令多是11101110。那么,想要作到跨平台,最重要的就是能够根据对应的硬件和操做系统生成对应的二进制指令。

而这一工做,主要由咱们的Java虚拟机完成。虽然Java语言是平台无关的,可是JVM确实平台有关的,不一样的操做系统上面要安装对应的JVM。


上图是Oracle官网下载JDK的指引,不一样的操做系统须要下载对应的Java虚拟机。

有了Java虚拟机,想要执行a+b操做,A操做系统上面的虚拟机就会把指令翻译成10001000,B操做系统上面的虚拟机就会把指令翻译成11101110。



ps:图中的Class文件中内容为mock内容

因此,Java之因此能够作到跨平台,是由于Java虚拟机充当了桥梁。他扮演了运行时Java程序与其下的硬件和操做系统之间的缓冲角色。

字节码

各类不一样的平台的虚拟机都使用统一的程序存储格式——字节码(ByteCode)是构成平台无关性的另外一个基石。Java虚拟机只与由本身码组成的Class文件进行交互。

咱们说Java语言能够Write Once ,Run Anywhere。这里的Write其实指的就是生成Class文件的过程。

由于Java Class文件能够在任何平台建立,也能够被任何平台的Java虚拟机装载并执行,因此才有了Java的平台无关性。

Java语言规范

已经有了统一的Class文件,以及能够在不一样平台上将Class文件翻译成对应的二进制文件的Java虚拟机,Java就能够完全实现跨平台了吗?

其实并非的,Java语言在跨平台方面也是作了一些努力的,这些努力被定义在Java语言规范中。

好比,Java中基本数据类型的值域和行为都是由其本身定义的。而C/C++中,基本数据类型是由它的占位宽度决定的,占位宽度则是由所在平台决定的。因此,在不一样的平台中,对于同一个C++程序的编译结果会出现不一样的行为。

举一个简单的例子,对于int类型,在Java中,int占4个字节,这是固定的。

可是在C++中却不是固定的了。在16位计算机上,int类型的长度可能为两字节;在32位计算机上,可能为4字节;当64位计算机流行起来后,int类型的长度可能会达到8字节。(这里说的都是可能哦!)



经过保证基本数据类型在全部平台的一致性,Java语言为平台无关性提供强了有力的支持。

三,小结

对于Java的平台无关性的支持是分布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言规范、Class文件、Java虚拟机等。

Java语言规范
经过规定Java语言中基本数据类型的取值范围和行为
Class文件
全部Java文件要编译成统一的Class文件
Java虚拟机
经过Java虚拟机将Class文件转成对应平台的二进制文件等
Java的平台无关性是创建在Java虚拟机的平台有关性基础之上的,是由于Java虚拟机屏蔽了底层操做系统和硬件的差别。

四,语言无关性

其实,Java的无关性不只仅体如今平台无关性上面,向外扩展一下,Java平还具备语言无关性,更准确的说是Java虚拟机具备语言无关性。

前面咱们提到过。JVM其实并非和Java文件进行交互的,而是和Class文件,也就是说,其实JVM运行的时候,并不依赖于Java语言。

时至今日,商业机构和开源机构已经在Java语言以外发展出一大批能够在JVM上运行的语言了,如Groovy、Scala、Jython等。之因此能够支持,就是由于这些语言也能够被编译成字节码(Class文锦啊)。而虚拟机并不关心字节码是有哪一种语言编译而来的。详见牛逼了,教你用九种语言在JVM上输出HelloWorld

相关文章
相关标签/搜索