基于堆栈的虚拟机,如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本身的特征驱动的,或者依赖于高级语言构造?
发布于 2012-07-03 12:24:31
典型的答案是,因为它们是“字节码”,所以只有256个字节码,所以您不希望用完整个范围。您需要为在初始设计时没有考虑到的新字节码留出空间。
因此,通常要做的是对常见模式进行统计分析,并尝试缩短它们。(例如:不必总是使用通用的ldc,使用iconst0,等等...作为更短/更密集的版本)。
然后我会猜测,在设计时,CLR和JVM人员认为只需要非常小的数字。
https://stackoverflow.com/questions/11260193
复制相似问题