在接触Java的时候,常常能听到Java的特色之一就是:“一次编译,处处运行(Write Once, Run Anywhere)”。这种特色对于Java来讲,有什么好处呢?Java又是怎么支持这一特性呢?本文简单对这个特色简单介绍一下。html
(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)java
平台无关性,就是在一种语言在计算机运行时,不受其平台的约束。c++
换句话说,源码不作任何修改就能够在多个平台上运行。编程
平台无关性对于一个语言的发展来讲,意味着它能够运行在电脑、打印机等多种设备,这也决定了这个语言流行的广度。网络
并且平台无关性为开发者减小了开发和部署到多种平台的精力和时间成本,开发者为了程序在多种平台运行时尽量达到高效,须要深刻了解语言的特性,进一步推动语言优化,从必定程度上也推动了语言发展的深度。编程语言
编程语言分为低级语言和高级语言,机器语言和汇编语言属于低级语言,能够直接用计算机指令编写程序;而C、C++等属于高级语言,用语句编写程序,是不能直接被计算机识别并执行的。真正被计算机执行的是由0和1组成的二进制文件。工具
因此,想让计算机识别咱们编写的高级语言程序,须要将程序翻译成0和1组成的二进制文件。这个翻译的过程称为“编译”,执行这个过程的工具称为“编译器”。优化
在介绍支持平台无关性的要求以前,咱们先来看一个例子。spa
C语言是编译型语言,没有平台无关的特性。编译型语言的代码在某平台编译后的文件,能够直接在该平台下运行。咱们先简单了解一下C语言的编译过程:① 预处理;②编译;③汇编;④连接操作系统
C语言在编译过程当中,其与平台有关的部分在第二步编译过程,这里的编译是指通过预处理以后的程序转换成特定汇编代码,而编译后生成的汇编代码会因不一样的CPU和环境而有所不一样。
若是在转换成二进制文件前的汇编代码都不能适用于任何平台,何谈平台无关性呢?此外,平台不一样,C语言的基本数据类型的值域占位宽度也会不一样(如int类型,在16位操做系统中占2个字节,在32位操做中占4个字节,在64位操做系统中占8个字节)。
因此,我的总结,语言实现平台无关性有如下要求:
铺垫了那么多,接下来进入正题啦。
从上文咱们能够知道,要实现平台无关性得作到几件事:
这里先祭上Java编译过程示意图:
接下来,咱们来看看Java实现平台无关性的三大主力军。
不一样的平台下的硬件和操做系统确定也不同,并且光是不一样的硬件和操做系统的指令就已经不大相同了。因此要想作到平台无关,最重要的是要作到能够根据相应的硬件和操做系统,生成对应的二进制文件。
这一任务,由Java虚拟机完成,不一样的操做系统上须要安装对应的Java虚拟机。
虽然说Java语言是平台无关性的,但JVM的确是平台有关的,在此的平台无关性是相对的(对于开发者来讲,算是平台无关)
Java能作到跨平台,Java虚拟机功不可没,由于Java虚拟机是Java文件及其编译文件与硬件和操做系统之间的桥梁。
JVM不会直接执行Java文件,实际上,JVM不只被Java语言所使用,还有如Scala、Jython等语言的编译过程也使用JVM。也就是说JVM运行的时候并不依赖于Java语言,能在JVM上运行的文件是Class文件。
各类运行在不一样平台上的虚拟机都统一使用字节码(Byte Code)组成的Class文件进行交互,而Class文件是由javac处理Java文件后获得的。
Class文件能够在任何平台上被建立,也能够被任何平台上的JVM装载运行。它的格式有着严格的定义,因此Class文件是构成平台无关性的基石之一。
Java编程语言也在用它本身的方式支持这Java平台无关性事业的发展:它的基础数据类型的值域和行为是由语言本身定义的,不像C语言的是由平台决定。举个栗子,Java语言中,int类型不管是在16位操做系统、32位操做系统和64位操做系统下,都是占4个字节。
总结一下,Java经过规定Java语言中基本数据类型的取值范围和行为,统一Java文件编译成Class文件,而且最后由Java虚拟机将Class文件转换成对应平台的二进制文件,才实现了平台无关性。
在总结平台无关性的时候特意标注“我的总结”,是由于这里的总结是为下文介绍Java实现平台无关性服务的。若是须要更加深刻了解平台无关性,能够参考一下如下资料。
参考资料: