Особенности языка программирования Java

Объектно-ориентированное программирование - это метод программирования, в центре внимания которого находятся данные (т.е. объекты) и средства доступа к ним. По своему существу, объектно-ориентированные свойства языков Java и C++ совпадают.

Объектная ориентация за прошедшие 30 лет уже доказала свою ценность и практичность. Без нее уже невозможно представить себе современный язык программирования.

Основное отличие между языками Java и C++ заключается в механизме множественного наследования, для которого в языке Java найдено лучшее решение, а также в модели метаклассов языка Java. Механизмы отражения и серилизации объектов, реализованные в Java позволяют разработчику создавать устойчивые объекты и средства для графических пользовательских интерфейсов на основе готовых компонентов.

Язык Java обладает большой библиотекой программ для передачи данных на основе протоколов TCP/IP (Transmission Control Protocol/Internet Protocol - протокол передачи гипертекста) или FTP (File Transfer Protocol - протокол передачи файлов).

Приложения, написанные на языке Java, могут открывать объекты и получать к ним доступ через сеть с помощью URL-адресов (Uniform Resource Location - универсальный адрес ресурса) так же просто, как и в локальной сети.

Язык Java предоставляет мощные и удобные средства для работы в сети. Каждый, кто когда-либо пытался писать программы для работы в сети интернет на других языках программирования, удивлен тем, как легко решаются на языке Java самые трудные задачи, к примеру, открытие сетевых соединений (sockets connection).

Отлаженный механизм, состоящий из так называемых сервлетов (servlets), дает возможность работать с сервером очень просто и эффективно.

Надежность

Язык Java в первую очередь предназначен для создания программ, которые должны надежно работать на любых платформах и под любой нагрузкой. Основное внимание в языке Java было уделено раннему обнаружению возможных ошибок, динамической проверке (во время выполнения программы), а также исключению ситуаций, которые могут привести к ошибкам.

Единственное значительное отличие языка Java от языка С++ заключается в модели указателей, принятой в языке Java, которая исключает возможность перезаписи участка памяти и повреждения данных.

Это свойство очень важно. Компилятор языка Java выявляет такие ошибки, которые в других языках программирования обнаруживаются только на этапе выполнения программы. Кроме того, программисты, затратившие много времени на поиск ошибки, вызвавшей повреждение памяти из-за неверного указателя, избавятся от подобной проблемы в Java, поскольку в этом языке программирования такие проблемы не возникают.

В таких языках программирования, как Visual Basic и COBOL, указатели явно не используются. Но для программирования на С/С++ нужно уметь работать с указателями для доступа к строкам, массивам, объектам и даже файлам. Даже многие структуры данных в языке, не имеющем указателей, реализовать очень сложно. Программист на языке Java может не беспокоится о неверных указателях, неправильном распределении или утечке памяти.

Безопасность

Поскольку язык Java предназначен для использования в сетевой или распределенной среде, то вопросам его безопасности было уделено большое внимание. На данный момент язык Java позволяет создавать системы, надежно защищенные от вирусов и несанкционированного доступа.

Но 100% безопасности не может обеспечить ни один язык программирования, ведь все предусмотреть невозможно. Первые дыры в Java были найдены экспертами по вопросам безопасности из Пристонского университета еще в версии Java 1.0. Можно сказать, что все новые ошибки находятся до сих пор, но от этого не застрахован ни один язык программирования.

Тем не менее, специалисты компании Sun делают все, чтобы своевременно устранить бреши в безопасности JDK. Так, компания опубликовала внутренние спецификации интерпретатора языка Java и привлекла к поиску ошибок независимых специалистов в области безопасного ПО.

Обнаруженные на данный момент ошибки очень немногочисленны. Самую свежую информацию о вопросах безопасности Java можно прочитать на сайте Oracle.

Вот лишь небольшой список ситуаций, возникновение которых предотвращает система безопасности языка Java:

- переполнение стека выполняемой программы, к которому приводили некоторые черви;
- повреждение участков памяти, которые находятся за пределами пространства, выделенного процессу;
- считывание и запись локальных файлов при использовании безопасного загрузчика классов, например веб-браузера, который запрещает такой доступ к файлам.

Все меры безопасности вполне уместны и обычно работают без проблем, но осмотрительность никогда не повредит. Со временем в язык были добавлены новые средства защиты. Начиная с версии 1.1, в языке Java появилось понятие классов с цифровой подписью. Пользуясь классом с цифровой подписью, вы можете быть уверенными в его авторе. Если вы ему доверяете, то можете предоставить этому классу все привилегии, доступные на вашей машине.

Альтернативный механизм доставки кода, предложенный компанией Microsoft, опирается на технологию ActiveX и для безопасности использует только цифровые подписи. Но этого недостаточно, ведь любой пользователь ПО фирмы Microsoft может подтвердить, что программы даже известных производителей часто завершаются аварийно, создавая тем самым опасность повреждения данных.

В тоже время система безопасности в языке Java намного надежнее технологии ActiveX, поскольку она самостоятельно контролирует приложение с момента его запуска и не позволяет ему причинить ущерб.

Независимость от архитектуры

Компилятор генерирует объектный файл, формат которого не зависит от архитектуры компьютера. В данном случае скомпилированная программа может выполняться на любых процессорах под управлением системы выполнения программ языка 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.

В наши дни инструментальный набор для создания графического пользовательского интерфейса полностью переработан и больше не зависит от интерфейса пользователя.