Реклама:

А теперь посмотрим, какое отношение язык Java имеет к IJVM. В листинге 4.1 представлен небольшой фрагмент программы на языке Java. Компилятор Java должен был бы переделать эту программу в программу на языке ассемблера IJVM, приведенную в листинге 4.2. Цифры с 1 по 15 в левой части листинга, а также комментарии после символов двойной косой черты (//) не являются частью самой программы. Они даны для наглядности и просто облегчают понимание. Затем ассемблер Java транслировал бы ее в программу в двоичном коде. Эта программа представлена в листинге 4.3. (В действительности результатом работы компилятора Java сразу является двоичный код.) В данном примере i - локальная переменная 1, j - локальная переменная 2, а к - локальная переменная 3.

Листинг 4.1. Фрагмент программы на языке Java

i=j+k; if(I==3) k=0;

else

J=M;

Листинг 4.2. Программа для IJVM на языке ассемблера Java

1 ILOAD j // i=j+k

2 I LOAD k

3 I ADD

4 ISTORE i

5 I LOAD i // if(i==3)

6 BIPUSH 3

7 IFJCMPEQ LI

8 I LOAD j //

9 BIPUSH 1

10 ISUB

11 ISTORE j

12 GOTO L2

13 LI: BIPUSH 0 // k=0

14 ISTORE k

15 L2:

Листинг 4.3. Программа для IJVM в шестнадцатеричном коде

0x15 0x02 0x15 0x03 0x60

ОхЗб 0x01 0x15 0x01 0x10 0x03 0x9F 0x00 OxOD 0x15 0x02 0x10 0x01

0x64

0x36 0x02 0хА7 0x00 0x07 0x10 0x00 0x36 0x03

Скомпилированная программа проста. Сначала j и к помещаются в стек, складываются, а результат сохраняется в i. Затем i и константа 3 помещаются в стек и сравниваются. Если они равны, то совершается условный переход к L1, где к получает значение 0. Если они не равны, то выполняется часть программы после команды IF_ICMPEQ. После этого осуществляется переход к L2, где объединяются части el se и then.

Стек операндов для программы, приведенной в листинге 4.2, изображен на рис. 4.12. До начала выполнения программы стек пуст, что показано горизонтальной чертой над цифрой 0. После выполнения первой команды ILOAD j помещается в стек (прямоугольник над цифрой 1 на рисунке). Цифра 1 означает, что выполнена первая команда. После выполнения второй команды IL0AD в стеке оказываются уже два слова, как показано в прямоугольнике над цифрой 2. После выполнения команды IADD в стеке остается только одно слово, которое представляет собой сумму j + к. Когда верхнее слово выталкивается из стека и сохраняется в i, стек снова становится пустым.

Компиляция IJVM

Рис. 4.12. Состояние стека после выполнения каждой команды в программе, приведенной в листинге 4.2

Команда 5 (IL0AD) начинает оператор if. Эта команда помещает i в стек. Затем идет константа 3 (в команде 6). После сравнения стек снова становится пустым (7). Команда 8 является началом фрагмента else. Он продолжается вплоть до команды 12, когда совершается переход к метке L2.

Набор IJVM-команд || Оглавление || Пример реализации микроархитектуры