Java и ООП

Отличия и особенности Java

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

1.1 Независимость от платформы

Одной из основных задач Java была возможность исполнения одной и той же программы на различных платформах. В Java эту проблему призван решить компонент, который называется виртуальная машина Java (JVM - Java Virtual Machine). Таким образом, можно выделить две составляющие технологии Java:

Отличие компилятора Java от компиляторов таких языков как C/C++, Pascal заключается в том, что результатом компиляции программы является файл с так называемым байт-кодом – промежуточным языком, который не является набором команд какому-то конкретному процессору. Для того чтобы получить запустить программу, файл с байт-кодом подается на вход виртуальной машине, которая преобразует инструкции байт-кода в инструкции процессора. Таким образом, для того чтобы обеспечить кроссплатформенность достаточно для каждой операционной системы написать виртуальную машину Java. На данный момент эта задача выполнена для всех распространенных ОС.

1.2 Отсутствие прямой работы с памятью

 По мнению создателей Java, наибольшее количество программ не являются устойчивыми из-за того, что разработчикам предоставляется прямой доступ к памяти программы (в языках C/C++, Pascal эта возможность реализована с помощью указателей). В Java данную проблему решили радикальным образом, запретив программисту напрямую обращаться к памяти. Таким образом, программы, написанные на Java, являются более устойчивыми. Однако повышение устойчивости сопровождается понижением производительности (например, при каждом обращении к элементу массива Java-машина проверяет, не был ли совершен выход за границы массива).

1.3 Сборка мусора

Еще один минус традиционных языков программирования заключается в том, что при разработке программ большое количество времени уделяется тому, чтобы вручную удалить те созданные объекты, для которых больше нет необходимости в использовании (написать delete для каждого new в С++ или dispose для каждого new в Pascal). Ошибки программиста в этой части программы могут привести к утечке памяти во время выполнения. Для того чтобы решить эту проблему в состав виртуальной машины Java был включен компонент, который следит за всеми созданными объектами и удаляет те из них, которые больше не могут быть использованы. Этот компонент называется сборщиком мусора (garbage collector), а процесс его работы - сборкой мусора. Таким образом, у программиста больше нет необходимости следить за всеми созданными объектами. Более того, ручное удаление объектов в Java отсутствует.

Следует отметить, что сборщик мусора – одна из сложных частей Java-машины. Рассмотрим, например, один из алгоритмов сборки: для каждого созданного объекта будем хранить количество ссылок на него. В том случае, если количество ссылок станет равным нулю – удалим объект. Проблема такого подхода в том, что два объекта могут внутри себя содержать ссылки друг на друга, и за счет этого никогда не будут удалены (в ранних версиях Java программистам рекомендовалось самостоятельно разрывать такие циклические ссылки в том случае, когда объекты переставали использоваться).

1.4 Java <=> байт-код

Компиляторы традиционных языков программирования для повышения производительности программы в процессе компиляции выполняют оптимизацию исходного кода. Компилятор языка Java не ставит перед собой такой задачи. Более того, байт-код, полученный в результате компиляции Java программы можно почти на 100% преобразовать в исходный код. В байт-коде сохраняются имена функций, классов и переменных программы (строго говоря, это утверждение выполняется не для всех идентификаторов программы, например имена локальных переменных не сохраняются). Неоднозначность может возникнуть и из-за того, что некоторые различные варианты исходного кода (например, разные циклы) могут компилироваться в одинаковый байт-код.

Такое свойство Java позволяет вызывать функции и создавать объекты классов, зная только их имена (так называемая рефлексия (reflection)).

1.5 JIT - компилятор

Ни одно из перечисленных выше свойств не повышало производительности программы, поэтому в Java-машину был добавлен JIT(Just In Time) - компилятор. JIT - компилятор является частью виртуальной машины и занимается тем, что производит оптимизацию байт-кода программы во время выполнения и превращает его в нативные команды процессора. Надо, однако, отметить, что все изменения, произведенные JIT-компилятором, действуют исключительно во время выполнения программы и сбрасываются при ее завершении. Преимущество JIT - компилятора заключается в том, что в ходе выполнения программы компилятору доступны данные программы, что позволяет произвести более гибкую оптимизацию (технология HotSpot). Улучшения могут оказаться настолько существенными, что для некоторых (специально подобранных) примеров программы на Java работают быстрее, чем на других языках.

1.6 Стандартная библиотека Java

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

1.7 Монополия Sun

Технология Java является собственностью фирмы Sun, и именно она определяет стандарт языка. Таким образом, словом 'Java' может называться только продукт, сертифицированный фирмой Sun. Однако существует довольно большое количество технологий, которые имеют почти полную совместимость с Java, однако ею не являются. Один из наиболее известных проектов – Waba (www.waba.com, www.superwaba.com) - представляет собой технологию разработки программ для мобильных устройств. Важно иметь в виду, что такие проекты могут не поддерживать полную функциональность виртуальной машины или не предоставлять полноценной стандартной библиотеки.

1.8 Язык Java

Java является объектно-ориентированным языком.

Резюме

Рассмотрим плюсы и минусы приведенных особенностей Java:

Свойство Java Плюсы Минусы
Виртуальная машина кроссплатформенность, простота компиляции Скорость
Отсутствие прямой работы с памятью уменьшение количества ошибок скорость проверки
Сборка мусора уменьшение количества ошибок скорость работы сборщика
Java <=> байт-код рефлексия, простота отладки потеря эффективности, проблема защиты кода
JIT - компилятор увеличение производительности
Стандартная библиотека ускорение разработки, уменьшение объема кода ошибки в стандартной библиотеке

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

История Java

1995

Фирма Sun объявляет о выходе первой версии продукта Java (Java 1.0). Технология разрабатывалась фирмой 4 года. Автором языка принято называть Джеймса Гослинга (James Gosling). Java поставляется в двух комплектах:

  1. JRE (Java Runtime Environment) - содержит все, что необходимо для запуска программы на Java.
  2. JDK (Java Development Kit) - включает в себя JRE, содержит средства разработки программ на Java.

1997

Java 1.1. В данной версии произошло сильное изменения языка Java по сравнению с первой версией (в настоящее время Java 1.0 не используется), однако, еще присутствуют проблемы со сборщиком мусора и в виртуальную машину не добавлен JIT-компилятор.

Свою реализацию 1.1.* выпустила фирма Microsoft. После этого Microsoft больше не выпускала Java, поэтому большое количество апплетов (applet) написано для этой версии.

Апплет (applet) - приложение, запускаемое через Интернет.

1999

Java 1.2. Данная версия Java стала более ориентирована на разработку приложений. В ней исправлены ошибки сборщика мусора и добавлена технология HotSpot. Чтобы подчеркнуть отличие от предыдущих версий, новая версия получила имя Java2 1.2. Начиная с Java2 1.2, технология стала делиться на подверсии:

Обе подверсии используют один и тот же язык и компилируются в одинаковый байт-код. Отличаются стандартные библиотеки, поставляемые с каждой из версий.

2000

Java2 1.3. С точки зрения языка почти ничего не изменилось. Появилась новая подверсия:

2001

Java2 1.4. Небольшие изменения в языке и большие изменения в стандартной библиотеке.

2002 – 2003

Фирма Microsoft выпустила технологию .Net Framework, во многом очень схожую с Java. В .NET программа так же компилируется в промежуточный язык и потом исполняется виртуальной машиной. Однако, в .NET программы могут быть написаны на различных языках. Проблема .NET заключается в том, что ее сложно реализовать на отличных от Windows платформах. “Родным” языком для разработки под .NET является C#. В настоящее время выпущена версия .NET Framework 2.0.

2004

Java2 1.5. Язык новой версии Java значительно расширен. Новая версия получила название Java 5.0. (Возможно, чтобы не отставать в нумерации версий от Microsoft .NET.)