Внутрішнє представлення java-програми

4.7. Внутрішнє представлення Java-програми

Основні властивості платформи Java

додатки - програми в звичайному сенсі, що виконуються, проте, в середовищі платформи Java;

аплети - програми, які виконуються в середовищі Web-броузера, що підтримує платформу Java (Sun HotJava, Netscape Communicator, Microsoft Internet Explorer), такі програми можуть передаватися по Internet і виконуватися на комп'ютері клієнта;

сервлети і корпоративні біни - Java-програми, серверні компоненти розподілених додатків;

Переносимість в Java досягається за рахунок того, що Java-програма компілюється над безпосередньо в команди будь-якої конкретної ЕОМ, а в, так званий, байт-код Java - команди деякої абстрактної машини, званої віртуальної машиною Java (JVM). Кінцевим результатом (виконуваним модулем) є файл класу - програма в байт-коді Java. На цільовій платформі (на тій машині, на якій програма виконується) повинна бути запущена програмна JVM, яка емулює ЕОМ, здатну виконувати команди байт-коду Java. Сама JVM переносних залежна, тобто, призначена для виконання на конкретній платформі і в конкретній операційній системі. JVM читає команди байт-коду Java і моделює їх виконання на тій апаратній платформі і в тій операційному середовищі, в якій вона працює. При цьому вона використовує бібліотеки Java, також переносних залежні. Стрижнем технології є специфікації байт-коду Java, файлу класу і JVM. Компілятори Java можуть бути створені (і створюються) різними розробниками, але все генеруються ними виконавчі модулі повинні відповідати специфікаціям байт-коду Java. Більш того, існують і компілятори інших мов програмування, які генерують байт-код Java. Також різними розробниками можуть розроблятися (і розробляються) і JVM, але все JVM повинні виконувати стандартний байт-код Java.

Внутрішнє представлення java-програми

Виконання програми в платформі Java


Отже, Java-програма виконується в режимі інтерпретації. Хоча фірма Sun Microsystems декларує ефективність в числі основних властивостей Java-програм, щодо швидкодії це твердження, м'яко кажучи, сумнівно. Скриптової програма в принципі не може виконуватися так само швидко, як програма в цільових кодах. Ефективність роботи Java-програм залежить від ефективності роботи JVM, і JVM різних виробників істотно розрізняються за цим показником (лідером є фірма IBM). У складі коштів розробки Java є також "своєчасні" (JIT - just-in-time) компілятори, які транслюють байт-код Java в коди цільової платформи, результатом чого є виконуваний модуль у форматі цільової платформи і системи. Такий модуль виконується без участі JVM, і його виконання відбувається ефективніше, ніж виконання інтерпретується байт-коду, але це вже виходить за межі платформи Java.

Таким чином, незалежність Java-програм від конкретної апаратної платформи і ОС досягається за рахунок того, що Java-платформа є додатковою "прошарком" між додатком і ОС і замість специфічних системних викликів API конкретної ОС додаток використовує API JRE або базові конструкції мови

JVM підтримує внутрішнє середовище виконання байт-коду, яка має такі цікаві особливості:

динамічна об'єктно-орієнтована модель представлення програми. Java-програма являє собою набір класів, для кожного класу при компіляції створюється двійковий файл з розширенням class, содержіщій крім власне байт-коду методів ще й опис структури класу (опис даних і заголовки методів). JVM при завантаженні класів для кожного з них створює об'єкт класу Class - описувач класу, в який завантажуються дані з файлу опису. Крім того, описувач класу містить посилання на батьківський клас, інтерфейси і т.п.

«Самовизначення» - багато елементів внутрішнього представлення програми можуть бути описані засобами самої ж Java. перш за все це описатели класів Class, а також процедури їх завантаження і зв'язування. Крім того, структура об'єктів класу Class. описана в об'єкті - завантажувач класів (теж належать до класу Class). Звідси випливає, що JVM інтерпретує не тільки «власні» код, але і деяку частину системних функцій, які також можуть бути написані на Java;

тотальний контроль за об'єктами. Всі об'єкти в програмі є динамічними і успадковуються від загального предка - клас Object, тобто всі об'єкти мають спільну внутрішню сутність, через яку JVM може «стежити» за ними. Зокрема, на цьому засновані процедури автоматичного збору сміття: знищуються всі об'єкти, недоступні (прямо, опосередковано або рекурсивно) через локальні дані програми;

многопоточность. В Java ідея многопоточности реалізована на рівні мови як можливість створення об'єктів класів, похідних від класу Thread, в яких метод run виконується паралельно з подібними йому в локальному середовищі поточного об'єкта. У JVM потоки не інтерпретуються, а реалізуються у вигляді фізичних потоків, підтримуваних операційною системою. Образно кажучи, для кожного потоку створюється окремий екземпляр JVM. Крім того, сама JVM також є багатопотокової: окремі її функції реалізуються у вигляді незалежних потоків.

Нижче ми розглядаємо деякі особливості віртуального "процесора" JVM, як тієї платформи, на якій виконуються Java-програми.