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

Jvm 如何设计基于堆栈的机器的指令集?,jvm,clr,instruction-set,vm-implementation,stack-machine,Jvm,Clr,Instruction Set,Vm Implementation,Stack Machine,基于堆栈的虚拟机(如CLR和JVM)具有不同的指令集。在创建虚拟机时设计指令集有什么理论依据吗?e、 g.有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 为什

基于堆栈的虚拟机(如CLR和JVM)具有不同的指令集。在创建虚拟机时设计指令集有什么理论依据吗?e、 g.有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
,我们为什么需要上述操作码?还有其他类似的


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

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

因此,通常要做的是对常见模式进行统计分析,并试图缩短它们。(即:不必总是使用通用ldc,而是将iconst0等作为较短/较密集的版本)

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