Рассмотрение истории создания и развития языка Java было бы неполным без описания особенностей, характерных для Java. Основным фактором, обусловившим изобретение Java, стала потребность в обеспечении переносимости и безопасности, но свою роль в формировании окончательной версии языка сыграли и другие факторы. Группа разработчиков обобщила основные понятия Java и составила следующий перечень его особенностей:
- простота;
- безопасность;
- переносимость;
- объектная ориентированность;
- надежность;
- многопоточность;
- архитектурная нейтральность;
- интерпретируемость;
- высокая производительность;
- распределенность;
- динамичность.
Мы уже рассмотрели такие особенности, как безопасность и переносимость. А теперь поясним значение остальных элементов этого списка.
Простота
Язык Java был задуман как простой в изучении и эффективный в употреблении профессиональными программистами. Овладеть языком Java тем, у кого имеется некоторый опыт программирования, не составит особого труда. Если же вы уже знакомы с основными принципами объектно-ориентированного программирования, то изучить Java вам будет еще проще. А от тех, кто имеет опыт программирования на C++, переход к java вообще потребует минимум усилий. Язык Java наследует синтаксис C/C++ и многие объектно-ориентированные свойства C++, поэтому для большинства программистов изучение Java не составит больших трудностей.
Объектная ориентированность
Хотя предшественники языка Java и оказали влияние на его архитектуру и синтаксис, при его проектировании не ставилась задача совместимости по исходному коду с каким-нибудь другим языком. Это позволило группе разработчиков создавать Java, по существу, с чистого листа. Одним из следствий этого явился четкий, практичный, прагматичный подход к объектам. Помимо того, что язык Java позаимствовал свойства многих удачных объектно-программных сред, разработанных на протяжении нескольких последних десятилетий, в нем удалось достичь золотой середины между строгим соблюдением принципа “все элементы программы являются объектами” и более прагматичного принципа “прочь с дороги”. Объектная модель Java проста и легко расширяема. В то же время такие элементарные типы данных, как целочисленные, сохраняются в виде высокопроизводительных компонентов, не являющихся объектами.
Надежность
Многоплатформенная среда веб предъявляет к программам повышенные требования, поскольку они должны надежно выполняться в разнотипных системах. Поэтому способность создавать надежные программы была одним из главных приоритетов при pa3pa6oTKeJava. Для обеспечения надежности Bjava накладывается ряд ограничений в нескольких наиболее важных областях, что вынуждает программистов выявлять ошибки на ранних этапах разработки программы. В то же время Java избавляет от необходимости беспокоиться по поводу многих наиболее часто встречающихся ошибок программирования. А поскольку Java — строго типизированный язык, то проверка кода выполняется во время компиляции. Но проверка кода делается и во время выполнения. В результате многие трудно обнаруживаемые программные ошибки, которые часто приводят к возникновению с трудом воспроизводимых ситуаций во время выполнения, попросту невозможны в программе Hajava. Предсказуемость кода в разных ситуациях — одна из основных особенностей Java.
Чтобы понять, каким образом достигается надежность программ на Java, рассмотрим две основные причины программных сбоев: ошибки управления памятью и неправильная обработка исключений (т.е. ошибки при выполнении). В традиционных средах создания программ управление памятью — сложная и трудоемкая задача. Например, в среде C/C++ программист должен вручную резервировать и освобождать всю динамически распределяемую память. Иногда это ведет к возникновению трудностей, поскольку программисты забывают освободить ранее зарезервированную память или, что еще хуже, пытаются освободить область памяти, все еще используемую другой частью кода. Java полностью исключает такие ситуации, автоматически управляя резервированием и освобождением памяти. (Освобождение оперативной памяти полностью выполняется автоматически, поскольку Java предоставляет средства сборки неиспользуемых объектов в “мусор”.) В традиционных средах условия для исключений часто возникают в таких ситуациях, как деление на нуль или отсутствие искомого файла, а управление ими должно осуществляться с помощью громоздких и трудных для понимания конструкций. Java облегчает выполнение этой задачи, предлагая объектно-ориентированный механизм обработки исключений. В грамотно написанной программе Hajava все ошибки при выполнении могут (и должны) обрабатываться самой программой.
Многопоточность
Язык Java был разработан в ответ на потребность создавать интерактивные сетевые программы. Для этой цели в Java поддерживается написание многопоточных программ, способных одновременно выполнять многие действия. Исполняющая система Java содержит изящное, но вместе с тем сложное решение задачи синхронизации многих процессов, которое позволяет строить устойчиво работающие интерактивные системы. Простой подход к организации многопоточной обработки, реализованный в java, позволяет программистам сосредоточивать основное внимание на конкретном поведении программы, а не на создании многозадачной подсистемы.
Архитектурная нейтральность
Основной задачей, которую ставили перед собой разработчики Java, было обеспечение долговечности и переносимости кода. Одной из главных трудностей, стоявших перед разработчиками, когда они создавали Java, было отсутствие всяких гарантий, что код, написанный сегодня, будет успешно выполняться завтра — даже на одном и том же компьютере. Операционные системы и процессоры постоянно совершенствуются, и любые изменения в основных системных ресурсах могут стать причиной неработоспособности программ. Пытаясь каким-то образом изменить это положение, разработчики приняли ряд жестких решений в самом языке и виртуальной машине Java. Они поставили перед собой следующую цель:
“написано однажды, выполняется везде, в любое время и всегда”. И эта цель была в значительной степени достигнута.
Интерпретируемость и высокая производительность
Как упоминалось ранее, выполняя компиляцию программ в промежуточное представление, называемое байт-кодом, Java позволяет создавать межплатформенные программы. Такой код может выполняться в любой системе, на которой реализована виртуальная машина JVM. С первых же попыток разработать межплатформенные решения удалось достичь поставленной цели, хотя и за счет снижения производительности. Как пояснялось ранее, байт-код Java был тщательно разработан таким образом, чтобы его можно было с высокой эффективностью преобразовывать непосредственно в машинозависимый код на конкретной платформе с помощью динамического компилятора. Исполняющие системы Java, обеспечивающие такую возможность, сохраняют все преимущества кода, не зависящего от конкретной платформы.
Распределенность
Язык Java предназначен для распределенной среды Интернета, поскольку он поддерживает семейство сетевых протоколов TCP/IP. По существу, обращение к ресурсу по унифицированному указателю информационного ресурса (URL) мало чем отличается от обращения к файлу. В Java поддерживается также удаленный вызов методов (RMI — Remote Method Invocation). Такая возможность позволяет вызывать методы из программ через сеть.
Динамичность
Программы на Java содержат значительный объем данных динамического типа, используемых для проверки полномочий и разрешения доступа к объектам во время выполнения. Это позволяет безопасно и рационально выполнять динамическое связывание кода. Данное обстоятельство исключительно важно для устойчивости среды Java, где небольшие фрагменты байт-кода могут динамически обновляться в действующей системе.