基于堆栈的虚拟机(如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,为什么我们需要上面的操作码?还有其他类似的。
我很想知道,不同越南船民的操作码有何不同?是否有任何具体的理论来设计这些操作码,或者它完全是由VM本身的特性驱动的,还是依赖于高级语言结构?
发布于 2012-06-29 13:15:48
通常,指令集是通过检查为类似机器生成的代码来设计的,以确定哪些指令发生得最频繁。设计人员还将使用他们提出的指令编写编译器(或者至少是GCC的后端),以查看结果代码的效率(无论是在代码密度还是在执行速度方面)。我确信,CLR的设计者仔细研究了JVM,看看如何改进它,就像JVM的设计者从早期的VM (p-system,Forth,Smalltalk)中获得了洞察力一样。
一般ISA设计理论认为,最常用的操作码应该是最短的,因为这将导致最佳的代码密度(也是最好的性能,因为较短的指令往往更容易解码)。设计实际的编码方案(opcode+operand(S)+数据类型(S)+寻址模式(Art))完全取决于ISA架构师,是一门涉及大量经验的“黑人艺术”技能之一。
发布于 2012-06-29 11:33:06
我只知道在指令集(ISA)设计中考虑问题的唯一一本书是和,其他大多数关于CA的书只是提供了一个分类,而不是走得太远。
对于您手头的问题,您必须与代码的密度进行权衡。一个ldc.i4就足以提供这个功能,但是每次使用它,它都需要1字节的指令和4字节的常量。仅使用1字节指令就可以提供一些特殊用途的ldc.i4.xx,这有助于提高代码的密度。但是很明显,你只能有256个一个字节的指令,所以你必须明智地使用它们。
而VM的另一个因素(对于硬件实现来说,这个因素不太正确)是这样的特殊指令不仅在指令流中占据更少的位置(对缓存压力和速度都有好处),这些指令将比它们的等价指令执行得更快。
https://softwareengineering.stackexchange.com/questions/154837
复制相似问题