Java编译器输入的指令基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
1. 具体来说,这两种架构之间的区别:
- 基于栈市指令集架构的特点
- 设计和实现更加简单,只用于资源受限的系统
- 避开 了寄存器的分配难题:使用零地址指令分配方式
- 指令流中的大部分是零地址指令,其执行过程依赖于栈的操作。指令集更小,编译器容易实现
- 不需要硬件支持,可移植性好,更好实现跨平台
- 基于寄存器架构的特点
- 典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机
- 指令集架构完全依赖于硬件,可移植性差
- 性能有优秀和执行更加高效
- 花费更少的指令去完成一项操作
- 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集都是零地址指令为主
2. 我们来看看简单的基于栈式指令集架构的例子:如下代码和我们用 javap -c 编译后的部分结果
public class Main {
public static void main(String[] args) {
int i = 2;
int j = 3;
int k = i + j;
}
}
首先声明一个常量2,然后放入操作数栈1中。再次声明一个常量3,放入操作数栈2中。然后系统加载操作数栈1中的和操作数栈2中的两个数执行加操作,将结果放入操作数栈3中,最后返回结果。
public static void main(java.lang.String[]);
Code:
0: iconst_2
1: istore_1
2: iconst_3
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_3
8: return
}