по материалам еженедельника "Софтмаркет", N11, 1996 г.
Создатели языка Java постарались воплотить в своем "детище" все лучшие,
по их мнению, идеи объектно-ориентированных языков программирования. За
основу был взят C++, масса полезных идей была заимствована
из Objective C и SmallTalk, кое-что - из других языков.
Язык разрабатывался с 1990 года (подробности истории Java описаны в
"SM" NN 37-38/1995), однако лишь совсем недавно появилась версия языка,
получившая официальное название Java 1.0.
Вот перечень свойств языка Java, которыми особенно гордятся его
создатели (см. также сравнительную таблицу характеристик Java и других
языков программирования):
- Простота. Описание языка занимает всего 60 страниц, его вполне можно
прочитать за один вечер. Тем, кто знает C++, изучить этот язык будет
особенно просто.
- Объектная ориентированность. Концепция объектно-ориентированного
программирования реализована в Java весьма строго: в нем нет данных, не
являющихся объектами, нет и функций, не являющихся методами какого-либо
объекта.
Имеются следующие стандартные библиотеки классов:
- java.lang - в нее входят базовые классы;
- java.io - в ней хранятся средства для работы с потоками и файлами последовательного доступа;
- java.net - библиотека для создания сетевых приложений;
- java.util, содержащая классы-контейнеры с множеством полезных функций; наконец,
- java.awt - "оконная" библиотека.
Последняя представляет собой не что иное, как новый, не зависящий от конкретной графической оболочки стандарт для разработки приложений, использующих оконный интерфейс.
- Средства работы в сети. Java хорошо приспособлен для работы в сетях,
использующих протокол TCP/IP. Имеется специальная библиотека классов
для создания сетевых приложений.
- Интерпретируемость. Исходный код Java-приложений преобразуется
компилятором в так называемый байт-код, исполняемый виртуальной машиной
в режиме интерпретации.
Java использует так называемое очень позднее связывание, которое
начинается непосредственно перед исполнением. Еще одна характерная
особенность: при создании байт-кода компилятор не определяет адресов и
размеров объектов в памяти. Связывание имен и настройку адресов в
оперативной памяти осуществляет виртуальная машина, которая, кстати,
может изменить настройку на конкретные адреса, если сочтет это нужным,
приложения же ни о каких изменениях догадываться не будут.
- Надежность. Язык строго типизирован, стало быть, значительная часть
ошибок может быть выявлена на стадии компиляции. Конструкции C++,
предшественника Java, которые порой сбивали программистов с толку, в
новый язык не вошли. Возможности для контроля приложений на стадии
исполнения (переполнение стека, отслеживание границ массивов, поиск
резервов для оптимизации и др.) стали обязательным элементом средств
разработки.
- Безопасность. Поскольку Java изначально планировался для создания
коммерческих приложений, которые не только могут распространяться по
сетям, но и сами способны работать с сетями, разработчики языка
постарались уделить безопасности максимум внимания. Полученный по сети
байт-код проверяется на правильность инструкций (принадлежность к
байт-коду Java), на безопасность команд для компьютера и локальной
сети, на соответствие разрешенным операциям, а также на целый ряд
прочих условий.
- Динамичность. Язык Java динамичен, он открыт для новаций,
обновлений. По умолчанию все классы являются расширяемыми, а методы
виртуальными, хотя при желании можно запретить дальнейшую модификацию
класса или метода. В языке предусмотрена возможность создания модулей
без реализации или с неполной реализацией (нечто подобное есть и в
языке Ada).
- Переносимость и нейтральность относительно архитектуры. Байт-код
языка Java един для всех платформ и архитектур. Благодаря наличию
виртуальных машин Java-приложения могут разрабатываться и исполняться
на самых разных вычислительных платформах.
Базовые типы данных имеют строго определенный формат. Существует 4
базовых типа для описания целых чисел (8, 16, 32 и 64-разрядные), 2
базовых типа чисел с плавающей запятой (32 и 64-разрядные), 1
символьный тип (символ кодируется 2 байтами в стандарте UNICODE) и 1
логический (boolean). Имеются специальные классы для работы со строками
и символами.
- Многопоточность. В языке Java предусмотрены механизмы создания так
называемых легковесных параллельных процессов (threads), которые могут
работать в режиме квантования времени, используя синхронизацию на
основе мониторов Хоара.
- Автоматическая сборка мусора. Сборщик мусора встроен в виртуальную
машину. Он работает в фоновом режиме, осуществляя поиск потерянных
объектов и освобождая занятую ими память.
- Работа с исключениями. Язык содержит все необходимые средства для
корректной работы со всеми объектами и ресурсами в случае возникновения
исключительных ситуаций.
- Высокая производительность. По скорости работы Java-приложения
вполне соизмеримы с приложениями, разработанными на языках C и C++,
оказываясь иногда производительнее последних. Можно считать, что
генератор "родного" кода исполнительной машины встроен в динамический
загрузчик виртуальной машины. Процесс генерации машинного кода прост,
байт-коды легко интерпретируются и исполняются "на лету". Сильного
замедления не происходит также благодаря весьма разумному изначальному
кодированию, в результате которого работа с базовыми классами оказалась
встроенной в байт-код, и оптимизации, которая производится как на этапе
генерации байт-кода, так и перед непосредственным исполнением на
конкретной машине.