Иллюстрированный самоучитель по Java
Выполнение
Java-программы
Как вы знаете, программа, написанная
на одном из языков высокого уровня, к которым относится и язык Java, так называемый
исходный модуль
("исходник" или "сырец" на жаргоне,
от английского "source"), не может быть сразу же выполнена. Ее сначала
надо откомпилировать, т. е. перевести в последовательность машинных команд —
объектный модуль.
Но и он, как правило, не может быть сразу же выполнен:
объектный модуль надо еще скомпоновать с библиотеками использованных в модуле
функций и разрешить перекрестные ссылки между секциями объектного модуля, получив
в результате
загрузочный модуль —
полностью готовую к выполнению программу.
Исходный модуль, написанный на Java,
не может избежать этих процедур, но здесь проявляется главная особенность технологии
Java — программа компилируется сразу в машинные команды, но не команды какого-то
конкретного процессора, а в команды так называемой виртуальной машины Java (JVM,
Java Virtual Machine).
Виртуальная машина Java —
это совокупность команд
вместе с системой их выполнения. Для специалистов скажем, что виртуальная машина
Java полностью стековая, так что не требуется сложная адресация ячеек памяти
и большое количество регистров. Поэтому команды JVM короткие, большинство из
них имеет длину 1 байт, отчего команды JVM называют
байт^кодами
(bytecodes),
хотя имеются команды длиной 2 и 3 байта. Согласно статистическим исследованиям
средняя длина команды составляет 1,8 байта. Полное описание команд и всей архитектуры
JVM содержится в
спецификации виртуальной машины Java
(VMS, Virtual Machine
Specification). Если вы хотите в точности узнать, как работает виртуальная машина
Java, ознакомьтесь с этой спецификацией.
Другая особенность Java — все стандартные
функции, вызываемые в программе, подключаются к ней только на этапе выполнения,
а не включаются в байт-коды. Как говорят специалисты, происходит
динамическая
компоновка
(dynamic binding). Это тоже сильно уменьшает объем откомпилированной
программы.
Итак, на первом этапе программа,
написанная на языке Java, переводится компилятором в байт-коды. Эта компиляция
не зависит от типа какого-либо конкретного процессора и архитектуры некоего
конкретного компьютера. Она может быть выполнена один раз сразу же после написания
программы. Байт-коды записываются в одном или нескольких файлах, могут храниться
во внешней памяти или передаваться по сети. Это особенно удобно благодаря небольшому
размеру файлов с байт-кодами. Затем полученные в результате компиляции байт-коды
можно выполнять на любом компьютере, имеющем систему, реализующую JVM. При этом
не важен ни тип процессора, ни архитектура компьютера. Так реализуется принцип
Java "Write once, run anywhere" — "Написано однажды, выполняется
где угодно".
Интерпретация байт-кодов и динамическая
компоновка значительно замедляют выполнение программ. Это не имеет значения
в тех ситуациях, когда байт-коды передаются по сети, сеть все равно медленнее
любой интерпретации, но в других ситуациях требуется мощный и быстрый компьютер.
Поэтому постоянно идет усовершенствование интерпретаторов в сторону увеличения
скорости интерпретации. Разработаны
JIT-компиляторы
(Just-In-Time), запоминающие
уже интерпретированные участки кода в машинных
командах процессора и просто выполняющие
эти участки при повторном обращении, например, в циклах. Это значительно увеличивает
скорость повторяющихся вычислений. Фирма SUN разработала целую технологию Hot-Spot
и включает ее в свою виртуальную машину Java. Но, конечно, наибольшую скорость
может дать только специализированный процессор.
Фирма SUN Microsystems выпустила
микропроцессоры PicoJava, работающие на системе команд JVM, и собирается выпускать
целую линейку все более мощных Java-процессоров. Есть уже и Java-процессоры
других фирм. Эти процессоры непосредственно выполняют байт-коды. Но при выполнении
программ Java на других процессорах требуется еще интерпретация команд JVM в
команды конкретного процессора, а значит, нужна программа-интерпретатор, причем
для каждого типа процессоров, и для каждой архитектуры компьютера следует написать
свой интерпретатор.
Эта задача уже решена практически
для всех компьютерных платформ. На них реализованы виртуальные машины Java,
а для наиболее распространенных платформ имеется несколько реализаций JVM разных
фирм. Все больше операционных систем и систем управления базами данных включают
реализацию JVM в свое ядро. Создана и специальная операционная система JavaOS,
применяемая в электронных устройствах. В большинство браузеров встроена виртуальная
машина Java для выполнения апплетов.
Внимательный читатель уже заметил,
что кроме реализации JVM для выполнения байт-кодов на компьютере еще нужно иметь
набор функций, вызываемых из байт-кодов и динамически компонующихся с байт-кодами.
Этот набор оформляется в виде библиотеки классов Java, состоящей из одного или
нескольких
пакетов.
Каждая функция может быть записана байт-кодами, но,
поскольку она будет храниться на конкретном компьютере, ее можно записать прямо
в системе команд этого компьютера, избегнув тем самым интерпретации байт-кодов.
Такие функции называют
"родными" методами
(native methods).
Применение "родных" методов ускоряет выполнение программы.
Фирма SUN Microsystems — создатель
технологии Java — бесплатно распространяет набор необходимых программных инструментов
для полного цикла работы с этим языком программирования: компиляции, интерпретации,
отладки, включающий и богатую библиотеку классов, под названием JDK (Java Development
Kit). Есть наборы инструментальных программ и других фирм. Например, большой
популярностью пользуется JDK фирмы IBM.