Java是如何实现平台无关的?
✔️什么是平台无关性
✔️平台无关性的实现
对于Java的平台无关性的支持,就像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的。其中扮演着重要的角色的有Java语言规范、Class文件、Java虚拟机 (JVM) 等。
在计算机世界中,计算机只认识0和1,所以,真正被计算机执行的其实是由0和1组成的二进制文件。
但是,我们日常开发使用的C、C++、Java、Python等都属于高级语言,而非二进制语言。所以,想要让计算机认识我们写出来的Java代码,那就需要把他”翻译”成由0和1组成的二进制文件。这个过程就叫做编译。负责这一过程的处理的工具叫做编译器。
在Java平台中,想要把Java文件,编译成二进制文件,需要经过两步编译,前端编译和后端编译:
前端编译主要指与源语言有关但与目标机无关的部分。Java中,我们所熟知的javac的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把 .java代码转换成.class代码。
这里提到的.class代码,其实就是Class文件。
后端编译主要是将中间代码再翻译成机器语言。Java中,这一步骤就是Java虚拟机来执行的。
所以,我们说的,Java的平台无关性实现主要作用于以上阶段。如下图所示:
我从后往前介绍:Java虚拟机、Class文件、Java语言规范
✔️Java虚拟机
所谓平台无关性,就是说要能够做到可以在多个平台上都能无缝对接。但是,对于不同的平台,硬件和操作系统肯定都是不一样的。
对于不同的硬件和操作系统,最主要的区别就是指令不同。比如同样执行atb,A操作系统对应的二进制指令可能是10001000,而B操作系统对应的指令可能是11101110。那么,想要做到跨平台,最重要的就是可以根据对应的硬件和操作系统生成对应的二进制指令。
而这一工作,主要由我们的Java虚拟机完成。虽然Java语言是平台无关的,但是JVM却是平台有关的,不同的操作系统上面要安装对应的JVM。
上图是Oracle官网下载JDK的指引,不同的操作系统需要下载对应的Java虚拟机。
有了Java虚拟机,想要执行a+b操作,A操作系统上面的虚拟机就会把指令翻译成10001000,B操作系统上面的虚拟机就会把指今翻译成11101110。
PS : 图中的Class文件中内容为mock内容
✔️字节码
各种不同的平台的虚拟机都使用统一的程序存储格式———字节码(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中基本数据类型的大小都是确定的吗?
简单看下来,如果是单个的布尔类型,长度为32bit,如果是布尔数组,则每个布尔值的长度为8bit.