基于堆栈的虚拟机(如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本身的特性驱动还是取决于高级语言结构?
答案 0 :(得分:0)
典型的答案是,因为它们是“字节码”,所以只有256个,所以你不想用完整个范围。您需要为初始设计时未考虑的新字节码留出空间。
因此,通常所做的是对常见模式的统计分析并尝试缩短它们。 (即:而不是总是必须使用通用的ldc,有iconst0等......作为更短/更密集的版本)。
我猜想,在设计时,CLR和JVM人员只需要非常小的数字。