46867 (Ассемблер для платформы Java), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Ассемблер для платформы Java", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "46867"

Текст 3 страницы из документа "46867"

Каждый файл исходного текста компилируется в один файл класса. Файл исходного текста должен иметь следующую структуру:

[модификаторы_доступа] {class|interface} ;

[extends ;]

[implements , , ... , <интерфейс_n>;]

[fields;

]

[methods;

]

Здесь и далее в квадратные скобки заключены необязательные элементы, в фигурные - альтернативные варианты (разделены вертикальной чертой), в угловые - нетерминальные символы.

Модификаторы_доступа - это слова public, final, abstract, super, соответствующие флагам прав доступа ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT, ACC_STATIC. Эти флаги устанавливаются в единицу тогда и только тогда, когда в объявлении класса присутствует соответствующее ключевое слово. Класс может иметь несколько различных модификаторов доступа, разделенных пробелом (или любой другой последовательностью пробельных символов). Повторение одинаковых модификаторов в заголовке одного класса не допускается. Когда класс не имеет флага ACC_INTERFACE, в его объявлении используется слово class, иначе используется ключевое слово interface. Все имена классов и интерфейсов записываются с указанием полного пути (пакетов, в которых эти классы содержатся). Имена пакетов и класса отделяются точкой, например, java.lang.String. В аргументах команд, там, где это необходимо, вместо полного имени текущего класса можно использовать символ «@». Если базовый класс не указан (предложение extends отсутствует), то по умолчанию используется java.lang.Object. Интерфейсы - предки описываемого интерфейса записываются в секции implements.

Для идентификаторов - имен пакетов, классов, полей и методов, а также меток, используются следующие правила: они должны состоять из букв латинского алфавита любого регистра (регистр имеет значение), знаков подчеркивания и цифр, причем не должны начинаться с цифры. Настоятельно не рекомендуется использование идентификаторов, совпадающих с ключевыми словами языка Java, что может привести к некорректной компиляции, либо интерпретации файлов классов JVM. Два специальных имени и также рассматриваются как идентификаторы.

Простейший пример описания класса, не имеющего полей и методов:

public abstract class some_package.SomeClass;

% это комментарий

extends

some_package.nested_package1.BaseClass;

implements % и это комментарий

some_package.Interface1, some_package.nested_package2.Interface2;

Описание поля имеет следующий вид:

[модификаторы_доступа] : [=];

Здесь модификаторы_доступа - следующие слова: public, protected, private, final, static, transient, volatile, соответствующие флагам доступа поля ACC_PUBLIC, ACC_PROTECTED, ACC_PRIVATE, ACC_FINAL, ACC_STATIC, ACC_TRANSIENT, ACC_VOLATILE. Повторение одинаковых модификаторов доступа в объявлении одного поля и сочетания модификаторов, соответствующие запрещенным сочетаниям флагов доступа (см. The Java Virtual Machine Specification), вызывают ошибку времени компиляции. Поля интерфейса обязательно должны быть объявлены с модификаторами public, static и final. Имя_поля - корректный идентификатор. Тип_поля - имя класса либо имя примитивного типа (имена примитивных типов совпадают с соответствующими ключевыми словами языка Java - byte, short, int, long, char, float, double, boolean). Начальное значение может быть задано только для статического поля, если оно указано, то у поля создается атрибут ConstantValue. Начальное значение может быть целочисленной, вещественной, логической либо символьной константой для полей соответствующих типов. Вещественная константа может быть записана в десятичной либо экспоненциальной форме, в формате вещественных чисел, принятом в Java. Символьные константы заключаются в апострофы. Кроме того, может быть указан код символа как обычное целое число. Логические константы записываются в виде слов true и false. Примеры описаний полей:

public final static COUNT:int = 10;

static c:char = ‘A’;

static c1:char = 13;

private volatile m_flag:boolean;

protected m_list:java.util.ArrayList;

Описание метода в общем случае имеет вид:

[] (,, ... ,<тип_параметра_n>): [throws , ... , <класс_исключения_n>];

% для методов с модификатором abstract нижележащая часть описания

% отсутствует

maxstack ;

maxlocals ;

[:]

;

...

[<метка_n>:]

<команда_n>;

[

protected_blocks;

{|finally} : > ;

...

{|finally} : > ;

]

end;

Здесь модификаторы_доступа - ключевые слова: public, protected, private, static, final, abstract, соответствующие следующим флагам доступа метода: ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_ABSTRACT. Повторение одинаковых модификаторов доступа в заголовке одного метода и сочетания модификаторов, соответствующие запрещенным сочетаниям флагов доступа (см. The Java Virtual Machine Specification), вызывают ошибку времени компиляции. Методы интерфейса обязательно должны быть объявлены с модификаторами public и abstract. Имя_метода - корректный идентификатор, либо или для конструкторов и статических инициализаторов. Типы параметров и тип возвращаемого значения должны быть именами классов, либо именами примитивных типов, принятыми в языке Java (byte, short, int, long, char, float, double, boolean). Кроме того, тип возвращаемого значения может быть указан как void. После ключевого слова throws в заголовке метода могут быть перечислены через запятую имена классов исключений, генерируемых методом. Для методов, не являющихся абстрактными, после заголовка обязательно записываются предложения maxstack и maxlocals, в которых указывается размер стека операндов и области локальных переменных метода (в четырехбайтных ячейках). Затем следует код метода в виде последовательности команд, разделенных точками с запятыми. Каждой команде может предшествовать метка, отделяемая от нее двоеточием. Метка должна быть корректным. Каждая команда может иметь не более одной метки, и каждая метка должна предшествовать той или иной команде. Однако, имеется специальная псевдокоманда none, для которой не генерируется какой-либо код (пустая команда). Ее можно использовать, если необходимо расположить более одной метки у одной команды или поместить метку в конец метода. После ключевого слова protected_blocks могут быть перечислены защищенные блоки (обработчики исключений) метода. Описание каждого защищенного блока состоит из имени класса исключения или ключевого слова finally и трех меток, разделенных символами ‘:’ и ‘>’. Первая из них указывает на начало защищенного блока, вторая на его конец, третья - на место в коде метода, куда переходит управление при возникновении исключения или при выходе из защищенного блока в случае finally.

Используемые в коде мнемонические имена команд совпадают с принятыми в The Java Virtual Machine Specification. Однако, как исключение, префикс wide не рассматривается как отдельная команда, вместо этого команды, его имеющие, записываются как wide_. Форматы записи команд:

  • <мнемоническое_имя>; Такую форму имеют следующие команды: aaload, aastore, aconst_null, aload_0, aload_1, aload_2, aload_3 ,areturn, arraylength, astore_0, astore_1, astore_2, astore_3, athrow, baload, bastore, caload, castore, d2f, d2i, d2l, dadd, daload, dastore, dcmpg, dcmpl, dconst_0, dconst_1, ddiv, dload_0, dload_1, dload_2, dload_3, dmul, dneg, drem, dreturn, dstore_0, dstore_1, dstore_2, dstore_3, dsub, dup, dup2, dup2_x1, dup2_x2, dup_x1, dup_x2, f2d, f2i, f2l, fadd, faload, fastore, fcmpg, fcmpl, fconst_0, fconst_1, fconst_2, fdiv, fload_0, fload_1, fload_2, fload_3, fmul, fneg, frem, freturn, fstore_0, fstore_1, fstore_2, fstore_3, fsub, i2b, i2c, i2d, i2f, i2l, i2s, iadd, iaload, iand, iastore, iconst_0, iconst_1, iconst_2, iconst_3, iconst_4, iconst_5, iconst_m1, idiv, iload_0, iload_1, iload_2, iload_3, imul, ineg, ior, irem, ireturn, ishl, ishr, istore_0, istore_1, istore_2, istore_3, isub, iushr, ixor, l2d, l2f, l2i, ladd, laload, 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;

  • <мнемоническое_имя> <метка>; Такую форму имеют команды перехода: 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;

  • <мнемоническое_имя> <целое число>; Число должно удовлетворять ограничениям конкретной команды: 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_2w. Здесь тип - int, float, string (для ldc, ldc_w), double, long (для ldc_2w). Константа должна иметь соответствующий тип (целые числа записываются обычным способом, вещественные - в десятичной или экспоненциальной форме, в формате, принятом в Java, строки записываются в двойных кавычках, при этом две двойные кавычки внутри строки интерпретируются как одна двойная кавычка в строке);

  • invokeinterface ::(, ... , ): ; - типы - аналогично другим командам вызова методов;

  • multianewarray ;

  • newarray {boolean|char|float|double|byte|short|int|long};

  • tableswitch :<число_n> default: : ... <число_n>:<метка_n>; Здесь числа число_1 ... число_n должны быть последовательными целыми числами. При этом числа, указанные сразу после мнемонического имени команды, должны совпадать с границами диапазона чисел, для которых указаны метки перехода. lookupswitch default: : ... <число_n>:<метка_n>; Здесь среди чисел, для которых указаны метки перехода, не должно быть одинаковых. Эти числа должны быть целыми, они не обязаны быть упорядочены по возрастанию, сортировка происходит при обработке команды компилятором.


Тестовые примеры.

Для тестирования компилятора использовались, в частности, следующие примеры:

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;

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5259
Авторов
на СтудИзбе
421
Средний доход
с одного платного файла
Обучение Подробнее