相信对于很多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操作系统上面的虚拟机就会把指令翻译成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

转载于:https://juejin.im/post/5ca60e33e51d4546e749a363

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

  1. Java如何实现的平台无关性的(面试必看)

    想要查看前面的笔记请翻阅我的CSDN博客,作者码字不易,喜欢的话点赞,加个关注吧,后期还有很多干货等着你! 相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语 ...

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

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

  3. Java平台无关性——跨平台

    平台无关性,指的是Java可以跨平台编译,不用像如c++这类语言重新编译. Java运行有一个虚拟机,Java运行环境(JRE)中的class loader与平台无关,放到不同系统就有不同虚拟机去运行 ...

  4. java语言有没有平台无关性_Java语言具有良好的安全性和可移植性及平台无关性。...

    [判断题]在类的定义中如果不明确给出父类,那么默认父类是Object类. [判断题]数组一旦创建大小不可改变. [单选题]手绘天花布置图的表示方法中,凡是剖到的墙.柱的断面轮廓线用( )绘制. [单选 ...

  5. Java的平台无关性是怎么实现的?

    前言 在接触Java的时候,经常能听到Java的特点之一就是:"一次编译,到处运行(Write Once, Run Anywhere)".这种特点对于Java来说,有什么好处呢?J ...

  6. java平台无关性_为什么Java能够实现平台无关性?

    前言从最初学习Java开始,我们就知道Java的口号是:"一次编写,到处运行".没有了平台的束缚,使得我们再编写Java时并不需要(那么)关心将来运行程序的平台. 那么,Java是 ...

  7. java 平台无关_Java | 为什么 Java 实现了平台无关性?

    前言从最初学习Java开始,我们就知道Java的口号是:"一次编写,到处运行".没有了平台的束缚,使得我们再编写Java时并不需要(那么)关心将来运行程序的平台. 那么,Java是 ...

  8. 深入Java虚拟机(2)——Java的平台无关性

    一.平台无关性的好处 Java技术在网络环境下非常有用,其中一个关键理由是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台. 这样的平台无关性随之带来许多的好处.这将极大地减轻系统管理 ...

  9. 浅谈Java平台无关性

    为什么Java要支持平台无关性 众所周知,Java是平台无关的语言,那么Java为什么要支持平台无关性,总结一下,有如下几点 支持多变的网络环境.如今是一个互联网的时代,网络将各种各样的计算机和设备连 ...

最新文章

  1. 青源LIVE第23期|ACL最佳论文一作许晶晶:机器翻译中的词表学习问题研究
  2. 如何在使用eclipse的情况下,清理android项目中的冗余class文件和资源文件以及冗余图片...
  3. 开始使用asp.net ajax的控件工具包AJAX Control Toolkit
  4. 深入理解Lustre文件系统-第1篇 前言
  5. Python过滤掉numpy.array中非nan数据
  6. 聊聊我常用的5款动态数据可视化工具
  7. jQuery高级部分笔记
  8. linux gcc编译只能编译一条,请教一个gcc编译器的问题啊
  9. C++11多线程のfuture,promise,package_task
  10. Eclipse统计代码行数
  11. 带你学习《深入理解计算机系统》程序性能优化探讨(5)——高速缓存、存储器山与矩阵乘法优化
  12. 红米k50 刷入类原生教程
  13. GO语言-panic和recover
  14. codeforces 909 f
  15. android 横屏录制视频,MediaRecorder怎么在竖屏的时候录像结果是横屏录的结果
  16. 电脑浏览器主页面被恶意劫持无法修改的解决方法
  17. python反向切片_python切片
  18. CMMI2.0之我见-配置管理CM
  19. 鸿蒙系统能不能用在手机,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  20. 网易云安装以及玄学打开问题

热门文章

  1. Android百度地图,绘制,覆盖物,导航,定位,细腻分解!
  2. 【BZOJ3669】【NOI2014】魔法森林 (spfa动态队列加点算法)
  3. PHOTOSHOP CC 2019 无法导出渲染视频的解决文案
  4. java购物商城系统开题报告_开题报告-基于Java的网上购物商城的设计与实现.doc...
  5. corelDRAW视频教程
  6. java hex_使用java实现hex和ascii码的转换
  7. 程序化那么神秘,究竟在做什么事情
  8. 7-1 九宫格密码 (100 分)
  9. GAMES101 作业0 环境配置 PC下简单配置i
  10. Java 跨平台获取 MAC 地址的两种方法