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

众所周知,Sun 公司宣传 Java 语言的跨平台特性 "Write once, run anywhere" (一次编写,到处运行),让 Java 一路火到今天,世界上有数十亿设备运行 Java 程序,它能这么受欢迎的原因之一是 Java 平台实现了平台无关性,即编写一次代码可以运行在嵌入式设备、手机、服务器、个人电脑等各种终端设备。

什么是平台无关性

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

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

平台无关性好处

作为一门平台无关性语言,无论是在自身发展,还是对开发者的友好度上都是很突出的。

平台无关性对于一个语言的发展来说,意味着它可以运行在电脑、打印机等多种设备,这也决定了这个语言流行的广度。因为其平台无关性,所以Java程序可以运行在各种各样的设备上,尤其是一些嵌入式设备,如打印机、扫描仪、传真机等。随着5G时代的来临,也会有更多的终端接入网络,相信平台无关性的Java也能做出一些贡献。

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

平台无关性的实现

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

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

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

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

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

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

实现平台无关性要满足:

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

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

Java实现平台无关性的三大主力军分别是 Java虚拟机、Class文件、Java语言规范。

Java虚拟机

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

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

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

Java是如何实现平台无关性的_第1张图片

上图是Oracle官网下载JDK的指引,不同的操作系统需要下载对应的Java虚拟机。

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

Java是如何实现平台无关性的_第2张图片

所以,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是如何实现平台无关性的_第3张图片

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

实现平台无关 7 大步骤

  1. 选择程序运行的主机和设备集合(目标宿主机);

  2. 在目标宿主机中选择 Java 平台版本;

  3. 对于每个目标宿主机,选择程序将要运行的 Java 平台实现(目标运行时环境);

  4. 编写程序,调用 Java API 标准运行库(不调用本地方法,或者专门开发商专门调用本地方法的库);

  5. 编写程序,不依赖于垃圾收集器收集垃圾时间,不依赖线程的优先级;

  6. 努力设计用户界面,在所有的目标宿主机都能正常工作;

  7. 在所有目标运行时环境和所有目标宿主机进行测试;

你可能感兴趣的:(java,开发语言)