Java虚拟机(JVM)平台无关?相关?

news2025/4/21 23:48:34

计算机的概念模型

计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。

在这里插入图片描述

Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。

目前使用的电子计算机都是实现了这样一个抽象模型的产物,只不过物理实现上不一样。

比如,典型的加法运算。

c = a + b

a和b是输入参数,c是加法的输出。

如何实现运算?

设计一台电脑。CPU里面有一个加法器。现在如何实现加法运算,并将结果输出呢?实际上可以采用如下的方式。

  • 有一根内存条
  • 有一个CPU
  • CPU含有3条指令(加法,读取内存,写入内存)

在这里插入图片描述

那么如何实现上述的加法运算呢?我们可以采用下面的模式

在这里插入图片描述

第一步,将a放入内存

第二步,将b压栈

第三步,CPU从内存读取a和b,并进行加法运算

第四步,将内存中的a和b清空,并将计算后的结果c放入内存

这种计算机被称为栈式计算机。我们不仅可以在CPU中执行加法,还可以加入减法,乘法,除法,等等。

这种计算机的好处是指令集紧凑精简,所有操作都以栈顶元素为对象。

但是,它也存在一些固有缺陷,如执行效率较低(因为对于计算机而言,访问内存操作是一种时间开销极大的行为)、寻址能力受限等。

改进

为了让栈式计算机能够快速地进行运算。CPU可以在内部加入一个寄存器(register),用于总是保存栈顶数据。其计算过程如图。

在这里插入图片描述

由于寄存器处于CPU内部,其访问速度远远大于对内存的直接访问,

后来随着技术的发展,CPU内部的寄存器越来越多。不同的厂商针对各自的架构设计特点,发展出了属于各自架构的寄存器。以x86架构为例(也就是我们常见的AMD或Intel CPU),整数寄存器有32个,并且针对每一个寄存器都标记了一个编号以及别名。 下面以0-2号寄存器为例进行说明。

编号别名
0rax
1rcx
2rdx

于是,CPU发展出下面的形式。

在这里插入图片描述

架构类型

由于不同厂商实现寄存器和访问内存(简称访存)方式的不同,发展出了复杂指令集架构(CISC)和精简指令集架构(RISC)。比如,在x86CISC指令集)上实现加法的指令为

ADD EAX, EBX

该指令将EAX寄存器中的值与EBX寄存器中的值相加后,将结果放入EBX

而典型的ARM架构(RISC指令集)实现加法则为

ADD X0, X1, X2

其含义为将x1x2寄存器中的值相加,将结果放入x0寄存器中。

实际上,不仅二者汇编指令的编写不一致,而且由此翻译成的机器码也不一直。对于x86的加法例子,CPU执行上述加法的机器码为

0x01C3

而对于ARM架构的例子机器码为

0x8B000000

平台相关性

对于同样的加法,在x86和ARM上实现的指令机器码是不一样的。所以,如果有程序要实现一个加法,那么在计算机底层执行时,其执行的内容是不一样的。

对于C语言这样的高级语言而言,当实现一个加法运算。例如

int a,b,c;
a = b + c;

在经过编译器(如gcc)编译后,其源文件被编译生成了可被指定平台识别的二进制可执行文件。该文件中关于实现加法的指令是不同的。因此,尽管高级语言编写的内容一致,但可执行程序在最后一步执行时是平台相关的。

Java程序的平台无关性

所谓的Java程序平台无关性是指由Java语言编写的源程序经过Java虚拟机(JVM)编译后,生成的二进制文件(.class)是一致的。即不管是在ARM上编译生成的.class文件还是x86上生成的.class文件,其内容是一样的。不管什么平台的Java虚拟机都可根据这些.class文件执行。这就与gcc编译器完全不同,gcc生成的二进制文件必须符合平台的要求,否则不能执行。

原因

Java虚拟机(JVM)在运行Java程序的时候首先会读取这些.class文件,将其内容加载到虚拟机内部。至于为什么JVM称为虚拟机呢?这是因为JVM内部实际上是一个由纯软件方式实现的栈式计算机。该栈式计算机被称为hotspot,几乎全部由C++实现。,在hotspot之外,包裹了一层Java语言编写的外壳(jdk)供开发者调用。

在这里插入图片描述

本质上说,在软件层面,所有的Java程序运行都通过纯软件的栈式计算机实现计算。但是栈式计算机的具体计算过程,则由平台的具体指令实现。

这也是为什么openjdk的源码目录结构中会出现不同架构的文件夹。

在这里插入图片描述

不仅如此,为了能够实现**“一次编译,处处执行”**,Java虚拟机还能根据不同的操作系统进行适配,对于有些与操作系统和CPU结合的部分,也提供了不同的实现。

在这里插入图片描述

结论

Java虚拟机即是平台无关,也是平台相关。平台无关是因为其执行过程是由纯软件实现的栈式计算机实现,而平台相关是因为Java虚拟机的具体操作跟平台指令和操作系统相关。

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

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

相关文章

cloudstudio学习笔记之openwebui

代码获取 git clone 参考资料 openwebui官网 https://docs.openwebui.com/getting-started/advanced-topics/development 后端启动 cd backend pip install -r requirements.txt -U sh dev.sh后端启动成功后的界面 在cloudstudio提供的vscode弹出的提示中打开浏览器并在末…

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…

机器学习核心算法全解析:从基础到进阶的 18 大算法模型

在机器学习领域,算法模型是解决实际问题的核心工具。 不同的算法适用于不同的数据场景和任务需求,理解它们的原理与应用是掌握机器学习的关键。 以下将详细解析 18 个核心算法模型,涵盖监督学习、无监督学习、集成学习和深度学习等多个领域…

线性代数 | 知识点整理 Ref 1

注:本文为 “线性代数 | 知识点整理” 相关文章合辑。 因 csdn 篇幅合并超限分篇连载,本篇为 Ref 1。 略作重排,未整理去重。 图片清晰度限于引文原状。 如有内容异常,请看原文。 线性代数知识汇总 Arrow 于 2016-11-27 16:27:5…

【深度学习入门_NLP自然语言处理】序章

本部分开始深度学习第二大部分NLP章节学习,找了好多资料,终于明确NLP的学习目标了,介于工作之余学习综合考量,还是决定以视频学习为主后期自主实践为主吧。 分享一个总图,其实在定位的时候很迷茫,单各章节…

蓝桥杯 二进制问题 刷题笔记

8.二进制问题 - 蓝桥云课 存入N的二进制每一位作为基准数组 算出方案数 从高位往低位用dfs枚举每一位是放1还是放0 #include<iostream> #include<vector> #define ll long long using namespace std;ll dp[65][65]; ll num; ll k; vector<ll> vec;ll cal(l…

mapbox基础,加载视频到地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀加载视频到…

RNN - 循环神经网络(实现)

写在前面 在RNN - 循环神经网络&#xff08;概念介绍&#xff09;中&#xff0c;介绍了一下 RNN 的相关概念&#xff0c;下面就基于概念对 RNN 进行两种实现。从零开始实现和简洁实现。 从 0 开始实现 首先导入必要的环境&#xff0c;使用 H.G.Wells 的时光机器数据集上训练…

【unity游戏开发入门到精通——UGUI】RectTransform矩形变换组件

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、RectTransform组件介绍二、RectTransform组件参数1、Pivot 轴心点2、Ancho…

C语言复习笔记--字符函数和字符串函数(上)

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了 ⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 首先来看下字符函数. 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xf…

Apipost,前端后端测试都在用的接口设计调试工具

大家好&#xff0c;我是袁庭新。给大家介绍一个后端、前端、测试都在用的接口测试工具——Apipost。Apipost主要分为5个大模块&#xff0c;贯穿一个API从设计到测试完成上线的研发全周期。 1.Apipost介绍 Apipost官方地址&#xff1a;https://www.apipost.cn。如下图所示。 A…

十倍开发效率 - IDEA 插件之RestfulBox - API

提高效率不是为了完成更多的任务&#xff0c;而是有充足的时间摸鱼。 快速体验 RestfulBox - API 是 IDEA 的插件&#xff0c;适合本地测试接口&#xff0c;完全不需要对项目进行任何以来。 接口管理&#xff1a;支持接口扫描、浏览、搜索、跳转、导入和导出。支持接口请求&a…

2025 年网络安全的挑战与机遇

2024 年是网络安全领域风云变幻的一年。从备受瞩目的勒索软件攻击所带来的影响&#xff0c;到人工智能工具日益商品化&#xff0c;挑战不断增加。 关键基础设施的漏洞变得极为明显&#xff0c;身份盗窃次数也达到了前所未有的程度。然而&#xff0c;在这一片混乱之中&#xff…

IP数据报

IP数据报组成 IP数据报&#xff08;IP Datagram&#xff09;是网络中传输数据的基本单位。 IP数据报头部 版本&#xff08;Version&#xff09; 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 头部长度&#xff08;IHL&#xff0c;Intern…

【Lua语言】Lua语言快速入门

初始Lua Lua是一种轻量小巧的脚本语言&#xff0c;他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。同时&#xff0c;在目前脚本引擎中&#xff0c;Lua的运行速度占有绝对优势。 变…

Silverlight发展历程(微软2021年已经停止支持Silverlight 5)

文章目录 Microsoft Silverlight 发展历程引言起源与背景&#xff08;2006-2007&#xff09;互联网技术格局与微软的挑战WPF/E 项目的启动 Silverlight 1.0 的诞生&#xff08;2007&#xff09;正式命名与首次发布初步的市场定位 Silverlight 2.0&#xff1a;真正的突破&#x…

充电桩领域垂直行业大模型分布式推理与训练平台建设方案 - 慧知开源充电桩平台

没有任何广告&#xff01; 充电桩领域垂直行业大模型分布式推理与训练平台建设方案 一、平台定位与核心价值 行业首个垂直化AI平台 专为充电桩运营场景设计的分布式大模型训练与推理基础设施&#xff0c;实现"算力-算法-场景"三位一体闭环管理。 核心价值主张&am…

区块链交易自动化新时代:实战体验 Maestro 智能机器人

随着 DeFi 和链上交易生态的不断壮大&#xff0c;链上自动化工具的应用正逐渐从「量化机构」走向普通投资者和开发者。在过去的几个月中&#xff0c;我实测了一款基于 Telegram 的交易机器人 —— Maestro&#xff0c;它极大简化了链上套利、复制交易等流程&#xff0c;对我个人…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

Hbuilder 上的水印相机实现方案 (vue3 + vite + hbuilder)

效果 思路 通过 live-pusher 这个视频推流的组件来获取摄像头拿到视频的一帧图片之后&#xff0c;跳转到正常的 vue 页面&#xff0c;通过 canvas 来处理图片水印 源码 live-pusher 这个组件必须是 nvue 的 至于什么是 nvue&#xff0c;看这个官方文档吧 https://uniapp.dcl…