Компилятор генерирует объектный файл, формат которого не зависит от
архитектуры компьютера. В данном случае скомпилированная программа
может выполняться на любых процессорах под управлением системы
выполнения программ языка Java.
Для этого компилятор языка Java генерирует команды байт-кода, не
зависящие от конкретной архитектуры компьютера. Байт-код разработан
таким образом, чтобы на любой машине его можно было легко
интерпретировать либо на лету перевести в машиннозависимый код.
Но эту идею нельзя назвать революционной. Еще в 70-е годы в
системе реализации языка Pascal, разработанной Никлаусом Виртом
(Niclaus Wirth) и в системе UCSD Pascal применялась та же самая
технология.
Использование байт-кодов дает большой выигрыш при выполнении программы
(хотя в некоторых случаях синхронная компиляция его компенсирует).
Разработчики языка Java прекрасно справились с разработкой набора
команд байт-кода, которые отлично работают на большинстве современных
компьютеров, легко транслируясь в реальные машинные команды.
Машиннонезависимый
В отличие от языков С и С++, в спецификации Java нет аспектов,
зависящих от системы реализации. И размер основных типов данных и
арифметические операции над ними имеют точное определение.
К примеру, тип int в языке Java всегда означает 32-разрядное
целое число. В языках С и С++ тип int может означать как 16-разрядное,
так и 32-разрядное целое число произвольного размера в зависимости от
разработчика конкретного компилятора.
Единственное ограничение - размер типа int не может быть
меньше размера типа short int и больше размера типа long int. Подобный
фиксированный размер числовых типов позволяет избежать многих
неприятностей, которые связаны с выполнением программ на разных
компьютерах.
Бинарные данные хранятся и передаются в фиксированном формате,
что также позволяет избежать недоразумений, связанных с разным порядком
записи байтов на разных платформах (конфликт типа "big endian/little
endian"). Строки хранятся в стандартном формате Unicode.
Библиотеки, представляющие собой часть системы, определяют
машиннонезависимый интерфейс. К примеру, в языке предусмотрен
абстрактный класс Window и его реализация для операционных систем UNIX,
Windows и Macintosh.
Каждый из программистов, кто когда-либо пытался написать
программу, которая одинаково хорошо работала бы под управлением
операционных систем Windows, Macintosh и десятков разновидностей
системы UNIX, знает, что это практически нереализуемая задача.
Версия Java 1.0 предприняла попытку решить эту проблему,
предоставив простой инструментарный набор, адаптирующий обычные
элементы пользовательского интерфейса к большому количеству программных
платформ.
Во многих приложениях машинная независимость намного важнее
изысканности графического интерфейса. Именно эти приложения выиграли от
появления версии Java 1.0.
В наши дни инструментальный набор для создания графического
пользовательского интерфейса полностью переработан и больше не зависит
от интерфейса пользователя.