java虚拟机简单分析一下这两种执行的区别(上)

取得小但每天的进步!

在第二个方法调用中,我们主要学习确定目标方法。在本文中,我们将看看方法内容的具体实现。

目前基于虚拟机的语言中,既有编译执行(以c、c++为代表),也有解释执行(如Python、JavaScript等)。

让我们简单分析一下java虚拟机这两种实现的区别。

编译执行:编译器将源文件编译成目标机器码文件,运行时不需要重新编译虚拟机c语言运行环境,下次运行文件时也不需要重新编译。

一个典型的例子是C语言。由于作者没有C语言环境,这里就不举例了(我当然不能说我把学到的C语言知识都还给了老师,机智!)。

由于编译后的语言直接转化为机器码文件,不再需要编译,这也是C语言的执行效率高于Java语言的原因之一。

解释执行:无需编译,每次执行时,将程序逐行解释成机器语言。

我们以 Python 语言为例。写好的.py文件可以直接通过python命令运行。

至于java属于哪一种语言,我来说说我个人的看法,java属于一种混合语言。

javac.exe可以简单的看成是一个Java编译器,将.java文件编译成Class字节码文件(中间码)。

java.exe 可以简单地看成是一个Java 解释器。在java虚拟机中,解释器是JVM的一部分,用来解释和执行Java编译器编译出来的程序。解释器将 Class 字节码文件翻译成机器码进行解释和运行。虽然说多一个操作影响效率,但正是因为中间代码才实现了跨平台。

所以很难说到底应该属于哪种类型的java。有兴趣的朋友推荐搜索大神RednaxelaFX的文章。由于文章不允许发链接,想要链接的朋友可以私信我。

接下来,我们来介绍一下指令集:

1. 基于寄存器的指令集架构:这是大多数操作系统使用的方法。

寄存器是 CPU 的一部分,可用于临时存储指令、数据和地址。

优点是执行速度非常非常快(没有pop和push,指令比栈操作少);缺点是受硬件限制。

如果根据寄存器进行1+1,可能是:

1. mov eax,1;

2. 添加 eax,1;

2. 基于栈的指令集架构(ISA):这是Java 使用的,指令操作在操作数栈上进行。

优点:便携性好,不依赖操作系统;代码紧凑,编译器实现更简单;缺点是执行速度较慢。

我们还是以加法为例。如下图,定义两个方法进行加法运算。

打开字节码文件查看方法的执行指令,为什么定义了两个方法,主要看,当多定义一个变量c时,字节码指令显示确实多了一些操作。

我们根据操作数栈简单分析一下add1()方法的执行过程:

1. ILOAD 1:将局部变量表中第一个槽的整数值复制到数据栈顶。

2. ILOAD 2:将局部变量表中第二个槽的整数值复制到数据栈顶。

3. IADD:弹出操作数栈顶的前两个元素,进行整数加法,把结果放到栈顶。

4. ISTORE 3:弹出栈顶元素,存入局部变量表的第三个槽。

以下步骤省略…

但是虚拟机中实际的指令执行过程和文件中的顺序可能不一样,虚拟机会对其进行优化。

喜欢文章或者想一起学习的朋友可以关注我,给我个赞。我会继续更新它。如果您对文章有任何疑问或不当之处虚拟机c语言运行环境,请给我留言。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论