相信对于很多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还具有语言无关性。

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

时至今日,商业机构和开源机构已经在Java语言之外发展出一大批可以在JVM上运行的语言了,如Groovy、Scala、Jython等。之所以可以支持,就是因为这些语言也可以被编译成字节码(Class文锦啊)。而虚拟机并不关心字节码是有哪种语言编译而来的。详见牛逼了,教你用九种语言在JVM上输出HelloWorld

参考资料

《深入理解Java虚拟机(第二版)》 《深入Java虚拟机》 《Java语言规范——基于Java SE 8》 《Java虚拟机规范第8版》

(全文完)扫描二维码,关注作者微信公众号

python平台无关性_Java是如何实现平台无关性的相关推荐

  1. Python发送手机短信(融合云信平台)

    写下这篇文章,算是记录一下Python发送手机短信的过程.现在通过手机短信推送信息一般比较方便,在企业内部,一般用邮件推送通知,如果不是每个人都有邮箱的话,邮件推送的局限性就出来了.手机短信的实时性比 ...

  2. python微信公众号翻译功能怎么用_使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具...

    距离上次写使用python一步一步搭建微信公众平台(一)已经有几个月了,当中自已也搭建了一个中英文互译的小应用,可是由于英文翻中文好弄,中文翻译成英文一直有问题,知道是编码的问题,但是一直搞不定,于是 ...

  3. python高德 查询县_Python和高德开放平台——地名地址空间化及采集POI信息

    上一篇我们介绍微博开放平台时说道了通过高德开放平台获取地名地址的坐标,今天我们来说一说怎么使用高德开放平台查询相关关键词的地址坐标,或者采集学校.医院.餐厅.公园.企业等POI的信息. 高德开放平台h ...

  4. 用python设计一个简易的英汉互译界面_使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具...

    距离上次写使用python一步一步搭建微信公众平台(一)已经有几个月了,当中自已也搭建了一个中英文互译的小应用,可是由于英文翻中文好弄,中文翻译成英文一直有问题,知道是编码的问题,但是一直搞不定,于是 ...

  5. Python调用纷享销客CRM开放平台API

    使用Python调用纷享销客CRM开放平台API接口: #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:wangzhifeng@tongdo ...

  6. 【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )

    文章目录 一.上下文无关语法 设计 示例 二.上下文无关语法 的歧义性 三.Chomsky 范式 四.上下文无关语法 转为 Chomsky 范式 五.上下文无关语法 转为 Chomsky 范式 示例 ...

  7. python 基于PHP+MySQL的校园兼职招聘平台

    随着我国教育体制的改革.对大学生的要求也越来越高大,学生已经不仅仅只限于学习书本上的知识,他们也需要积极地参加到社会活动中来.其中兼职就是一项很好的锻炼自己的机会.在兼职的时候,不仅能够锻炼自己,同时 ...

  8. KeyMob手机聚合平台已集成多家移动广告平台

    2019独角兽企业重金招聘Python工程师标准>>> 目前,国内领先的移动营销技术人员发布宣布,在KeyMob手机聚合平台正式发布以来,KeyMob手机聚合平台已接入百度广告.ad ...

  9. Gartner发布《2021年企业低代码平台魔力象限》低码一体化平台成趋势

    前段时间,国际知名咨询研究机构Gartner发布了<2021年企业低代码应用平台魔力象限>.此研究内容是Gartner通过产品操作.服务.市场反馈.用户影响力.客户体验.营销执行等等,多个 ...

  10. 《游戏视频主播手册》——第2章 视频直播平台 2.1 主流游戏视频直播平台

    本节书摘来自异步社区<游戏视频主播手册>一书中的第2章,第2.1节,作者 王岩,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第2章 视频直播平台 游戏视频直播 ...

最新文章

  1. itoa函数的递归实现(二级指针实现)
  2. 五个举措:现代化Jenkins 和终结“Jenkinsteins”
  3. 代码视图与StoryBoard.Xib文件视图的跳转
  4. ubuntu下安装jdk
  5. 线性代数【9】 - 特征值和特征向量
  6. matlab图像基础处理小记
  7. php使用excel表格数据处理,php上传excel表格并获取数据
  8. 【Java】Java8新特性Lambda表达式和Stream API
  9. 【Unity3D】Photon环境搭建
  10. Phoenix创建Hbase二级索引
  11. Java软件开发基础入门之工作流
  12. 上海立信会计师事务所专场 — 纯前端表格技术应用研讨会
  13. Python三维绘图--Matplotlib
  14. 微型计算机电路试卷,微机原理试卷及答案2
  15. 【EE】案例分享-如何设计继电器电路?
  16. 数学中常见的maxmin,min max
  17. hyperf使用curl产生的超时问题
  18. jQuery添加、删除元素
  19. 基于微信小程序的电影院订票选座系统设计 毕业设计论文
  20. COM的INTERFACE使用实践

热门文章

  1. 二维数组绑定到Dropdownlist
  2. 为什么谈设计总爱提老庄之道
  3. javaSE基础之字符串
  4. android studio2.4,Android Studio 2.4 Preview 7 发布
  5. c语言迷宫算法坐标怎么定义,[原创]递归随机迷宫生成算法详解
  6. wⅰndows办公软件2003,办公软件2003
  7. java复制数组函数_java 数组复制:System.arrayCopy 深入解析
  8. ckpt下载 deeplabv3_Ubantu下 用deeplabV3+训练自己的数据集 你可能遇到的所有坑都在这了...
  9. 手把手带你用react hook撸一遍class组件的特性
  10. 聊聊rocketmq的SequenceProducerImpl