Ассемблер для платформы Java
52 Содержание.Содержание. 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Проектирование и реализация компилятора. 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 - содержит вещественное число одинарной точности;· CONSTANT_Long - содержит целое 64-разрядное число;· CONSTANT_Double - содержит вещественное число двойной точности;· CONSTANT_NameAndType - описывает сигнатуру и имя метода либо тип и имя поля. Содержит индексы двух констант типа CONSTANT_Utf8, хранящих соответственно имя и дескриптор типа (сигнатуры);· CONSTANT_Utf8 - содержит строку в формате Utf8 (символы Unicode представляются комбинациями от 1 до 3-х байт, причем символы с кодами, не превышающими 127, представляются одним байтом).Дескрипторы - это строки, описывающие типы и сигнатуры методов в компактном формате. Примитивные типы обозначаются одной буквой, типы массивов - открывающими квадратными скобками в количестве, равном размерности массива, перед обозначением базового типа. Классы описываются строкой, содержащей имя класса с полным путем, при этом вместо точки роль разделителя имен пакетов и класса выполняет слэш. В дескрипторах сигнатур методов в круглых скобках без разделителей перечисляются дескрипторы типов параметров; после закрывающей скобки находится дескриптор типа возвращаемого значения. Для устранения неоднозначностей при этом перед дескрипторами классов записывается буква L, а после них - точка с запятой. Например, (ILjava/lang/Object;)I - (int, Object):int (буквой I обозначается тип int).Формат структуры field_infoСтруктура field_info имеет следующий формат:field_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; } Здесь: · access_flags - комбинация битовых флагов, определяющих права доступа и некоторые другие характерист ики поля: |
Имя флага | Значение | Смысл | | ACC_PUBLIC | 0x0001 | Поле объявлено как public | | ACC_PRIVATE | 0x0002 | Поле объявлено как private | | ACC_PROTECTED | 0x0004 | Поле объявлено как protected | | ACC_STATIC | 0x0008 | Поле является статическим | | ACC_FINAL | 0x0010 | Поле объявлено как final и не может быть изменено после начальной инициализации | | ACC_VOLATILE | 0x0040 | Поле объявлено как volatile | | ACC_TRANSIENT | 0x0080 | Поле объявлено как transient - не сохранятся при сериализации | | |
· name_index - индекс строковой константы-имени поля в Constant Pool; · descriptor_index - индекс строковой константы-дескриптора поля (описывает тип) в Constant Pool; · attributes_count - число атрибутов поля; · attributes - атрибуты поля. К полям могут быть применены стандартные атрибуты Deprecated (см. выше), Synthetic (поле создано компилятором и не объявлено явно в исходном тексте) и ConstantValue (инициализирующее значение для статического поля). Формат структуры method_info Структура method_info имеет следующий формат: method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count];
Страницы: 1, 2, 3, 4, 5
|