d, land, lastore, lcmp, lconst_0, lconst_1, ldiv, lload_0, lload_1, lload_2, lload_3, lmul, lneg, lor, lrem, lreturn, lshl, lshr, lstore_0, lstore_1, lstore_2, lstore_3, lsub, lushr, lxor, monitorenter, monitorexit, nop, pop, pop2, return, saload, sastore, swap;
В· < мнемонічне _ ім'я > < мітка i> >; Таку форму мають команди переходу: goto, goto_w, if_acmpeq, if_acmpne, if_acmpge, if_acmpgt, if_icmple, if_icmplt, if_icmpne, ifeq, ifge, ifgt, ifle, iflt, ifne, ifnonull, ifnull, jsr, jsr_w;
В· < мнемонічне _ ім'я > < ціле i> число >; Число має задовольняти обмеженням конкретної команди: aload, astore, dload, dstore, fload, fstore, iload, istore, lload, lstore, ret, bipush, sipush, wide_aload, wide_astore, wide_dload, wide_dstore, wide_fload, wide_fstore, wide_iload, wide_istore, wide_lload, wide_lstore, wide_ret;
В· <мнемоніческое_імя> {<Полное_імя_класса> | @} :: <ім'я_поля>: <тіп_поля>; Тіп_поля - ім'я примітивного типу, прийняте в мові Java, або ім'я класу. Команди: getfield, putfield, getstatic, putstatic;
В· <мнемоніческое_імя> ... , <Тіп_параметра_ n >): <тіп_возвращаемого значення>; Тут типи параметрів і значення, що повертається - імена примітивних типів, прийняті в мові Java, імена класів, або (тільки для повертається значення) void. Команди: invokespecial, invokestatic, invokevirtual;
В· <мнемоніческое_імя> <Полное_імя_класса>; Такий формат мають наступні команди: anewarray , checkcast , instanceof , new ;
В· <мнемоніческое_імя> <Целое_число_индекс_переменной> <целое_чісло>; Команди: iinc , wide _ iinc ;
В· <мнемоніческое_імя> <Тип> <константа>; - команди ldc , ldc _ w , ldc _2 w . Тут тип - int, float, string ( для ldc, ldc_w), double, long ( для i> ldc_2w). Константа повинна мати відповідний тип (цілі числа записуються звичайним способом, речові - в десяткового або експоненційної формі, у форматі, прийнятому в Java, рядки записуються в подвійних лапках, при цьому дві подвійні лапки всередині рядка інтерпретуються як одна подвійна лапка в рядку);
В· invokeinterface ... , <Тіп_аргумента_2>): <тіп_возвращаемого_значенія> <Целое_чісло>; - типи - аналогічно іншим командам виклику методів;
В· multianewarray <полное_імя_класса> <Чісло_ізмереній>;
В· newarray
В· tableswitch <чісло_1>: <чісло_ n > default : <метка_0> <Чісло_1>: <метка_1> ... <Чісло_ n >: <метка_ n >; Тут числа чісло_1 ... чісло_ n повинні бути послідовними цілими числами. При цьому числа, зазначені відразу після мнемонічного імені команди, повинні збігатися з кордонами діапазону чисел, для яких вказані мітки переходу. lookupswitch default : <метка_0> <чісло_1>: <метка_1> ... <Чісло_ n >: <метка_ n >; Тут серед чисел, для яких вказані мітки переходу, не повинно бути однакових. Ці числа мають бути цілими, вони не зобов'язані бути впорядковані за зростанням, сортування відбувається при обробці команди компілятором. br/>
В
Тестові приклади.
Для тестування компілятора використовувалися, зокрема, такі приклади:
1.
% файл Summator.jsm
public class Summator;
fields;
private m_i: int;
methods;
% Конструктор. Заносить в полі m_i ціле число, що міститься в рядку,
% переданої як параметр. У разі, якщо рядок не містить
% правильної запису цілого числа, або це число від'ємне,
% то виводиться повідомлення про помилку.
public (java.lang.String): void;
maxstack 4;
maxlocals 2;
aload_0; % This
dup;
invokespecial java.lang.Object :: (): void;
aload_1; % Arg1
begin_try:
invokestatic java.lang.Integer :: parseInt (java.lang.String): int;
dup;
iconst_0;
if_icmpge end_try;
new java.lang.Exception;
dup;
invokespecial java.lang.Exception :: (): void;
athrow;
end_try:
putfield @ :: m_i: int;
return;
exception
pop;
getstatic java.lang.System :: out: java.io.PrintStream;
ldc string "Invalid argument";
invokevirtual java.io.PrintStream :: println (java.lang.String): void;
...