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

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

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

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