Рефераты. Ассемблер для платформы Java

Ассемблер для платформы Java

Содержание.


Содержание. 1

Содержание. 2

Введение. 3

Постановка задачи. 4

Формат файла класса. 5

Структура файла класса. 5

Типы элементов Constant_pool 6

Формат структуры field_info. 7

Формат структуры method_info. 7

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

Работа JVM.. 10

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

Синтаксис языка ассемблера для платформы Java (языка JASM). 14

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

1. 18

2. 19

3. 20

Проектирование и реализация компилятора. 25

Заключение. 30

Использованная литература. 31


           Введение.


Язык программирования Java был разработан в середине 90-х годов на основе языка Oak, предназначавшегося для программирования «прошивок» для различных электронных устройств. Однако, в отличие от своего предшественника, язык Java получил широкое распространение, прежде всего как язык, использовавшийся в программировании для сети Интернет. В настоящее время область применения Java значительно расширилась, и этот язык часто применяется и в обычном прикладном программировании. Это обусловлено такими преимуществами как кроссплатформенность и безопасность,  которые обеспечиваются тем, что исходный код на Java компилируется не непосредственно в машинный код, а в, так называемый, байт-код, который интерпретируется виртуальной машиной Java (JVM). Во многих современных реализациях JVM байт-код перед выполнением преобразуется в машинные инструкции, что значительно повышает производительность, приближая ее к производительности программ, написанных на C/C++. Таким образом, Java, в современном состоянии этой технологии, сочетает преимущества интерпретируемых и компилируемых языков программирования.

Спецификация, описывающая JVM, как абстрактную вычислительную машину, предоставлена компанией Sun в открытый доступ. Это позволяет создавать как собственные реализации JVM для различных платформ, так и альтернативные компиляторы, генерирующие байт-код Java, в том числе для языков программирования, отличных от Java. Большинство литературы, посвященной Java, почти не уделяет внимания устройству JVM и описывает лишь сам язык Java. Однако, в ряде случаев, знание особенностей архитектуры бывает весьма полезным. В данной работе я создал учебную программу, которая может помочь в изучении архитектуры JVM – несложный ассемблер для байт-кода Java.

Постановка задачи.


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

Формат файла класса.


Основным форматом исполняемых файлов в архитектуре Java является формат файла класса, описанный в The JavaTM Virtual Machine Specification, изданной компанией Sun. Файл данного формата имеет имя, совпадающее с идентификатором класса (за исключением вложенных классов) и расширение .class.


Структура файла класса.


Файл класса имеет следующую структуру:

ClassFile {

               u4 magic;

               u2 minor_version;

               u2 major_version;

               u2 constant_pool_count;

               cp_info constant_pool[constant_pool_count-1];

               u2 access_flags;

               u2 this_class;

               u2 super_class;

               u2 interfaces_count;

               u2 interfaces[interfaces_count];

               u2 fields_count;

               field_info fields[fields_count];

               u2 methods_count;

               method_info methods[methods_count];

               u2 attributes_count;

               attribute_info attributes[attributes_count];

    }

(здесь и далее u1, u2, u4 – целые числа размером 8, 16 и 32 бит с порядком байтов старший байт по младшему адресу). Рассмотрим последовательно все поля.

·        magic – так называемое магическое число, имеющее в шестнадцатеричной записи вид 0xCAFEBABE;

·        minor_version, major_version – версия формата файла, по ней определяется совместимость данного файла с конкретной версией JVM;

·        constant_pool_count – количество элементов в Constant_pool плюс единица;

·        constant_pool – область констант – массив структур переменного размера, представляющих те или иные константные значения. Обращения в область констант производятся по индексу (индексация начинается с единицы; индексы, следующие за позициями констант, представляющих числа типов long и double, не используются). Форматы констант различных видов будут рассмотрены ниже;

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

Флаг

Значение

Смысл

ACC_PUBLIC

0x0001

Доступен из-за пределов пакета

ACC_FINAL

0x0010

Запрещено наследование от данного класса

ACC_SUPER

0x0020

В методах данного класса требуется использовать принятую в Java2 трактовку команды invokespecial

ACC_INTERFACE

0x0200

Интерфейс (является классом специального вида)

ACC_ABSTRACT

0x0400

Абстрактный класс

·        this_class, super_class – индексы структур в области констант, ссылающихся на данный класс и его класс-предок;

·        interfaces_count – число интерфейсов, реализуемых данным классом;

·        interfaces – массив индексов структур в области констант, ссылающихся на интерфейсы, реализуемые данным классом;

·        fields_count – количество полей в данном классе;

·        fields – массив структур field_info, описывающих поля класса. Формат структуры field_info будет рассмотрен ниже;

·        methods_count – количество методов;

·        methods – массив структур method_info, описывающих методы класса. Формат структуры mettho_info будет рассмотрен ниже. Конструкторы и статические инициализаторы представляются методами со специальными именами <init> и <clinit>;

·        attributes_count – количество атрибутов класса;

·        attributes – массив структур-атрибутов класса (поля, методы и байт-код методов также могут иметь свои атрибуты). Каждая такая структура в начале имеет два обязательных поля, описывающих тип атрибута и его размер. К классу могут быть применены следующие стандартные атрибуты: SourceFile – указывает на файл исходного текста, из которого был получен данный файл класса, и Deprecated – класс оставлен для совместимости со старым кодом и его использование не рекомендуется. Возможно создание атрибутов нестандартных типов, но они будут игнорироваться средой выполнения.


Типы элементов Constant_pool


Каждый элемент сonstant_pool начинается с однобайтного поля, определяющего его тип. Размер и содержание остальной части структуры зависит от типа. Существуют следующие типы констант (элементов constant_pool):

·        CONSTANT_Class – указывает на класс. Содержит индекс константы типа CONSTANT_Utf8, хранящей дескриптор класса;

·        CONSTANT _Fieldref – указывает на поле класса. Содержит индексы констант типа CONSTANT_Class и CONSTANT_NameAndType;

·        CONSTANT _Methodref указывает на метод класса (не интерфейса). Содержит индексы констант типа CONSTANT_Class и CONSTANT_NameAndType;

·        CONSTANT _InterfaceMethodref указывает на метод интерфейса. Содержит индексы констант типа CONSTANT_Class и CONSTANT_NameAndType;

·        CONSTANT_String – указывает на строку, содержит индекс константы типа CONSTANT_Utf8;

·        CONSTANT_Integer – содержит целое 32-разрядное число;

·        CONSTANT_Float – содержит вещественное число одинарной точности;

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



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.