【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.mzph.cn/news/584017.shtml

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

相关文章

Net6 Core webApi发布到IIS

Net6 Core Api发布到IIS不同于webapi,依赖框架不同,配置也移至项目内Program.cs 一、发布到指定文件夹和IIS,不过注意IIS应用程序池选择的是 “无托管代码“ 在IIS管理器中点击浏览,访问接口路径报500.19,原因是所依赖…

机器学习之K-means聚类

概念 K-means是一种常用的机器学习算法,用于聚类分析。聚类是一种无监督学习方法,它试图将数据集中的样本划分为具有相似特征的组(簇)。K-means算法的目标是将数据集划分为K个簇,其中每个样本属于与其最近的簇中心。 以下是K-means算法的基本步骤: 选择簇的数量(K值)…

HTTP协议编程实战(一)实战一

http使用在应用层,http是单次连接,一次只能发送一个请求。http是一个无状态协议,他不会保存客户端的状态信息,从而提高运行效率,保持比较快的响应速度。http是一种面向对象的协议,允许传送任意数据类型的对…

2024年医院设备维修培训安排

在你还考虑该不该干的时候别人已经走好远了 小时候觉得忘带作业是天大的事,高中的时候,觉得考不上大学是天大的事,恋爱的时候,觉得跟喜欢的人分开是天大的事,到现在回头看看,那些难以跨过的山,…

1200PLC连接分布式IO组态编程应用

SMART PLC作为S7-1200PLC的智能IO从站设备组态和编程应用详细介绍请参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/130257474https://rxxw-control.blog.csdn.net/article/details/130257474这篇博客我们介绍S7-1200PLC和分布式IO连接组…

【C语言深度剖析——第一节(关键字1)】《C语言深度解剖》+蛋哥分析+个人理解

你未曾见过火光,难怪甘愿漂泊寒夜 本文由睡觉待开机原创,未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步! 首先简单介绍一下《C语言深度解剖》: 全书特点&am…

BUUCTF Reverse/[2019红帽杯]Snake

BUUCTF Reverse/[2019红帽杯]Snake 下载解压缩后得到可执行文件,而且有一个unity的应用程序,应该是用unity编写的游戏 打开是一个贪吃蛇游戏 用.NET Reflector打开Assembly-CSharp.dll。(unity在打包后,会将所有的代码打进一个Ass…

交叉验证的种类和原理(sklearn.model_selection import *)

交叉验证的种类和原理 所有的来自https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation-iterators并掺杂了自己的理解。 文章目录 前言一、基础知识1.1 交叉验证图形表示1.2 交叉验证主要类别 二、部分交叉验证函数(每类一个&#xff0…

【C++入门(一)】:详解C++语言的发展及其重要性

🎥 屿小夏 : 个人主页 🔥个人专栏 : C入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 🌤️什么是C🌤️C的发展史🌤️C的重要性☁️语言的广泛度☁️C的领域⭐…

绝地求生:大逃杀,鼠标灵敏度设置教程及枪法练习技巧 鼠标灵敏度怎么设置

《绝地求生大逃杀》鼠标灵敏度怎么设置?作为一款FPS游戏,如何调整鼠标参数是大家急需掌握的,今天闲游盒带来“院长尼克”分享的《绝地求生大逃杀》鼠标灵敏度设置教程及枪法练习技巧,废话不多说,下面我们一起来看吧。 …

C语言——小细节和小知识7

一、逆序字符串 1、递归1 #include <stdio.h> #include <string.h>void ReverseArray(char *str) {char temp *str;//1int len (int)strlen(str);*str *(str len - 1);//2*(str len - 1) \0;//3if(strlen(str 1) > 2)//只要字符串还大于2&#xff0c;就…

【nodejs】Express概念与使用介绍

Express Express是基于Node.js平台&#xff0c;从内置模块http封装出来的第三方模块&#xff0c;可以更方便的开发Web服务器。 中文官网&#xff1a; http://www.expressjs.com.cn/ 一、基本使用 // 导入express const express require(express) // 创建web服务器 const a…

SpringBoot 2 集成Spark 3

前提条件: 运行环境&#xff1a;Hadoop 3.* Spark 3.* ,如果还未安装相关环境&#xff0c;请参考&#xff1a; Spark 初始 CentOS 7 安装Hadoop 3 单机版 SpringBoot 2 集成Spark 3 pom.xml <?xml version"1.0" encoding"UTF-8"?> <pro…

【数据结构和算法】---二叉树(2)--堆的实现和应用

目录 一、堆的概念及结构二、堆结构的实现2.1堆向下调整算法2.2堆向上调整算法2.3删除堆顶元素2.4插入元素2.5其他函数接口 三、堆结构的应用3.1堆排序3.2Top-k问题 四、堆概念及结构相关题目 一、堆的概念及结构 如果有一个数字集合&#xff0c;并把它的所有元素按完全二叉树…

MS6459字符叠加可兼容MAX7456

MS6459 是 OSD 电路,与 MCU 配合使用,可控制不同类型的显示系统。显示点阵为 1218&#xff0c;内置部分数字、英文字符、拉丁字符和中文字符。电路集成有上电复位电路和 VRAM 清零电路用于减轻 MCU 的工作量。 主要特点 输入信号&#xff1a;混合视频信号&#xff1b; 显示字符…

ksuser.dll文件缺失怎么办?软件或游戏无法启动,一键自动修复

很多小伙伴反馈&#xff0c;自己的电脑中了病毒&#xff0c;被杀毒软件清理后&#xff0c;在打开游戏或软件的时候&#xff0c;经常会报错“提示无法找到ksuser.dll文件&#xff0c;建议重新安装软件或游戏”。自己根据提示重装后&#xff0c;还是报错&#xff0c;不知道应该怎…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…

【C语言】程序练习(四)

大家好&#xff0c;这里是争做图书馆扫地僧的小白。非常感谢各位的支持&#xff0c;也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏&#xff0c;内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持&#xff0c;有任何问题欢迎私信与…

智能分析网关V4+太阳能供电模式,搭建鱼塘养殖远程视频监控方案

一、行业背景 传统的鱼塘养殖模式由于养殖区域面积大、管理难度高&#xff0c;经常会出现偷钓者、盗窃鱼苗、非法入侵等监管难题&#xff0c;给养殖户带来了不小的经济损失。为了解决这些问题&#xff0c;搭建鱼塘远程监控系统成为了必要之举。通过远程监控系统&#xff0c;管…

别一言不合就重装系统!Windows 无法正常启动先试试这些办法

你是否遇到过在升级或安装 Windows 10 操作系统&#xff0c;Windows 无法正常启动进入桌面&#xff0c;甚至陷入无限循环。造成的原因有很多&#xff0c;比如 Windows 更新&#xff0c;安装了新的软件或者驱动程序&#xff0c;系统文件损坏等等。那遇见 Windows 启动不了怎么办…