на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Ассемблер для платформы Java
p align="left">     }

Здесь:

· access_flags - битовые флаги, определяющие права доступа и некоторые дополнительные свойства метода:

Flag Name

Value

Interpretation

ACC_PUBLIC

0x0001

Метод объявлен как public

ACC_PRIVATE

0x0002

Метод объявлен как private

ACC_PROTECTED

0x0004

Метод объявлен как protected

ACC_STATIC

0x0008

Метод является статическим

ACC_FINAL

0x0010

Метод является финальным и не может быть замещен

ACC_SYNCHRONIZED

0x0020

Метод объявлен как synchronized

ACC_NATIVE

0x0100

Метод является «родным» и содержит код, непосредственно выполняющийся физическим процессором

ACC_ABSTRACT

0x0400

Метод является абстрактным

ACC_STRICT

0x0800

Устанавливает «строгий» режим работы с вещественными числами (только в Java 2).

· name_index, descriptor_index, attributes_count - аналогично field_info;

· attributes - атрибуты метода. Методы могут иметь следующие стандартные атрибуты:

o Deprecated, Synthetic - аналогично соответствующим атрибутам полей;

o Exceptions - описание исключений, которые может генерировать метод. Нужно отметить, что обязательное описание исключений не является необходимым требованием для корректного выполнения;

o Code - собственно говоря, байт-код метода.

Формат атрибута Code.

Атрибут
Code имеет следующую структуру:

Code_attribute {

     u2 attribute_name_index;

     u4 attribute_length;

     u2 max_stack;

     u2 max_locals;

     u4 code_length;

     u1 code[code_length];

     u2 exception_table_length;

     { u2 start_pc;

     u2 end_pc;

     u2 handler_pc;

     u2 catch_type;

     } exception_table[exception_table_length];

     u2 attributes_count;

     attribute_info attributes[attributes_count];

    }

Здесь:

· attribute_name_index, attribute_length - стандартные для любого атрибута поля, описывающие его тип и размер;

· max_stack - предельный размер стека операндов для метода;

· max_locals - предельное количество локальных переменных метода (включая формальные параметры);

· code_length - размер байт-кода метода в байтах;

· code - собственно говоря, байт-код;

· exception_table_length - количество защищенных блоков;

· exception_table - таблица защищенных блоков (обработчиков исключений). Каждая ее запись имеет следующие поля:

o start_pc - индекс начала защищенного блока в массиве байт-кода,

o end_pc - индекс конца защищенного блока,

o handler_pc - индекс начала обработчика,

o catch_type - тип обрабатываемого исключения (индекс в Constant Pool) или 0 для блока try ... finally;

· attributes_count - число атрибутов;

· attributes - атрибуты кода метода. Могут использоваться стандартные атрибуты LineNumberTable и LocalVariableTable, содержащие отладочную информацию.

Работа JVM

При запуске
JVM в качестве параметров ей передаются имя класса, с метода main которого будет начато выполнение программы, а также аргументы командной строки программы. Вначале загружается указанный класс. Другие классы, используемые в программе, загружаются при первом обращении к ним. Процесс загрузки класса состоит из нескольких этапов:

· собственно загрузка файла класса (loading). По умолчанию осуществляется с помощью класса ClassLoader из стандартной библиотеки Java, однако можно использовать пользовательский загрузчик для изменения способа поиска файла;

· связывание (linking). Состоит из трех стадий:

o проверка (verification) на правильность формата файла класса и корректность байт-кода (например, на отсутствие переходов на середину инструкции),

o подготовка (preparation) - выделение памяти для статических полей класса и заполнение их нулевыми значениями,

o разрешение имен (resolution) ;

· инициализация (initialization) статических данных начальными значениями. Включает вызов метода <clinit>, если он присутствует в классе.

Программа, выполняемая JVM, может иметь несколько потоков выполнения. Реализация многопоточности зависит от используемого аппаратного обеспечения и может быть различной - разные потоки могут выполняться на разных процессорах или им могут выделяться кванты времени на одном процессоре. JVM имеет ряд средств для синхронизации работы потоков и защиты разделяемых ими данных. Важнейшим из них является механизм блокировок (locks), поддерживаемый на уровне системы команд JVM. Каждый объект имеет ассоциированный с ним «замок» (lock). Если один из потоков «закрыл» этот «замок», то ни один другой поток не сможет также его «закрыть» до тех пор, пока первый поток его не «откроет».

JVM определяет несколько виртуальных областей памяти, которые она использует при своей работе:

· регистр PC (program counter), указывающий на текущую позицию выполнения в методе. Каждый поток программы имеет свой регистр PC;

· стек. Каждый поток имеет свой собственный стек. При входе в метод на вершине стека создается фрейм, содержащий локальные переменные метода и его стек операндов. Размер именно этих областей указывается полями max_locals и max_stack атрибута метода Code;

· куча - область памяти, в которой динамически размещаются объекты классов и массивы. Память из-под не используемых более объектов (на которые нет ссылок) автоматически освобождается так называемым сборщиком мусора;

· область методов. В нее при загрузке классов помещаются байт-код методов, различная информация о методах и полях. Область методов также содержит области констант времени выполнения, которые хранят содержимое constant pool из загруженных классов;

· стеки для native-методов.

Расположение и представление этих областей в физической памяти может быть различным в различных реализациях JVM.

JVM является стековой машиной. Большинство из команд JVM выполняют одно из следующих действий:

· считывают значение из переменной или поля и помещают его на вершину стека,

· сохраняют значение с вершины стека в переменной или поле,

· выполняют те или иные действия над значениями, взятыми с вершины стека, и записывают результирующее значение (если оно есть) на вершину стека,

· выполняют переход на команду с заданным смещением относительно текущего значения регистра PC безусловно или в зависимости от значений, прочитанных с вершины стека.

Любое чтение из стека операндов приводит к удалению из него прочитанного значения. Размер стека операндов, указываемый как max_stack, рассчитывается следующим образом: значения типов long и double занимают две ячейки стека (8 байт), любые другие значения - одну (4 байта). Значения типов char, boolean, byte, short сохраняются в одной четырехбайтной ячейке. Тут можно отметить, что в подавляющем большинстве случаев JVM не делает различий между логическими значениями и целыми числами типа int, для среды выполнения не существует отдельного булевского типа (лжи соответствует нулевое значение, истине - ненулевое, как правило, единица). Однако, в массивах типа boolean[] на каждый элемент выделяется один байт. Существует следующее ограничение на байт-код: каждый раз, когда точка выполнения достигает любой конкретной позиции в методе, глубина стека должна быть одинаковой, кроме того, тип верхних значений в стеке должен соответствовать требуемому типу извлекаемых очередной командой значений.

В области локальных переменных на момент начала выполнения метода в первых позициях находятся фактические параметры метода, а в случае метода экземпляра первую (нулевую) позицию занимает ссылка this на текущий объект. Никакого различия в процессе выполнения метода между параметрами (даже ссылкой this) и, собственно говоря, локальными переменными не делается. Так же как и в стеке, значения типа long и double в области локальных переменных занимают две четырехбайтные ячейки, значения типов размером менее 32-х разрядов расширяются до четырех байт. В корректном байт-коде должны выполняться, в частности, следующие условия: во-первых, типы значений в локальных переменных должны соответствовать требуемым для команд, которые обращаются к этим переменным, во-вторых, не допускается чтение значения переменной до ее инициализации (присвоения значения).

Перед вызовом метода его фактические параметры должны находиться на вершине стека; они становятся операндами соответствующей команды вызова. При возврате из метода, за исключением методов, возвращающих void, возвращаемое значение помещается на вершину стека.

В процессе выполнения программы в результате возникновения той или иной ошибки либо выполнения команды athrow может быть сгенерировано исключение. При этом происходит поиск подходящего обработчика исключения (защищенного блока) в текущем методе, если он не найден, то в методе, вызвавшем текущий и т. д. Если подходящий обработчик найден, то управление передается в точку, определяемую полем handler_pc соответствующей записи таблицы exception_table в атрибуте Code метода. Ссылка на объект исключения при этом помещается на вершину стека. Объект исключения обязательно должен принадлежать классу Throwable или классу, производному от него.

Система команд JVM.

Первый байт каждой команды
JVM содержит код операции. Существует несколько типичных форматов, которые имеют большинство команд:

· только код операции,

· код операции и однобайтный индекс,

· код операции и двухбайтный индекс,

· код операции и двухбайтное смещение перехода,

· код операции и четырехбайтное смещение перехода.

Несколько команд используют другие форматы, среди них две команды переменного размера - tableswitch и lookupswitch. Кроме того, существует специальный префикс wide, который изменяет размер некоторых команд, заменяя однобайтный индекс локальной переменной двухбайтным. В The Java Virtual Machine Specification для каждой команды установлено свое мнемоническое обозначение.

Существует много групп аналогичных по выполняемому действию команд, работающих с различными типами данных, например, команды iload, lload, aload, fload, dload выполняют функцию загрузки значений соответствующих типов из локальных переменных на вершину стека. Реализация таких команд может быть идентичной, но он различаются при проверке корректности байт-кода. Приняты следующие обозначения для типов данных, с которыми работают команды:

· i - int (также byte, short, char и boolean),

· l - long,

· f - float,

· d - double,

· a - ссылка на объект или массив.

Кроме того, есть несколько команд, работающих с типами char, byte и short.

Можно выделить несколько групп команд по назначению:

· команды загрузки и сохранения:

o Загрузка локальной переменной на стек: iload, iload_<n>, lload, lload_<n>, fload, fload_<n>, dload, dload_<n>, aload, aload_<n>;

o Сохранение значения с вершины стека в локальной переменной: istore, istore_<n>, lstore, lstore_<n>, fstore, fstore_<n>, dstore, dstore_<n>, astore, astore_<n>;

o Загрузка констант на стек: istore, istore_<n>, lstore, lstore_<n>, fstore, fstore_<n>, dstore, dstore_<n>, astore, astore_<n>;

· арифметические и логические команды:

o сложение: iadd, ladd, fadd, dadd;

o вычитание: isub, lsub, fsub, dsub;

o умножение: imul, lmul, fmul, dmul;

Страницы: 1, 2, 3, 4, 5



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.