1

基于堆栈的虚拟机(如 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 本身的特性驱动,还是取决于高级语言结构?

4

1 回答 1

0

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

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

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

于 2012-07-03T04:24:30.560 回答