Ассемблер для платформы Java
Архитектура уровня команд платформы Java, формат файла класса Java. Компилятор ассемблероподобного языка, позволяющий создавать файлы классов, корректно обрабатываемые реальной JVM, поддерживающий все команды байт-кода Java и важнейшие возможности JVM.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 17.09.2008 |
Размер файла | 292,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
· Чтение исходного файла. При этом он разбивается на предложения, разделенные точками с запятыми, также выбрасываются комментарии;
· Разбор исходного текста. При последовательном переборе списка предложений выделяются синтаксические конструкции. При разборе используется лексический анализатор, разделяющий предложения на лексемы. На основании выделенных синтаксических конструкций генерируется внутреннее представление программы, имеющее вид древовидной структуры данных, корнем которой является представление класса в целом, узлами первого уровня - объекты, соответствующие методам, полям, элементам Constant Pool и т. д.;
· Замена номеров меток соответствующими смещениями в коде методов;
· Генерация байт-кода методов как массивов байт;
· Генерация файла класса на основании внутреннего представления программы.
Данное деление является условным и не означает строгой временной последовательности. Третий и четвертый этапы, по сути дела, являются частями второго этапа.
Диаграмма пакетов проекта изображена на рис. 1.
Рис. 1.
Диаграмма пакетов
Корневой пакет проекта имеет имя jasm. Он содержит класс MainClass, метод main() которого является точкой входа в программу, и классы SyntaxErrorException и InternalCompilerErrorException, унаследованные от java.lang.Exception и представляющие ошибки, которые могут возникнуть в процессе компиляции. Пакет compiler содержит классы, ответственные за разбор исходного текста, причем классы, работающие с кодом методов, содержатся во вложенном пакете code_compiler. Пакет structures содержит классы, из объектов которых состоит внутреннее промежуточное представление программы, а также некоторые вспомогательные классы. Он имеет три вложенных пакета: commands, consts и attributes, классы из которых описывают, соответственно, команды байт-кода, элементы Constant Pool и атрибуты полей и методов. В пакет commands в свою очередь вложены пакет command_formats, содержащий базовые абстрактные классы для команд типичных форматов, пакеты, содержащие классы, представляющие команды каждого из типичных форматов, а также пакет special для классов, представляющих команды, имеющие особый формат.
Большинство классов из пакета structures входят в иерархию, корнем которой является интерфейс IStructure, содержащий два метода int getLength() и byte[] getContent(), позволяющие получить, соответственно, размер, который займет структура при записи в выходной файл, и массив байт, которыми она представляется в выходном файле. Данный интерфейс не используется для полиморфного вызова методов, он играет лишь роль структурирования программы. Основные классы пакета structures изображены на диаграмме на рис. 2.
Рис. 2.
Классы пакета jasm.structures.
Генерируемый класс как целое представляется объектом класса ClassFile, который содержит в своих полях ссылки на объекты классов ConstantPool, FiledInfo и MethodInfo, описывающие область констант, поля и методы создаваемого класса. Сам класс ClassFile интерфейс IStructure не реализует. Среди его членов следует отметить метод writeToFile(), создающий файл класса на основании информации, содержащейся в объекте.
Данный компилятор может создавать атрибуты методов Code, Exceptions и атрибут поля ConstantValue, которые представляются классами, производными от AttributeStructure. Отмечу, что объект класса CodeAttribute содержит байт-код метода уже в виде массива байт, а не в виде объектов классов, представляющих отдельные команды (производных от Command), списки таких объектов используются лишь в процессе обработки кода метода.
Абстрактный класс Command дополнительно к методам интерфейса IStructure содержит абстрактный метод byte getByte(int n), который должен возвращать байт с заданным номером в команде. Еще один метод changeOffset имеет пустую реализацию, но переопределяется в классах-потомках, соответствующих командам перехода. Он используется для замены номеров меток смещениями на третьем этапе компиляции. Непосредственными наследниками класса Command являются классы, соответствующие типичным форматам команд (абстрактные) и командам, имеющим уникальные форматы. Большинство команд представляются классами, наследующими классы типичных форматов. Имена классов команд имеют вид C_xxx, где xxx - мнемоническое имя команды. Пустой команде none соответствует класс NoCommand.
Класс ConstantPool содержит как общий список для всех типов констант, хранящий объекты класса CpInfo (базовый тип для классов, представляющих различные виды констант), так и списки для констант отдельных типов, содержащие индексы элементов в первом списке. Эти списки описываются классами, вложенными в класс ConstantPool. Такая структура используется для того, чтобы при добавлении константы можно было быстро проверить, не присутствует ли уже идентичный элемент в ConstantPool (эта проверка производится не для всех типов констант). Для каждого типа констант в классе ConstantPool существует свой метод добавления, который возвращает индекс добавленного (или найденного существующего) элемента в общем списке. Среди наследников CpInfo имеется специальный класс CpNone, который соответствует пустой структуре, вставляемой после констант типа Long и Double т. к. следующий за ними индекс считается неиспользуемым.
За процесс компиляции отвечает пакет compiler, который содержит следующие классы:
· Source - выполняет функцию выделения предложений в исходном тексте. Конструктор этого класса принимает в качестве параметра имя файла, содержимое которого разбивается на предложения и заносится в коллекцию типа ArrayList<String>. Метод String nextStatement() при каждом вызове возвращает очередное предложение;
· StringParser - выполняет функцию разделения строк на лексемы. Каждый объект этого класса соответствует одной обрабатываемой строке.
· TokenRecognizer - имеет статические методы, позволяющие определить, является ли некоторая строка ключевым словом или корректным идентификатором. Объекты этого класса никогда не создаются;
· DescriptorCreator - содержит статические методы для создания дескрипторов типов, полей и методов из строк, содержащих запись типов и сигнатур, используемую в языке. Экземпляры класса также не создаются;
· ClassHeaderParser, FieldDeclarationParser, MethodHeaderParser - используются при анализе заголовка класса, описаний полей и заголовков методов. Объекты этих классов сохраняют в себе информацию, извлеченную из анализируемого в конструкторе класса предложения;
· code_compiler.CodeCompiler - осуществляет анализ кода метода и генерацию байт-кода (включая третий и четвертый этапы компиляции). Данный процесс будет рассмотрен подробнее ниже;
· code_compiler.CommandCompiler - анализирует команды в исходном коде метода и создает объекты классов-потомков Command;
· code_compiler.Label - представляет метку в коде метода;
· code_compiler.LabelTable - таблица меток метода. Содержит имена меток, номера соответствующих им строк и смещения команд.
· SourceAnalyser - занимает центральное место в процессе анализа исходного текста. Конструктор данного класса принимает в качестве параметра объект класса Source. При вызове метода analyse() происходит анализ исходного кода и генерируется промежуточное представление программы в виде описанной выше структуры. В процессе анализа используются классы StringParser, ClassHeaderParser, FieldDeclarationParser, MethodHeaderParser, CodeCompiler и др. Данный метод возвращает объект класса ClassFile.
Класс MainClass содержит единственный метод main, являющийся точкой входа в программу. Здесь вначале создается объект класса Source, который передается для обработки объекту класса SourceAnalyser, затем у возвращенного методом SourceAnalyser.analyse() объекта класса ClassFile вызывается метод writeToFile, который и генерирует файл класса, являющийся результатом работы компилятора. Все перечисленные операции заключены в блок try/catch, перехватывающий любые исключения, в случае возникновения которых на консоль выводится соответствующее сообщение и процесс компиляции завершается. Диаграмма, в упрощенном виде показывающая этот процесс, изображена на рис. 3.
Рис. 3.
Обработка исходного файла.
Рассмотрим подробнее процесс компиляции кода метода. После обработки заголовка метода с помощью класса MethodHeaderParser, в случае, если метод не является абстрактным, в методе SourceAnalyser .analyse() считываются предложения maxstack и maxlocals. Затем считываются и заносятся в массивы предложения, содержащие команды и описания защищенных блоков. Эти массивы, а также ссылка на объект ConstantPool, представляющий область констант класса, передаются в качестве параметров конструктору класса CodeCompiler. У созданного объекта CodeCompiler вызывается метод compile(), возвращающий объект класса CodeAttribute, описывающий атрибут Code, содержащий байт-код метода. При этом происходят следующие процессы. В конструкторе класса CodeCompiler из строк, содержащих команды, выделяются имена меток, которые сохраняются в объекте класса LabelTable. Затем обрабатывается список строк, описывающих защищенные блоки. В методе CodeCompiler.compile() выполняются следующие операции. Сначала с помощью объекта класса CommandCompiler для каждой команды создается объект соответствующего класса. При этом одновременно для команд, при которых имеется метка, в объекте LabelTable сохраняется информация о смещении метки относительно начала метода. Как в описаниях защищенных блоков, так и в объектах, соответствующих командам перехода, на момент окончания этого шага вместо смещений перехода, содержатся порядковые номера команд, при которых расположены соответствующие метки. Замена их на действительные смещения производится на последнем шаге с помощью методов LabelTable.changePC() и Command.changeOffset().
Заключение.
Технология Java ориентирована на использование одного языка программирования. Система типов данных и другие особенности языка Java тесно связаны с функционированием JVM и форматом файла класса. Однако, существует открытая спецификация, позволяющие создавать как собственные реализации JVM, так и альтернативные средства разработки. С ее использованием мною разработан язык JASM, представляющий собой язык ассемблера для платформы Java, который позволяет создавать файлы классов, использующие значительную часть возможностей JVM, и реализован его компилятор.
Использованная литература.
1. Грис, Д. Конструирование компиляторов для цифровых вычислительных машин. М., «Мир», 1975.
2. Эккель, Б. Философия JAVA. СПб. 3-е изд.: Питер, 2003.
3. Tim Lindholm, Frank Yellin. The Java Virtual Machine Specification Second Edition. Sun Microsystems Inc. 1999.
Подобные документы
Понятие и функциональные особенности Java Card как версии Java-платформы для устройств с крайне ограниченными вычислительными ресурсами, оценка ее возможностей и необходимых ресурсов. Анализ степени безопасности платформы, взаимодействие компонентов.
презентация [1,0 M], добавлен 19.05.2014Архитектура Java и Java RMI, их основные свойства, базовая система и элементы. Безопасность и виртуальная Java-машина. Интерфейс Java API. Пример использования приложения RMI. Работа с программой "Calculator". Универсальность, портативность платформ.
курсовая работа [208,6 K], добавлен 03.12.2013История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.
курсовая работа [795,9 K], добавлен 14.12.2012Основа пользовательского интерфейса. Возможности пакетов java.awt.geom, java.awt, классов java.awt.Graphics и java.awt.Graphics2D. Основные графические примитивы и работа с потоками. Листинг программы и составление композиции аффинных преобразований.
методичка [525,3 K], добавлен 30.06.2009Расширяемый язык разметки XML. Описание типа документа DTD. Значение XML и платформы Java. Обзор стандартных анализаторов DOM и SAX. Технология Java Servlet, Java Server Pages (JSP), JavaBeans. Общая функциональность программного продукта. Модель данных.
курсовая работа [422,0 K], добавлен 21.02.2009Кратка историческая справка развития языка Java. Анализ предметной области. Java platform, enterprise and standart edition. Апплеты, сервлеты, gui-приложения. Розработка программного кода, консольное приложение. Результаты работы апплета, сервлета.
курсовая работа [549,2 K], добавлен 23.12.2015Методология объектно-ориентированного программирования в Java. Понятия класса, объекта и объектной переменной. Динамическая и статическая объектные модели. Логическое структурирование приложения. Наследование в Java. Отличия интерфейсов от классов.
курс лекций [547,2 K], добавлен 01.05.2014Создание языка программирования с помощью приложения "Java". История названия и эмблемы Java. Обзор многообразия современных текстовых редакторов. Обработка строки. Методы в классе String. Java: задачи по обработке текста. Примеры программирования.
курсовая работа [276,1 K], добавлен 19.07.2014Сетевые возможности языков программирования. Преимущества использования Java-апплетов. Классы, входящие в состав библиотеки java.awt. Создание пользовательского интерфейса. Сокетное соединение с сервером. Графика в Java. Значения составляющих цвета.
курсовая работа [508,1 K], добавлен 10.11.2014Принцип работы Java. Аплеты как особенность Java-технологии, характеристика методов их защиты. Модель безопасности JDK1.2 и концепция "песочницы". Иерархия криптографических сервисов, алгоритмов. Объектная организация криптографической подсистемы Java.
реферат [54,8 K], добавлен 09.09.2015