Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
27.03.2016
Размер:
1.5 Mб
Скачать

Віртуальна машина Java

Програми на мові Java транслюються в спеціальне проміжне представлення, яке потім інтерпретується так званої «віртуальною машиною Java». Віртуальна машина Java являє собою стекову машину: вона не має пам'яті прямого доступу, всі операції виконуються над операндами, розташованими на верхівці стека. Щоб, наприклад, виконати операцію за участю константи змінної, їх попередньо необхідно завантажити на верхівку стека. Код операції - завжди один байт. Якщо операція має операнди, вони розташовуються в наступних байтах.

До елементарним типам даних, з якими працює машина, відносяться short, integer, long, float, double (всі знакові).

Організація пам'яті

Машина має наступні регістри:

pc - лічильник команд;

optop - покажчик вершини стека операцій;

frame - покажчик на стек-фрейм виконуваного методу;

Vars - покажчик на 0-ю змінну виконуваного методу.

Всі регістри 32-розрядні. Стек-фрейм має три компоненти: локальні змінні, середовище виконання, стек операндів. Локальні змінні відлічуються від адреси в регістрі vars. Середа виконання служить для підтримки самого стека. Вона включає покажчик на попередній фрейм, покажчик на власні локальні змінні, на базу стека операцій і на верхівку стека. Крім того, тут же зберігається деяка додаткова інформація, наприклад, для відладчика.

Купа збірки сміття містить екземпляри об'єктів, які створюються і знищуються автоматично. Область методів містить коди, таблиці символів і т.д.

З кожним класом пов'язана область констант. Вона містить імена полів, методів і іншу подібну інформацію, яка використовується методами.

Набір команд віртуальної машини

Віртуальна Java-машина має наступні команди:

 

приміщення констант на стек,

приміщення локальних змінних на стек,

запам'ятовування значень з стека в локальних змінних,

обробка масивів,

управління стеком,

арифметичні команди,

логічні команди,

перетворення типів,

передача управління,

повернення з функції,

табличний перехід,

обробка полів об'єктів,

виклик методу,

обробка виняткових ситуацій,

інші операції над об'єктами,

монітори,

налагодження.

Розглянемо деякі команди докладніше.

Приміщення локальних змінних на стек

Команда iload - завантажити ціле з локальної змінної. Операндом є зміщення змінної в області локальних змінних. Вказуване значення копіюється на верхівку стека операцій. Є аналогічні команди для приміщення плаваючих, подвійних цілих, подвійних плаваючих і т.д.

Команда istore - зберегти ціле в локальній змінній. Операндом операції є зміщення змінної в області локальних змінних. Значення з верхівки стека операцій копіюється в яка зазначається область локальних змінних. Є аналогічні команди для приміщення плаваючих, подвійних цілих, подвійних плаваючих і т.д.

8.4.2 Виклик методу

Команда invokevirtual.

При трансляції об'єктно-орієнтованих мов програмування через можливість перекриття віртуальних методів, взагалі кажучи, не можна статично протрансліровать виклик методу об'єкта. Це пов'язано з тим, що якщо метод перекритий в похідному класі, і викликається метод об'єкта-змінної, то статично невідомо, об'єкт якого класу (базового чи похідного) зберігається в змінної. Тому з кожним об'єктом зв'язується таблиця всіх його віртуальних методів: для кожного методу там поміщається покажчик на його реалізацію у відповідності з приналежністю самого об'єкта класу в ієрархії класів.

У мові Java різні класи можуть реалізовувати один і той же інтерфейс. Якщо оголошена змінна або параметр типу інтерфейс, то динамічно не можна визначити об'єкт якого класу присвоєно змінної:

 interface I;

 class C1 implements I;

 class C2 implements I;

 I O;

 C1 O1;

 C2 O2;

 ...

 O = O1;

 ...

 O = O2;

 ...

У цій точці програми, взагалі кажучи, не можна сказати, якого типу значення зберігається в змінної O. Крім того, при роботі програми на мові Java є можливість використання методів з інших пакетів. Для реалізації цього механізму в Java-машині використовується динамічне зв'язування.

Передбачається, що стек операндів містить handle об'єкта або масиву і деяку кількість аргументів. Операнд операції використовується для конструювання індексу в області констант поточного класу. Елемент за цим індексом в області констант містить повну сигнатуру методу. Сигнатура методу описує типи параметрів і значення, що повертається. З handle об'єкта витягується покажчик на таблицю методів об'єкта. Проглядається сигнатура методу в таблиці методів. Результатом цього перегляду є індекс в таблицю методів іменованого класу, для якого знайдений покажчик на блок методу. Блок методу вказує тип методу (native, synchronized і т.д.) і число аргументів, очікуваних на стеку операндів.

Якщо метод помічений як synchronized, запускається монітор, пов'язаний з handle. Базис масиву локальних змінних для нового стек-фрейма встановлюється так, що він вказує на handle на стеку. Визначається загальне число локальних змінних, використовуваних методом, і після того, як відведено необхідне місце для локальних змінних, оточення виконання нового фрейму поміщається на стек. База стека операндів для цього виклику методу встановлюється на перше слово після оточення виконання. Потім виконання продовжується з першої інструкції викликаного методу.