jvm的一些困惑

zw0283 2016-11-28 02:46:50
刚刚接触jvm的知识,还请知道的朋友解答一下。

前提:假设我现在要用c实现一个算整数加法的jvm。(iadd指令)
我举个栗子,比如我操作数栈现在有1和2两个数,那么
【1和2出栈】
【相加为3】
【将3入栈】

这个三个过程,是谁做的?
(1)C语言做的,实现的代码类似这样:

int a = pop();
int b = pop(); // 2个操作数出栈
int c = a + b; // 相加结果,相加的操作是c来做的
push(c); // 结果入栈

(2)cpu做的,jvm把iadd这个指令,直接翻译称为cpu认识的机器码,然后具体的相加操作是由cpu直接执行的,与任何语言都无关。

这个问题是我目前在学习过程中未能理解的。
如果是情况1,那么我可不可以理解为,java语言实际上就是对c/c++的一种高级“封装”?所有的java语法,都可以认为是c/c++的语法糖?所有java的操作(加减乘除之类的)都要委托给c/c++去实现?
如果是情况2,那有没有资料说明一下字节码指令和机器码的转换关系?
如果以上2种情况都不对,那到底是什么样的呢?
...全文
296 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbaldy 2016-12-02
  • 打赏
  • 举报
回复
是第二种,直接把Java字节码转为CPU可以读懂的汇编指令,你要想看怎么转的,可以用hsdis查看hotspot的jit编译器生成的结果,具体如何jit,你自己下openjdk的hotspot源码看即可
树成 2016-11-30
  • 打赏
  • 举报
回复
楼主应该不是计算机科班出生吧,你缺失了一门课程的知识,计算机原理和汇编语言编程,当然还有编译原理的一些知识,计算机CPU的运算都是要通过寄存器和微指令集完成运算,jvm的栈其实是模拟寄存器,而jvm指令就是模拟微指令集,所以jvm叫做java虚拟机,它完全就是模拟CPU的运算过程,只是它自己建立了一套运算规则和真实CPU进行隔离,通过这种方式完成跨平台,实际CPU的寄存器和微指令集都是不同的,有的机器可能不是CPU而只有运算芯片,它没有寄存器,这种情况根据jvm来完成指令隔离转换做到跨平台
tianfang 2016-11-29
  • 打赏
  • 举报
回复
首先,楼主要了解一下基本的CPU指令集和编译原理 两个数字相加,直接一条CPU指令就执行了。c语言中的堆栈,在编译的过程中,就转换为CPU指令,生成相应操作系统的可执行文件 java的编译先编译为中间的字节码,就是class文件,然后jvm再做实时编译,生成相应CPU 指令集来运行 c/c++必须先编译成为相应CPU 操作系统的可执行文件才能工作,导致大量的交叉编译需求,而这是一个非常复杂的问题
爱睡觉的阿狸 2016-11-28
  • 打赏
  • 举报
回复
jdk包含jvm
爱睡觉的阿狸 2016-11-28
  • 打赏
  • 举报
回复
不能把java单纯的认为是c/c++的封装,因为java有它自己的语法,独有的特性,从语言层面上它是独立的,只不过它所依赖的虚拟机jdk是c和c++开发的罢了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧