Зміст.
Зміст. 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 Java TM Virtual Machine Specification, виданої компанією Sun. Файл даного формату має ім'я, що збігається за ідентифікатором класу (за винятком вкладених класів) та розширення. class. br/>
Структура файлу класу.
Файл класу має наступну структуру:
В
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;
< i> u2 super_class;
u2 interfaces_count;
u2 interfaces [interfaces_count];
u2 fields_count;
field_info fields [fields_count];
u2 methods_count;
< i> 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 - комбінаці...