8、什么是平台无关性

Java的平台无关性源于其字节码和Java虚拟机(JVM)。Java源代码被编译成平台无关的Class文件,然后由JVM根据目标平台解释执行,实现Write Once, Run Anywhere。Java语言规范确保基本数据类型在所有平台的行为一致,而JVM则在不同平台间提供适配。此外,Java虚拟机还允许其他语言编译成字节码运行,进一步体现了语言无关性。
摘要由CSDN通过智能技术生成

什么是平台无关性

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

相信对于很多 Java 开发来说,在刚刚接触 Java 语言的时候,就听说过 Java 是一门跨平台的语言,Java 是平台无关性的,这也是 Java 语言可以迅速崛起并风光无限的一个重要原因。那

么,到底什么是平台无关性?Java 又是如何实现平台无关性的呢?本文就来简单介绍一下。

 

什么是平台无关性

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

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

 

平台无关性好处

作为一门平台无关性语言,无论是在自身发展,还是对开发者的友好度上都是很突出的。  因为其平台无关性,所以 Java 程序可以运行在各种各样的设备上,尤其是一些嵌入式

设备,如打印机、扫描仪、传真机等。随着 5G 时代的来临,也会有更多的终端接入网络, 相信平台无关性的 Java 也能做出一些贡献。

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

 

平台无关性的实现

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

等。

 

编译原理基础

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

我们在 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 操作系统上面的虚拟机就会把指令翻译成 1 0001000,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 语言规范

             O 通过规定 Java 语言中基本数据类型的取值范围和行为

  • Class 文件

             O 所有 Java 文件要编译成统一的 Class 文件

  • Java 虚拟机

             O 通过 Java 虚拟机将 Class 文件转成对应平台的二进制文件等

 

Java 的平台无关性是建立在 Java 虚拟机的平台有关性基础之上的,是因为 Java 虚拟机屏蔽了底层操作系统和硬件的差异。

 

语言无关性

其实,Java 的无关性不仅仅体现在平台无关性上面,向外扩展一下,Java 还具有语言无关性。

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

时至今日,商业机构和开源机构已经在 Java 语言之外发展出一大批可以在 JVM 上运行的语言了,如 Groovy、Scala、Jython 等。之所以可以支持,就是因为这些语言也可以被编译成字节

码(Class 文件)。而虚拟机并不关心字节码是有哪种语言编译而来的。详见牛逼了,教你用九种语言在 JVM 上输出 HelloWorld

                                              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值