基于堆栈的虚拟机(如 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的操作码之间存在这种差异的原因是什么?是否有任何特定的理论来设计这些操作码,或者它完全由 VM 本身的特性驱动,还是取决于高级语言结构?