Java — это высокоуровневый , основанный на классах , объектно-ориентированный язык программирования , который разработан так, чтобы иметь как можно меньше зависимостей от реализации . Это язык программирования общего назначения, предназначенный для того, чтобы позволить программистам писать один раз, запускать где угодно ( WORA ), [16] что означает, что скомпилированный код Java может работать на всех платформах, которые поддерживают Java, без необходимости перекомпиляции. [17] Приложения Java обычно компилируются в байт-код , который может работать на любой виртуальной машине Java (JVM) независимо от базовой архитектуры компьютера . Синтаксис Java похож на C и C++ , но имеет меньше низкоуровневых возможностей, чем любой из них. Среда выполнения Java предоставляет динамические возможности (такие как отражение и модификация кода во время выполнения), которые обычно недоступны в традиционных компилируемых языках.
Java приобрела популярность вскоре после своего выпуска и с тех пор является очень популярным языком программирования. [18] Java стала третьим по популярности языком программирования в 2022 году [обновлять]по данным GitHub . [19] Несмотря на то, что Java по-прежнему широко популярен, в последние годы наблюдается постепенный спад использования Java, в то время как другие языки, использующие JVM, набирают популярность. [20]
Java изначально была разработана Джеймсом Гослингом в Sun Microsystems . Она была выпущена в мае 1995 года как основной компонент платформы Java от Sun. Оригинальная и эталонная реализация компиляторов Java , виртуальных машин и библиотек классов изначально были выпущены Sun по проприетарным лицензиям . По состоянию на май 2007 года, в соответствии со спецификациями Java Community Process , Sun повторно лицензировала большинство своих технологий Java по лицензии GPL-2.0-only . Oracle предлагает собственную виртуальную машину Java HotSpot , однако официальной эталонной реализацией является OpenJDK JVM, которая является бесплатным программным обеспечением с открытым исходным кодом и используется большинством разработчиков, а также является JVM по умолчанию почти для всех дистрибутивов Linux.
По состоянию на сентябрь 2024 года [обновлять]Java 23 является последней версией (Java 22 и 20 больше не поддерживаются). Java 8, 11, 17 и 21 — предыдущие версии LTS, которые официально поддерживаются.
Джеймс Гослинг , Майк Шеридан и Патрик Нотон инициировали проект языка Java в июне 1991 года. [21] Первоначально Java был разработан для интерактивного телевидения, но в то время он был слишком продвинут для индустрии цифрового кабельного телевидения. [22] Первоначально язык назывался Oak в честь дуба , который рос снаружи офиса Гослинга. Позже проект получил название Green и был окончательно переименован в Java , от Java coffee , сорта кофе из Индонезии . [23] Гослинг разработал Java с синтаксисом в стиле C / C++ , который системные и прикладные программисты сочтут знакомым. [24]
Sun Microsystems выпустила первую публичную реализацию как Java 1.0 в 1996 году. [25] Она обещала функциональность write once, run anywhere (WORA), предоставляя бесплатные среды выполнения на популярных платформах . Достаточно безопасная и с настраиваемой безопасностью, она допускала ограничения доступа к сети и файлам. Основные веб-браузеры вскоре включили возможность запускать апплеты Java на веб-страницах, и Java быстро стала популярной. Компилятор Java 1.0 был переписан на Java Артуром ван Хоффом, чтобы строго соответствовать спецификации языка Java 1.0. [26] С появлением Java 2 (первоначально выпущенной как J2SE 1.2 в декабре 1998 - 1999) новые версии имели несколько конфигураций, созданных для разных типов платформ. J2EE включала технологии и API для корпоративных приложений, обычно запускаемых в серверных средах, в то время как J2ME включала API, оптимизированные для мобильных приложений. Настольная версия была переименована в J2SE. В 2006 году в маркетинговых целях Sun переименовала новые версии J2 в Java EE , Java ME и Java SE соответственно.
В 1997 году Sun Microsystems обратилась в комитет по стандартизации ISO/IEC JTC 1 , а позднее в Ecma International, с целью формализовать Java, но вскоре вышла из этого процесса. [27] [28] [29] Java остается фактическим стандартом , контролируемым Java Community Process . [30] В свое время Sun сделала большинство своих реализаций Java доступными бесплатно, несмотря на их статус проприетарного программного обеспечения . Sun получала доход от Java за счет продажи лицензий на специализированные продукты, такие как Java Enterprise System.
13 ноября 2006 года Sun выпустила большую часть своей виртуальной машины Java (JVM) как бесплатное и открытое программное обеспечение (FOSS) на условиях лицензии GPL-2.0-only . 8 мая 2007 года Sun завершила процесс, сделав весь основной код своей JVM доступным на условиях свободного программного обеспечения /распространения с открытым исходным кодом, за исключением небольшой части кода, на которую Sun не имела авторских прав. [31]
Вице-президент Sun Рич Грин сказал, что идеальная роль Sun в отношении Java — быть евангелистом . [32] После приобретения Oracle Corporation компании Sun Microsystems в 2009–2010 годах, Oracle описала себя как хранителя технологии Java с неустанной приверженностью содействию сообществу участия и прозрачности. [33] Это не помешало Oracle вскоре после этого подать иск против Google за использование Java внутри Android SDK (см. раздел Android ).
2 апреля 2010 года Джеймс Гослинг ушел из Oracle . [34]
В январе 2016 года Oracle объявила, что среды выполнения Java на основе JDK 9 прекратят поддержку плагина для браузера. [35]
Программное обеспечение Java работает на всех устройствах: от ноутбуков до центров обработки данных , игровых консолей и научных суперкомпьютеров . [36]
Oracle (и другие) настоятельно рекомендуют удалить устаревшие и неподдерживаемые версии Java из-за нерешенных проблем безопасности в старых версиях. [37]
При создании языка Java преследовалось пять основных целей: [17]
- Он должен быть простым, объектно-ориентированным и знакомым.
- Он должен быть прочным и безопасным.
- Он должен быть архитектурно-нейтральным и переносимым.
- Он должен работать с высокой производительностью.
- Он должен быть интерпретируемым , потоковым и динамичным .
По состоянию на сентябрь 2023 года [обновлять]Java 8, 11, 17 и 21 поддерживаются как версии с долгосрочной поддержкой (LTS). [38]
Oracle выпустила последнее бесплатное публичное обновление для устаревшей версии Java 8 LTS в январе 2019 года для коммерческого использования, хотя в остальном она будет по-прежнему поддерживать Java 8 с публичными обновлениями для личного использования на неопределенный срок. Другие поставщики, такие как Adoptium, продолжают предлагать бесплатные сборки версий OpenJDK с долгосрочной поддержкой (LTS). Эти сборки могут включать дополнительные исправления безопасности и ошибки. [39]
Основные версии Java и даты их выпуска:
Sun определила и поддерживает четыре редакции Java, ориентированные на различные среды приложений, и сегментировала многие из своих API , чтобы они принадлежали к одной из платформ. Платформы:
Классы в API Java организованы в отдельные группы, называемые пакетами . Каждый пакет содержит набор связанных интерфейсов , классов, подпакетов и исключений .
Sun также представила версию под названием Personal Java , которая была заменена более поздними, основанными на стандартах парами конфигурации и профиля Java ME.
Одной из целей разработки Java является переносимость , что означает, что программы, написанные для платформы Java, должны работать одинаково на любой комбинации оборудования и операционной системы с адекватной поддержкой времени выполнения. Это достигается путем компиляции кода языка Java в промежуточное представление, называемое байт-кодом Java , а не напрямую в машинный код , специфичный для архитектуры . Инструкции байт-кода Java аналогичны машинному коду, но они предназначены для выполнения виртуальной машиной (VM), написанной специально для оборудования хоста. Конечные пользователи обычно используют Java Runtime Environment (JRE), установленную на их устройстве для автономных приложений Java, или веб-браузер для апплетов Java .
Стандартные библиотеки предоставляют универсальный способ доступа к специфичным для хоста функциям, таким как графика, потоки и сетевые функции .
Использование универсального байт-кода упрощает портирование. Однако накладные расходы на интерпретацию байт-кода в машинные инструкции делали интерпретируемые программы почти всегда более медленными, чем собственные исполняемые файлы . Компиляторы Just-in-time (JIT), которые компилируют байт-коды в машинный код во время выполнения, были введены на ранней стадии. Компилятор Java Hotspot на самом деле представляет собой два компилятора в одном; и с GraalVM (включенным, например, в Java 11, но удаленным с Java 16) допускает многоуровневую компиляцию. [48] Сама Java не зависит от платформы и адаптируется к конкретной платформе, на которой она должна работать, с помощью виртуальной машины Java (JVM), которая транслирует байт-код Java в машинный язык платформы. [49]
Программы, написанные на Java, имеют репутацию более медленных и требующих больше памяти, чем программы, написанные на C++ . [50] [51] Однако скорость выполнения программ на Java значительно возросла с введением компиляции «на лету» в 1997/1998 годах для Java 1.1 , [52] добавлением языковых функций, поддерживающих лучший анализ кода (таких как внутренние классы, класс StringBuilder, необязательные утверждения и т. д.), и оптимизаций в виртуальной машине Java, таких как HotSpot, ставший JVM по умолчанию от Sun в 2000 году. С Java 1.5 производительность была улучшена с добавлением пакета java.util.concurrent
, включая реализации ConcurrentMaps и других многоядерных коллекций без блокировок , и она была улучшена еще больше с Java 1.6.
Некоторые платформы предлагают прямую аппаратную поддержку Java; существуют микроконтроллеры, которые могут запускать байт-код Java на аппаратном уровне вместо программной виртуальной машины Java, [53] а некоторые процессоры на базе ARM могут иметь аппаратную поддержку для выполнения байт-кода Java через опцию Jazelle , хотя поддержка в большинстве случаев была прекращена в текущих реализациях ARM.
Java использует автоматический сборщик мусора для управления памятью в жизненном цикле объекта . Программист определяет, когда создаются объекты, а среда выполнения Java отвечает за восстановление памяти, когда объекты больше не используются. Как только не остается ссылок на объект, недоступная память становится доступной для автоматического освобождения сборщиком мусора. Что-то похожее на утечку памяти все еще может произойти, если код программиста содержит ссылку на объект, который больше не нужен, как правило, когда объекты, которые больше не нужны, хранятся в контейнерах, которые все еще используются. [54] Если вызываются методы для несуществующего объекта, выдается исключение нулевого указателя . [55] [56]
Одна из идей, лежащих в основе модели автоматического управления памятью Java, заключается в том, что программисты могут быть избавлены от необходимости выполнять ручное управление памятью. В некоторых языках память для создания объектов неявно выделяется в стеке или явно выделяется и освобождается из кучи . В последнем случае ответственность за управление памятью лежит на программисте. Если программа не освобождает объект, происходит утечка памяти . [54] Если программа пытается получить доступ или освободить память, которая уже была освобождена, результат неопределен и трудно предсказуем, и программа, скорее всего, станет нестабильной или аварийно завершится. Это можно частично исправить с помощью интеллектуальных указателей , но они добавляют накладные расходы и сложность. Сборка мусора не предотвращает логические утечки памяти , то есть те, когда память все еще используется, но никогда не используется. [54]
Сборка мусора может произойти в любое время. В идеале она будет происходить, когда программа простаивает. Она гарантированно сработает, если в куче недостаточно свободной памяти для выделения нового объекта; это может привести к кратковременной остановке программы. Явное управление памятью невозможно в Java.
Java не поддерживает арифметику указателей в стиле C/C++ , где адреса объектов могут быть арифметически изменены (например, путем добавления или вычитания смещения). Это позволяет сборщику мусора перемещать ссылочные объекты и обеспечивает безопасность и защищенность типов.
Как и в C++ и некоторых других объектно-ориентированных языках, переменные примитивных типов данных Java хранятся либо непосредственно в полях (для объектов), либо в стеке (для методов), а не в куче, как это обычно бывает с непримитивными типами данных (но см. анализ выхода ). Это было осознанное решение разработчиков Java из соображений производительности.
Java содержит несколько типов сборщиков мусора. Начиная с Java 9, HotSpot использует Garbage First Garbage Collector (G1GC) по умолчанию. [57] Однако есть также несколько других сборщиков мусора, которые можно использовать для управления кучей. Для большинства приложений на Java достаточно G1GC. Ранее в Java 8 использовался Parallel Garbage Collector.
Решение проблемы управления памятью не освобождает программиста от необходимости правильно обрабатывать другие виды ресурсов, такие как сетевые или базовые соединения, дескрипторы файлов и т. д., особенно при наличии исключений.
Синтаксис Java во многом сформирован под влиянием C++ и C. В отличие от C++, который объединяет синтаксис структурированного, обобщенного и объектно-ориентированного программирования, Java был создан почти исключительно как объектно-ориентированный язык. [17] Весь код написан внутри классов, и каждый элемент данных является объектом, за исключением примитивных типов данных (т. е. целых чисел, чисел с плавающей точкой, логических значений и символов), которые не являются объектами по соображениям производительности. Java повторно использует некоторые популярные аспекты C++ (например, printf
метод ).
В отличие от C++, Java не поддерживает перегрузку операторов [58] или множественное наследование для классов, хотя множественное наследование поддерживается для интерфейсов . [59]
Java использует комментарии, похожие на комментарии C++. Существует три различных стиля комментариев: однострочный стиль, отмеченный двумя косыми чертами ( //
), многострочный стиль, открывающийся /*
и закрывающийся */
, и стиль комментариев Javadoc , открывающийся /**
и закрывающийся */
. Стиль комментариев Javadoc позволяет пользователю запускать исполняемый файл Javadoc для создания документации к программе и может быть прочитан некоторыми интегрированными средами разработки (IDE), такими как Eclipse, чтобы позволить разработчикам получать доступ к документации в IDE.
Ниже приведен простой пример программы «Hello, World!» , которая записывает сообщение в стандартный вывод :
Пример открытого класса { public static void main ( string [] args ) { System.out.println ( " Привет , мир! " ) ; }}
Java-апплеты — это программы, встроенные в другие приложения, обычно в веб-страницу, отображаемую в веб-браузере. API Java-апплета теперь устарело с Java 9 в 2017 году. [60] [61]
Технология сервлетов Java предоставляет веб-разработчикам простой и последовательный механизм для расширения функциональности веб-сервера и доступа к существующим бизнес-системам. Сервлеты — это серверные компоненты Java EE, которые генерируют ответы на запросы клиентов . В большинстве случаев это означает генерацию HTML- страниц в ответ на HTTP- запросы, хотя существует ряд других стандартных классов сервлетов, например, для связи WebSocket .
API сервлетов Java в некоторой степени был заменен (но все еще используется в недрах Интернета) двумя стандартными технологиями Java для веб-сервисов:
Типичные реализации этих API на серверах приложений или контейнерах сервлетов используют стандартный сервлет для обработки всех взаимодействий с HTTP- запросами и ответами, которые делегируют методы веб-службы для фактической бизнес-логики.
JavaServer Pages ( JSP ) — это серверные компоненты Java EE, которые генерируют ответы, обычно HTML- страницы, на HTTP- запросы от клиентов . JSP встраивают код Java в HTML-страницу с помощью специальных разделителей <%
и %>
. JSP компилируется в сервлет Java , приложение Java само по себе, при первом доступе к нему. После этого сгенерированный сервлет создает ответ. [62]
Swing — это библиотека графического пользовательского интерфейса для платформы Java SE. Можно указать другой внешний вид и поведение с помощью подключаемой системы внешнего вида и поведения Swing. Клоны Windows , GTK+ и Motif поставляются Sun. Apple также предоставляет внешний вид и поведение Aqua для macOS . В то время как предыдущие реализации этих внешних видов и поведения могли считаться недостаточными, Swing в Java SE 6 решает эту проблему, используя более собственные процедуры отрисовки виджетов GUI базовых платформ. [63]
JavaFX — это программная платформа для создания и доставки настольных приложений , а также многофункциональных веб-приложений , которые могут работать на самых разных устройствах. JavaFX предназначена для замены Swing в качестве стандартной библиотеки GUI для Java SE , но с JDK 11 JavaFX не входит в ядро JDK, а вместо этого находится в отдельном модуле. [64] JavaFX поддерживает настольные компьютеры и веб-браузеры в Microsoft Windows , Linux и macOS . JavaFX не поддерживает собственный внешний вид и поведение ОС. [65]
В 2004 году в язык Java были добавлены обобщенные типы как часть J2SE 5.0. До введения обобщенных типов каждое объявление переменной должно было быть определенного типа. Например, для классов контейнеров это проблема, поскольку нет простого способа создать контейнер, который принимает только определенные типы объектов. Либо контейнер работает со всеми подтипами класса или интерфейса, обычно Object
, либо для каждого содержащегося класса необходимо создать другой класс контейнера. Обобщенные типы позволяют выполнять проверку типов во время компиляции без необходимости создания множества классов контейнеров, каждый из которых содержит почти идентичный код. Помимо включения более эффективного кода, некоторые исключения времени выполнения предотвращаются путем выдачи ошибок времени компиляции. Если бы Java предотвращала ClassCastException
возникновение всех ошибок типа времени выполнения ( s), это было бы типобезопасно .
В 2016 году система типов Java была признана несостоятельной , поскольку стало возможным использовать обобщения для создания классов и методов, которые позволяют назначать экземпляр одного класса переменной другого неродственного класса. Такой код принимается компилятором, но во время выполнения выдает исключение приведения класса. [66]
Критика, направленная на Java, включает реализацию дженериков, [67] скорость, [50] обработку беззнаковых чисел, [68] реализацию арифметики с плавающей точкой, [69] и историю уязвимостей безопасности в основной реализации Java VM HotSpot . [70] Разработчики критиковали сложность и многословность Java Persistence API (JPA), стандартной части Java EE. Это привело к более широкому принятию абстракций более высокого уровня, таких как Spring Data JPA, которая направлена на упрощение операций с базами данных и сокращение шаблонного кода. Растущая популярность таких фреймворков предполагает ограничения в простоте использования стандартной реализации JPA для современной разработки Java. [71]
Библиотека классов Java — это стандартная библиотека , разработанная для поддержки разработки приложений на Java. Она контролируется Oracle совместно с другими через программу Java Community Process . [72] Компании или отдельные лица, участвующие в этом процессе, могут влиять на проектирование и разработку API. Этот процесс был предметом споров в 2010-х годах. [73] Библиотека классов содержит такие функции, как:
Javadoc — это комплексная система документирования, созданная Sun Microsystems . Она предоставляет разработчикам организованную систему для документирования их кода. Комментарии Javadoc имеют дополнительную звездочку в начале, то есть разделителями являются /**
и */
, тогда как обычные многострочные комментарии в Java разделяются /*
и */
, а однострочные комментарии начинаются с //
. [81]
Корпорация Oracle владеет официальной реализацией платформы Java SE в связи с приобретением ею Sun Microsystems 27 января 2010 года. Эта реализация основана на оригинальной реализации Java от Sun. Реализация Oracle доступна для Windows , macOS , Linux и Solaris . Поскольку Java не имеет какой-либо формальной стандартизации, признанной Ecma International , ISO/IEC, ANSI или другими сторонними организациями по стандартизации, реализация Oracle является стандартом де-факто .
Реализация Oracle упакована в два различных дистрибутива: Java Runtime Environment (JRE), который содержит части платформы Java SE, необходимые для запуска программ Java, и предназначен для конечных пользователей, и Java Development Kit (JDK), который предназначен для разработчиков программного обеспечения и включает в себя инструменты разработки, такие как компилятор Java , Javadoc , Jar и отладчик . Oracle также выпустила GraalVM , высокопроизводительный динамический компилятор и интерпретатор Java.
OpenJDK — это еще одна реализация Java SE, которая лицензируется по GNU GPL. Реализация началась, когда Sun начала выпускать исходный код Java по GPL. Начиная с Java SE 7, OpenJDK является официальной эталонной реализацией Java.
Цель Java — сделать все реализации Java совместимыми. Исторически торговая марка Sun на использование бренда Java настаивает на том, что все реализации должны быть совместимы . Это привело к юридическому спору с Microsoft после того, как Sun заявила, что реализация Microsoft не поддерживает удаленный вызов методов Java (RMI) или Java Native Interface (JNI) и добавила собственные платформенно-специфичные функции. Sun подала в суд в 1997 году и в 2001 году выиграла урегулирование в размере 20 миллионов долларов США, а также судебное постановление, принуждающее Sun к соблюдению условий лицензии. [82] В результате Microsoft больше не поставляет Java с Windows .
Платформенно-независимая Java имеет важное значение для Java EE , и для сертификации реализации требуется еще более строгая проверка. Эта среда позволяет использовать переносимые серверные приложения.
Для выполнения скомпилированных программ язык программирования Java требует наличия программной платформы.
Oracle поставляет платформу Java для использования с Java. Android SDK — это альтернативная программная платформа, используемая в основном для разработки приложений Android с собственной системой графического интерфейса.
Язык Java является ключевым столпом Android , мобильной операционной системы с открытым исходным кодом . Хотя Android, построенный на ядре Linux , написан в основном на языке C, Android SDK использует язык Java в качестве основы для приложений Android, но не использует ни один из его стандартных GUI, SE, ME или других установленных стандартов Java. [83] Язык байт-кода, поддерживаемый Android SDK, несовместим с байт-кодом Java и работает на собственной виртуальной машине, оптимизированной для устройств с небольшим объемом памяти, таких как смартфоны и планшетные компьютеры . В зависимости от версии Android байт-код либо интерпретируется виртуальной машиной Dalvik , либо компилируется в машинный код средой выполнения Android .
Android не предоставляет полную стандартную библиотеку Java SE, хотя Android SDK включает независимую реализацию большого ее подмножества. Он поддерживает Java 6 и некоторые функции Java 7, предлагая реализацию, совместимую со стандартной библиотекой ( Apache Harmony ).
Использование технологий, связанных с Java, в Android привело к юридическому спору между Oracle и Google. 7 мая 2012 года присяжные Сан-Франциско постановили, что если API могут быть защищены авторским правом, то Google нарушила авторские права Oracle, используя Java в устройствах Android. [84] Окружной судья Уильям Олсап 31 мая 2012 года постановил, что API не могут быть защищены авторским правом, [85] но это решение было отменено Апелляционным судом США по федеральному округу в мае 2014 года. [86] 26 мая 2016 года окружной суд вынес решение в пользу Google, постановив, что нарушение авторских прав на Java API в Android представляет собой добросовестное использование. [87] В марте 2018 года это решение было отменено Апелляционным судом, который направил дело об определении ущерба в федеральный суд в Сан-Франциско. [88] Google подала ходатайство о выдаче судебного приказа в Верховный суд США в январе 2019 года, чтобы оспорить два решения, вынесенных Апелляционным судом в пользу Oracle. [89] 5 апреля 2021 года суд вынес решение 6–2 в пользу Google, что использование ею API Java следует считать добросовестным использованием . Однако суд отказался выносить решение о возможности защиты авторских прав на API, решив вместо этого определить свое решение, посчитав API Java защищенным авторским правом «исключительно ради аргумента». [90]
Проект продолжался под названием
green
, а язык был основан на старой модели
UCSD Pascal
, что позволяет генерировать интерпретируемый код.
Летом 1996 г. Sun разрабатывала предшественника того, что сейчас является моделью событий AWT и компонентной архитектурой JavaBeans. Borland внесла большой вклад в этот процесс. Мы очень внимательно изучили Delphi Object Pascal и построили рабочий прототип ссылок на связанные методы, чтобы понять их взаимодействие с языком программирования Java и его API.
является ведущим и значимым сторонником Java с момента ее появления в 1995 г. и берет на себя новую роль распорядителя технологии Java с неустанной приверженностью содействию сообществу участия и прозрачности.
говоря, я не понимаю, почему Google намерен игнорировать огромное количество существующих реализаций. Мне это кажется плохим случаем "не изобретено здесь". В конечном итоге это замедлит принятие. Для мобильного мира уже слишком много платформ Java, и это еще одна