Java
Java[прим. 1] — сильно типизированный [объектно-ориентированный язык программирования], разработанный компанией [Sun Microsystems] (в последующем приобретённой компанией [Oracle]). Приложения Java обычно [транслируются] в специальный [байт-код], поэтому они могут работать на любой компьютерной архитектуре, с помощью [виртуальной Java-машины]. Дата официального выпуска — 23 мая 1995 года.
Код для программы «Hello Java!»
1 class Hello { 2 public static void main(String[] args) { 3 System.out.println("Привет, Java!"); 4 } 5 }
Название
Изначально язык назывался Oak («Дуб»), разрабатывался [Джеймсом Гослингом] для программирования бытовых электронных устройств. Впоследствии он был переименован в Java и стал использоваться для написания клиентских приложений и [серверного] программного обеспечения. Назван в честь марки [кофе] Java, которая, в свою очередь, получила наименование одноимённого острова ([Ява]), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с [аллюзией] на кофе-машину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось, как это стало общепринятым позднее.
Основные особенности языка
Программы на Java [транслируются] в [байт-код Java], выполняемый [виртуальной машиной Java] (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как [интерпретатор].
Достоинством подобного способа выполнения программ является полная независимость байт-кода от [операционной системы] и [оборудования], что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности, в рамках которой исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером), вызывают немедленное прерывание.
Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:
- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
- широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами архитектуры ARM).
По данным сайта shootout.alioth.debian.org, для семи разных задач время выполнения на Java составляет в среднем в полтора-два раза больше, чем для C/C++, в некоторых случаях Java быстрее, а в отдельных случаях в 7 раз медленнее[11]. С другой стороны, для большинства из них потребление памяти Java-машиной было в 10—30 раз больше, чем программой на C/C++. Также примечательно исследование, проведённое компанией [Google], согласно которому отмечается существенно более низкая производительность и бо́льшее потребление памяти в тестовых примерах на Java в сравнении с аналогичными программами на [C++][12][13][14].
Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине[15]. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры [CLI], заложенной в основу платформы [.NET] компанией [Microsoft].
История версий
JDK 1.0
Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только 21 января 1996 года. Кодовое имя Oak.
JDK 1.1
Вторая версия была выпущена 12 февраля 1997 года. Кодовое имя Oak.
- Библиотека Accessibility.
- Java 2D.
- Поддержка технологии drag-and-drop.
- Полная поддержка Unicode, включая поддержку ввода на японском, китайском и корейском языках.
- Поддержка воспроизведения аудиофайлов нескольких популярных форматов.
- Полная поддержка технологии CORBA.
- JIT-компилятор, улучшенная производительность.
- Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ.
J2SE 1.2
Дата выпуска 8 декабря 1998 года. Кодовое имя Playground.
В данном случае встречается путаница. Выпускались книги, например, Beginning Java 2 by Ivor Horton (Mar 1999), фактически по J2SE 1.2 (бывшее название — Java 2). Вместе с тем по сей день такие книги публикуются, например: Х. М. Дейтел, П. Дж. Дейтел, С. И. Сантри. Технологии программирования на Java 2. Распределённые приложения (2011).
В то время, когда, как известно, Java 2 была исторически заменена следующими релизами, подобные названия книг дезориентируют в понимании, о какой же версии Java они написаны на самом деле. Если J2SE 1.2 принято считать за Java 2, а авторы книг за Java 2 принимают JDK 7, это приводит к полной путанице.
J2SE 1.3
Дата выпуска 8 мая 2000 года. Кодовое имя Kestrel.
J2SE 1.4
Дата выпуска 6 февраля 2002 года. Кодовое имя Merlin.
J2SE 5.0
Спецификация Java 5.0 была выпущена 30 сентября 2004 года, кодовое имя Tiger. C этой версии изменена официальная индексация, вместо Java 1.5 правильнее называть Java 5.0. Внутренняя же индексация Sun осталась прежней — 1.x. Минорные изменения теперь включаются без изменения индексации, для этого используется слово «Update» или буква «u», например, Java Development Kit 5.0 Update 22. Предполагается, что в обновления могут входить как исправления ошибок, так и небольшие добавления в API, JVM.
В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:
- Перечислимые типы (англ. enum). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.
- Аннотации — возможность добавления в текст программы метаданных, непосредственно не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода.
- Средства обобщённого программирования (англ. generics) — механизм, аналогичный средствам языков Ada и Eiffel (позже также появились и в C#, принципиально отличаются от шаблонов C++), дающий возможность создавать классы и методы с полями и параметрами произвольного объектного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java.
- Методы с неопределённым числом параметров.
- Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-обёртками (например, между int — Integer). Наличие такой возможности сокращает код, поскольку исключает необходимость выполнения явных преобразований типов в очевидных случаях.
- Разрешён импорт статических полей и методов.
- В язык введён цикл по коллекции объектов (итератор, англ. foreach).
- Было введено использование Javadoc-комментариев, которые используются для автоматического оформления документации по комментариям в исходном коде.
Java SE 6
Релиз версии состоялся 11 декабря 2006 года, кодовое имя Mustang. Изменена официальная индексация — вместо ожидаемой 6.0 версия значится как 6. Минорные изменения, как и в Java 5.0, вносятся в обычные обновления версии, например, Java Standard Edition Development Kit 6 Update 27. Внесены следующие изменения:
- Коллекции — добавлены интерфейсы для организации очереди, работающей с двух сторон коллекции; организовывающие поиск по ближайшему соответствию; блокирующие себя во время ожидания элемента. Организованы новые классы, реализующие перечисленные интерфейсы.
- Добавлена поддержка японского императорского календаря (наряду с уже существующими григорианским и буддийским календарями).
- Доступны классы-потоки для чтения и передачи сжатых данных, с возможностью передачи их по сети. Сняты ограничения на количество файлов в архиве (ранее 64 Кб), длину названия файла (ранее 256 символов) и количество одновременно открытых файлов (ранее 2000 шт).
- Организована система управления кэшем и добавлена поддержка параметра «no-cache» в HTTP-запросе.
- JConsole, графический мониторинг JVM, стала официально поддерживаемой утилитой.
- Java HTTP Server, позволяет создать полноценный HTTP сервер, с минимально необходимыми функциональными свойствами.
- Повысилась скорость вычислений на 70 %, скорость операций ввода-вывода возросла в два раза[16].
- Swing — улучшена работоспособность OpenGL и DirectX; обработка текста на LCD; добавлен GifWriter, для работы с файлами .gif.
- Исправлено большое количество ошибок.
Java FX
Дата выпуска 8 октября 2013 года.
Java ME Embedded
Дата выпуска 10 октября 2013 года. Кодовое имя Micro Edition.
Java SE 7
Релиз версии состоялся 28 июля 2011 года, кодовое имя Dolphin[17]. В финальную версию Java Standard Edition 7 не были включены все ранее запланированные изменения. Согласно плану развития (план «Б»)[18], включение нововведений будет разбито на две части: Java Standard Edition 7 (без [лямбда-исчисления], проекта Jigsaw, и части улучшений Coin[en]) и Java Standard Edition 8 (все остальное), намеченный на конец 2012 года.
В новой версии, получившей название Java Standard Edition 7 (Java Platform, Standard Edition 7), помимо исправления большого количества ошибок, было представлено несколько новшеств. Так, например, в качестве эталонной реализации Java Standard Edition 7 использован не проприетарный пакет [JDK], а его открытая реализация [OpenJDK], а сам релиз новой версии платформы готовился при тесном сотрудничестве инженеров [Oracle] с участниками мировой экосистемы Java, комитетом [JCP] (Java Community Process) и сообществом [OpenJDK]. Все поставляемые Oracle бинарные файлы эталонной реализации Java Standard Edition 7 собраны на основе кодовой базы [OpenJDK], сама эталонная реализация полностью открыта под лицензией [GPLv2] с исключениями [GNU] ClassPath, разрешающими динамическое связывание с проприетарными продуктами. К другим нововведениям относится интеграция набора небольших языковых улучшений Java, развиваемых в рамках проекта Coin, добавлена поддержка языков программирования с динамической типизацией, таких, как [Ruby], [Python] и [JavaScript], поддержка загрузки классов по [URL], обновлённый [XML]-стек, включающий [JAXP] 1.4, [JAXB] 2.2a и [JAX-WS] 2.2 и другие[19].
За 5 дней до выхода релиза Java Standard Edition 7 было обнаружено несколько серьёзных ошибок в горячей оптимизации циклов, которая включена по умолчанию и приводит виртуальную машину Java к краху. Специалисты Oracle найденные ошибки за столь короткий срок исправить не могли, но пообещали, что они будут исправлены во втором обновлении (Java 7 Update 2) и частично в первом[20].
Список нововведений
- Поддержка динамически-типизированных языков (InvokeDynamic) — расширение JVM (семантики байт-кода), языка Java[21] для поддержки динамически-типизированных языков.
- Строгая проверка class-файлов — class-файлы версии 51 (Java Standard Edition 7) или более поздней версии должны быть проверены typechecking-верификатором; JVM не должна переключаться на старый верификатор.
- Изменение синтаксиса языка Java (Project Coin) — частичные изменения в языке Java, предназначенные для упрощения общих задач программирования:
- Модификация загрузчика классов (class-loader) — избежание тупиковых ситуаций в неиерархической топологии загрузки классов.
- Закрытие ресурсов, открытых URLClassLoader.
- Обновление коллекций (JSR 166).
- Поддержка Unicode 6.0.
- Отделение языка пользователя и языка пользовательского интерфейса — обновление обработки языков для отделения локали от языка пользовательского интерфейса.
- Новые интерфейсы I/O для платформы Java (nio.2).
- Использование JDBC 4.1 и Rowset 1.1.
- … (не закончено)
Java SE 8
Релиз версии состоялся 19 марта 2014 года. Кодовое имя Octopus.