Как разработать набор команд для стековой машины?
Виртуальные машины на основе стека, такие как 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)>
почему нам нужны вышеуказанные коды операций? И есть другие, подобные этим.
Мне не терпится узнать, в чем причина такой разницы между кодами операций разных виртуальных машин? Существует ли какая-либо конкретная теория для разработки этих кодов операций, или она полностью определяется характеристиками самой ВМ или зависит от языковых конструкций высокого уровня?
1 ответ
Типичный ответ таков: поскольку они являются "байт-кодами", их всего 256, поэтому вы не хотите использовать весь диапазон. Вам необходимо оставить место для новых байт-кодов, которые не были учтены во время первоначального проектирования.
Таким образом, то, что обычно делается, - это статистический анализ общих шаблонов и попытка их укоротить. (то есть: вместо того, чтобы всегда использовать универсальный ldc, используйте iconst0 и т. д. в качестве более коротких / более плотных версий).
Тогда я бы предположил, что при разработке люди CLR и JVM видели только необходимость в очень небольших количествах.