如何设计基于堆栈的机器的指令集?

时间:2012-06-29 10:31:41

标签: jvm clr instruction-set vm-implementation stack-machine

基于堆栈的虚拟机(如CLR和JVM)具有不同的指令集。在创建虚拟机时是否有任何理论来设计指令集?例如有一些JVM指令集可以将0-5的常量加载到堆栈

iconst_0
iconst_1
iconst_2
iconst_3
iconst_4
iconst_5

而在CLR中有一些指令集可以将数字从0加载到8到堆栈中,如下所示

ldc.i4.0
ldc.i4.1
ldc.i4.2
ldc.i4.3
ldc.i4.4
ldc.i4.5
ldc.i4.6
ldc.i4.7
ldc.i4.8

为什么没有ldc.i4.9,如果ldc.i4 <int32 (num)>为何我们需要上述操作码呢?还有其他像这样的人。

我很想知道不同虚拟机的操作码之间存在差异的原因是什么?是否有任何特定的理论来设计这些操作码,或者它完全是由VM本身的特性驱动还是取决于高级语言结构?

1 个答案:

答案 0 :(得分:0)

典型的答案是,因为它们是“字节码”,所以只有256个,所以你不想用完整个范围。您需要为初始设计时未考虑的新字节码留出空间。

因此,通常所做的是对常见模式的统计分析并尝试缩短它们。 (即:而不是总是必须使用通用的ldc,有iconst0等......作为更短/更密集的版本)。

我猜想,在设计时,CLR和JVM人员只需要非常小的数字。