【JVM篇】Java是如何实现平台无关的?

在这里插入图片描述

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

  • ✔️什么是平台无关性
  • ✔️平台无关性的实现
    • ✔️Java虚拟机
    • ✔️字节码
    • ✔️Java语言规范
  • ✔️扩展知识仓
    • ✔️平台无关性的好处
    • ✔️ 有哪些语言实现了平台无关?
    • ✔️Java中基本数据类型的大小都是确定的吗?


✔️什么是平台无关性


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


也就是说,用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语言为平台无关性提供强了强有力的支持。


✔️扩展知识仓


✔️平台无关性的好处


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


因为其平台无关性,所以ava程序可以运行在各种各样的设备上,尤其是一些嵌入式设备,如打印机、扫描仪、传真机等。随着5G时代的来临,也会有更多的终端接入网络,相信平台无关性的Java也能做出一些贡献


同时,Java通过Swing,FX,可以对客户端进行编写,开发者可以通过Java编写一次,就可以运行到IOS或者Windows,Linux等OS中,也减轻了开发者的开发负担


对于Java开发者来说,Java减少了开发和部署到多个平台的成本和时间。真正的做到一次编译,到处运行。


✔️ 有哪些语言实现了平台无关?


1 . 所有基于JVM的语言都实现了平台无关,如Groovy、Scala、Jthon等


2 . 其他的有VM的语言也同样实现了亚台无关,如C#


脚本语言: JavaScript,Python,Php


✔️Java中基本数据类型的大小都是确定的吗?


非也非也,boolean类型的大小在不同的情况下是不确定的,依据JVM规范第2版:


Although the Java virtual machine defines a boolean type, it only provides very limited support for it.


There are no Java virtual machine instructions solely dedicated to operations on boolean values.


instead, expressions in the Java programming lanquage that operate on boolean values are compiled
to use values of the Java virtual machine int data type.


The Java virtual machine does directly support boolean arrays. lts newarrayinstruction enablescreation of boolean arrays. Arrays of type boolean are accessed and modified using the byte arrayinstructions baload and bastore.2


The Java virtual machine encodes boolean array components using 1 to represent true and 0torepresent false. Where Java programming language boolean values are mapped by compilers tovalues of Java virtual machine type int, the compilers must use the same encoding.

1 The first edition of The JavaTM Virtual Machine Specification did not consider boolean to be a Javavirtual machine type. However, boolean values do have limited support in the Java virtual machine.This second edition clarifies the issue by treating boolean as a type.


2 ln Sun’s JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in theJava programming language are encoded as Java virtual machine byte arrays, using 8 bits perboolean element.


简单看下来,如果是单个的布尔类型,长度为32bit,如果是布尔数组,则每个布尔值的长度为8bit.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307020.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shiro1.10版本后-IniSecurityManagerFactory过期失效

1、问题概述? 今天在研究了shiro的新版本shiro1.13.0版本,发现用了很长时间的IniSecurityManagerFactory工厂失效了。 从下图中可以看出,在新版本中IniSecurityManagerFactory被打上了过期线了。 那么问题来了,新版本如何使用呢…

六、从0开始卷出一个新项目瑞萨RZN2L之loader app分离工程优化

六、loader app分离工程 6.1 概述 6.2 官方资料与不足 6.3 loader app分离工程的优化 6.3.1 自动调节合并appsection 6.3.2 loader中使用外设 6.3.3 app使用sram mirror 6.3.4 sram atcm同时使用 六、从0开始卷出一个新项目之瑞萨RZN2L loader…

2024年科技行业十大经济预测

当我们站在新的一年的风口浪尖上时,科技行业正准备迎接重大变革和创新,这些变革和创新将塑造2024年的经济格局。以下是未来一年科技行业的十大经济预测。 低代码:低代码和无代码平台从 3 年前开始被大规模的应用,发展到现在已经逐…

最优化方法Python计算:无约束优化应用——逻辑回归模型

S型函数 sigmoid ( x ) 1 1 e − x \text{sigmoid}(x)\frac{1}{1e^{-x}} sigmoid(x)1e−x1​将全体实数 R \text{R} R映射到 ( 0 , 1 ) (0,1) (0,1),称为逻辑函数。其图像为 该函数连续、有界、单调、可微,性质量好。拟合函数为 F ( w ; x ) sigmoi…

阿里云服务器优惠活动大全

阿里云服务器优惠活动大全包括:云服务器新人特惠、云小站、阿里云免费中心、学生主机优惠、云服务器精选特惠、阿里云领券中心等,活动上阿里云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年63元,…

电脑开机自动断电,简单4招,快速解决!

“不知道我的电脑最近是怎么回事,每次一开机就会出现自动断电的情况,有什么方法可以解决吗?” 在使用电脑时,由于电源供应不稳定或过热,以及各种硬件问题,可能会导致电脑开机自动断电。遇到这种情况&#x…

深度学习框架输出可视化中间层特征与类激活热力图

有时候为了分析深度学习框架的中间层特征,我们需要输出中间层特征进行分析,这里提供一个方法。 (1)输出中间特征层名字 导入所需的库并加载模型 import matplotlib.pyplot as plt import torch import torch.nn as nn from torch.nn import functiona…

C语言 linux文件操作(一)

文章目录 一、linux文件权限1.1文件描述符1.2文件描述符的范围和默认值1.3打开文件和文件描述符1.4标准文件描述符1.5文件描述符的重定向和关闭1.6I/O 操作1.7使用文件描述符进行进程通信1.8资源限制 二、C语言文件读写2.1open 函数2.2 flags参数详解2.3 lseek 函数 一、linux文…

竞赛保研 基于情感分析的网络舆情热点分析系统

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

爬虫学习(1)--requests模块的使用

前言 什么是爬虫 爬虫是一种自动化工具,用于从互联网或其他计算机网络上获取数据。它可以模拟人的行为,自动访问网页,提取感兴趣的数据,并将其存储到本地计算机或数据库中。爬虫通常用于搜索引擎、数据分析、信息聚合等领域&…

Lichee Nano(F1C100s) Linux 开发环境搭建

Lichee Nano是基于全志科技的F1C100s(ARM 926EJS内核)高性能soC芯片设计的迷你开发板。开发板设计小巧精致,将芯片的所有资源都引出,板载USB、Flash、TF卡、4OP LCD接口等,并把所有IO资源引出,方便开发者拓展使用,非常…

24年软件测试的晋升之路与能力要求,“我“该何去何从?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件测试人员的…