Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
举个最简单的例子,分别使用这两种指令集计算“1+1”的结果
//基于栈的指令
iconst_1
iconst_1
iadd
istore_0
//基于寄存器指令
mov eax,1
add eax,1
基于栈的指令集主要的优点就是可移植, 缺点是执行速度慢,相同操作指令数要多很多。
寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免地要受到硬件的约束。
虽然栈架构指令集的代码非常紧凑,但是完成相同功能所需的指令数量一般会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令数量。更重要的是,栈实现在内存之中,频繁的栈访问也就意味着频繁的内存访问,相对于处理器来说,内存始终是执行速度的瓶颈。
两种架构之间的区别:
基于栈式架构的特点:
- 设计和实现更简单,适用于资源受限的系统;
- 避开了寄存器的分配难题:使用零地址指令方式分配。
- 指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小
- 编译器容易实现。
- 不需要硬件支持,可移植性更好,更好实现跨平台