Java — это набор компьютерного программного обеспечения и спецификаций, который обеспечивает программную платформу для разработки прикладного программного обеспечения и его развертывания в кроссплатформенной вычислительной среде. Java используется в самых разных вычислительных платформах : от встроенных устройств и мобильных телефонов до корпоративных серверов и суперкомпьютеров . Java-апплеты , которые менее распространены, чем автономные приложения Java, обычно запускались в безопасных изолированных средах, чтобы обеспечить многие функции собственных приложений за счет внедрения в HTML- страницы.
Написание на языке программирования Java — это основной способ создания кода, который будет развернут в виде байт-кода на виртуальной машине Java (JVM); компиляторы байт-кода также доступны для других языков, включая Ada , JavaScript , Python и Ruby . Кроме того, несколько языков были разработаны для встроенной работы в JVM, включая Clojure , Groovy и Scala . Синтаксис Java во многом заимствован из C и C++ , но объектно-ориентированные функции созданы по образцу Smalltalk и Objective-C . [10] Java избегает некоторых низкоуровневых конструкций, таких как указатели , и имеет очень простую модель памяти , в которой объекты размещаются в куче (в то время как некоторые реализации, например все, которые в настоящее время поддерживаются Oracle, могут вместо этого использовать оптимизацию escape-анализа для распределения в стеке ). и все переменные типов объектов являются ссылками . Управление памятью осуществляется посредством встроенной автоматической сборки мусора , выполняемой JVM.
Последней версией является Java 21 , версия с долгосрочной поддержкой (LTS), выпущенная в сентябре 2023 года, а также поддерживается Java 17, выпущенная в сентябре 2021 года, одна из немногих старых версий LTS, вплоть до Java 8 LTS. Как платформа с открытым исходным кодом, Java имеет множество дистрибьюторов, включая Amazon , IBM , Azul Systems и AdoptOpenJDK . Дистрибутивы включают Amazon Corretto, Zulu, AdoptOpenJDK и Liberica. Что касается Oracle, то он распространяет Java 8, а также предоставляет доступ, например, к Java 11, которые в настоящее время также поддерживают версии LTS. Oracle (и другие) «настоятельно рекомендуют вам удалить более старые версии Java», чем Java 8, [11] из-за серьезных рисков, связанных с нерешенными проблемами безопасности. [12] [13] [14] Поскольку Java 9 (а также версии 10, 12–16 и 18–20) больше не поддерживаются, Oracle советует своим пользователям «немедленно перейти» на поддерживаемую версию. Oracle выпустила последнее публичное обновление для устаревшей версии Java 8 LTS , бесплатное для коммерческого использования , в январе 2019 года и продолжит поддерживать Java 8 с помощью общедоступных обновлений для личного использования в течение неопределенного времени. Расширенная поддержка Oracle Java 6 закончилась в декабре 2018 года. [15]
Платформа Java представляет собой набор программ, упрощающих разработку и запуск программ, написанных на языке программирования Java . Платформа Java включает в себя механизм выполнения (называемый виртуальной машиной ), компилятор и набор библиотек ; также могут быть дополнительные серверы и альтернативные библиотеки, которые зависят от требований. Платформы Java были реализованы для широкого спектра аппаратного обеспечения и операционных систем с целью обеспечить идентичную работу программ Java на всех из них.
Платформа Java состоит из нескольких программ, каждая из которых предоставляет часть своих общих возможностей. Например, компилятор Java , преобразующий исходный код Java в байт-код Java (промежуточный язык для JVM), предоставляется как часть Java Development Kit (JDK). Среда выполнения Java (JRE), дополняющая JVM JIT-компилятором , на лету преобразует промежуточный байт-код в собственный машинный код. Платформа Java также включает обширный набор библиотек.
Основными компонентами платформы являются компилятор языка Java, библиотеки и среда выполнения, в которой исполняется промежуточный байт-код Java в соответствии с правилами, изложенными в спецификации виртуальной машины.
Различные платформы ориентированы на разные классы устройств и домены приложений :
Платформа Java Standard Edition (Java SE) — это вычислительная платформа для разработки и развертывания переносимого кода для настольных и серверных сред. [16] Java SE ранее была известна как платформа Java 2 Standard Edition (J2SE).
Платформа использует язык программирования Java и является частью семейства программных платформ Java. Java SE определяет ряд API -интерфейсов общего назначения , таких как API-интерфейсы Java для библиотеки классов Java , а также включает спецификацию языка Java и спецификацию виртуальной машины Java . [17] OpenJDK является официальной эталонной реализацией начиная с версии 7. [18] [19] [20]Сердцем платформы Java является «виртуальная машина», выполняющая программы с байт-кодом Java . Этот байт-код одинаков независимо от того, на каком оборудовании или в операционной системе работает программа. Однако в новых версиях, таких как Java 10 (и более ранние), внесены небольшие изменения, а это означает, что байт-код, как правило, совместим только с прямой совместимостью . В виртуальной машине Java или JVM имеется JIT-компилятор (Just In Time) . JIT-компилятор преобразует байт-код Java в собственные инструкции процессора во время выполнения и кэширует собственный код в памяти во время выполнения.
Использование байт-кода в качестве промежуточного языка позволяет программам Java работать на любой платформе, где есть виртуальная машина. Использование JIT-компилятора означает, что приложения Java после небольшой задержки во время загрузки и после того, как они «разогрелись», будучи полностью или большей частью JIT-компилированными, имеют тенденцию работать примерно так же быстро, как собственные программы. [23] [24] [25] Начиная с версии JRE 1.2, реализация Sun JVM включает в себя JIT-компилятор вместо интерпретатора.
Хотя программы Java являются кросс-платформенными или независимыми от платформы, код виртуальных машин Java (JVM), которые выполняют эти программы, таковым не является. Каждая поддерживаемая операционная платформа имеет собственную JVM.
Java Development Kit (JDK) — это дистрибутив технологии Java корпорации Oracle . Он реализует спецификацию языка Java (JLS) и спецификацию виртуальной машины Java (JVMS), а также предоставляет стандартную версию (SE) интерфейса прикладного программирования Java (API). Это производная от OpenJDK , управляемого сообществом , которым управляет Oracle. [26] Предоставляет программное обеспечение для работы с Java-приложениями. Примерами включенного программного обеспечения являются виртуальная машина Java, компилятор, инструменты мониторинга производительности, отладчик и другие утилиты, которые Oracle считает полезными для программистов Java.
Oracle выпустила текущую версию программного обеспечения в соответствии с лицензией Oracle No-Fee Rules and Conditions (NFTC). Oracle выпускает двоичные файлы для архитектуры x86-64 для операционных систем на базе Windows, macOS и Linux, а также для архитектуры aarch64 для macOS и Linux. Предыдущие версии поддерживали операционную систему Oracle Solaris и архитектуру SPARC .
Основная реализация JVMS от Oracle известна как HotSpot (виртуальная машина) .Java Runtime Environment (JRE), выпущенная Oracle, представляет собой свободно доступный дистрибутив программного обеспечения, содержащий автономную JVM (HotSpot), стандартную библиотеку Java ( Библиотека классов Java ), инструмент настройки и — до прекращения ее поддержки в JDK 9 — плагин для браузера. Это наиболее распространенная среда Java, устанавливаемая на персональные компьютеры в форм-факторе ноутбука и настольного компьютера . Мобильные телефоны , в том числе функциональные телефоны , и первые смартфоны , поставляемые с JVM, скорее всего, будут включать JVM, предназначенную для запуска приложений, предназначенных для Micro Edition платформы Java. Между тем, большинство современных смартфонов, планшетных компьютеров и других портативных ПК , на которых работают приложения Java, скорее всего, будут делать это за счет поддержки операционной системы Android , которая включает в себя виртуальную машину с открытым исходным кодом, несовместимую со спецификацией JVM. (Вместо этого инструменты разработки Google для Android используют программы Java в качестве входных и выходных байт-кодов Dalvik , которые являются собственным форматом ввода для виртуальной машины на устройствах Android.) Последняя версия JRE с обновлением критического пути с соглашением Oracle BCL [27] был 8u201, а последняя версия обновления набора исправлений с той же лицензией была 8u202. [28] [29] Последней реализацией Oracle JRE, независимо от схемы лицензирования, была версия 9.0.4. [30] Начиная с Java Platform SE 9, вся платформа также была сгруппирована в модули . [31] Модульность реализаций Java SE позволяет разработчикам объединять свои приложения со всеми используемыми ими модулями, вместо того, чтобы полагаться исключительно на наличие подходящей реализации Java SE на пользовательском устройстве. [32] [33] [34] [35]
В большинстве современных операционных систем (ОС) предусмотрен большой объем многократно используемого кода, упрощающий работу программиста. Этот код обычно предоставляется в виде набора динамически загружаемых библиотек , которые приложения могут вызывать во время выполнения. Поскольку платформа Java не зависит от какой-либо конкретной операционной системы, приложения не могут полагаться ни на одну из ранее существовавших библиотек ОС. Вместо этого платформа Java предоставляет полный набор собственных стандартных библиотек классов, содержащих многие из тех же повторно используемых функций, которые обычно встречаются в современных операционных системах. Большая часть системной библиотеки также написана на Java. Например, библиотека Swing рисует пользовательский интерфейс и сама обрабатывает события, устраняя множество тонких различий между тем, как разные платформы обрабатывают компоненты.
Библиотеки классов Java служат трем целям на платформе Java. Во-первых, как и другие библиотеки стандартного кода, библиотеки Java предоставляют программисту хорошо известный набор функций для выполнения общих задач, таких как ведение списков элементов или выполнение сложного анализа строк. Во-вторых, библиотеки классов предоставляют абстрактный интерфейс для задач, которые обычно сильно зависят от оборудования и операционной системы. Такие задачи, как доступ к сети и доступ к файлам, часто тесно переплетаются с различными реализациями каждой платформы. Библиотеки java.net
и java.io
реализуют уровень абстракции в собственном коде ОС, а затем предоставляют стандартный интерфейс для приложений Java для выполнения этих задач. Наконец, когда какая-то базовая платформа не поддерживает все функции, которые ожидает приложение Java, библиотеки классов работают над корректной обработкой отсутствующих компонентов либо путем эмуляции, чтобы предоставить замену, либо, по крайней мере, предоставляя последовательный способ проверки наличия определенной особенности.
Само слово «Java» обычно относится к языку программирования Java, который был разработан для использования с платформой Java. Языки программирования обычно выходят за рамки термина «платформа», хотя язык программирования Java числился в качестве основной части платформы Java до Java 7. Поэтому язык и среда выполнения обычно считались одной единицей. Однако в спецификации Java 7 была предпринята попытка более четко рассматривать язык Java и виртуальную машину Java как отдельные объекты, чтобы они больше не считались единым целым. [36]
Третьи стороны выпустили множество компиляторов и интерпретаторов , предназначенных для JVM. Некоторые из них предназначены для существующих языков, а другие — для расширений языка Java. К ним относятся:
Успех Java и его концепции «написать один раз и запускать где угодно» привел к другим аналогичным усилиям, в частности к .NET Framework , появившейся с 2002 года и вобравшей в себя многие успешные аспекты Java. .NET был создан с нуля для поддержки нескольких языков программирования, в то время как платформа Java изначально была создана для поддержки только языка Java, хотя с тех пор для JVM было создано множество других языков. Как и Java, языки .NET компилируются в байтовый код и выполняются средой Common Language Runtime (CLR), которая по назначению аналогична JVM. Как и JVM, CLR обеспечивает управление памятью посредством автоматической сборки мусора и позволяет запускать байт-код .NET в нескольких операционных системах.
.NET включал в себя Java-подобный язык, сначала названный J++ , а затем Visual J# , который был несовместим со спецификацией Java. Его выпуск был прекращен в 2007 году, а поддержка закончилась в 2015 году.
Спецификация JVM дает разработчикам большую свободу действий в отношении деталей реализации. Начиная с Java 1.3, JRE от Oracle содержит JVM под названием HotSpot. Он был разработан как высокопроизводительная JVM.
Чтобы ускорить выполнение кода, HotSpot использует своевременную компиляцию. Чтобы ускорить выделение объектов и сбор мусора, HotSpot использует кучу поколений.
Куча виртуальной машины Java — это область памяти, используемая JVM для динамического распределения памяти . [38]
В HotSpot куча разделена на поколения :
Постоянное поколение (или permgen ) использовалось для определений классов и связанных с ними метаданных до Java 8. Постоянное поколение не было частью кучи. [39] [40] Постоянное поколение было удалено из Java 8. [41]
Первоначально не было постоянной генерации, и объекты и классы хранились вместе в одной области. Но поскольку выгрузка классов происходит гораздо реже, чем сбор объектов, перемещение структур классов в определенную область позволило значительно повысить производительность. [39]
Java JRE установлена на большом количестве компьютеров. Поэтому конечные пользователи с устаревшей версией JRE уязвимы для многих известных атак. Это привело к широко распространенному мнению, что Java по своей сути небезопасен. [42] Начиная с Java 1.7, Oracle JRE для Windows включает функцию автоматического обновления.
До прекращения поддержки подключаемого модуля браузера Java на любой веб-странице потенциально мог быть запущен Java-апплет, который обеспечивал легкодоступную поверхность атаки для вредоносных веб-сайтов. В 2013 году «Лаборатория Касперского» сообщила, что компьютерные преступники предпочитают использовать плагин Java. Эксплойты Java включены во многие пакеты эксплойтов, которые хакеры развертывают на взломанных веб-сайтах. [43] Java-апплеты были удалены из версии Java 11, выпущенной 25 сентября 2018 г.
Java 17, версия с долгосрочной поддержкой (LTS), включает в себя несколько улучшений. Он обеспечивает сопоставление шаблонов для операторов переключения и закрытых классов .
В Java 16 представлены классы записей , сопоставление с образцом и запечатанные классы для расширенных возможностей моделирования данных.
В Java 15 в качестве функций предварительного просмотра были представлены текстовые блоки и запечатанные классы , что улучшило обработку строк и классов.
В Java 14 появились новые функции, такие как классы записей и сопоставление шаблонов для экземпляров в качестве функций предварительного просмотра.
Java 13 включала такие улучшения, как текстовые блоки и повторную реализацию устаревшего API Socket .
В Java 12 появились выражения переключения и новый сборщик мусора Shenandoah .
В Java 11, выпуске LTS, представлен новый HTTP-клиент . Также были удалены модули Java EE и CORBA.
В Java 10 появилась функция вывода типа локальной переменной (var), которая позволяет разработчикам объявлять локальные переменные без указания их типа.
В Java 9 появилась система модулей платформы Java (JPMS) для модульной разработки приложений и JShell , интерактивный Java REPL.
Java 8 — это основной выпуск, в котором представлены лямбда-выражения и новый API даты и времени для повышения производительности.
В Java 7 появились try-with-resources , Switch on String и Diamond Operation . Он также включал расширенную обработку исключений и новую библиотеку файлового ввода-вывода (NIO.2).
В Java 6 появилась поддержка языка сценариев (JSR 223) и улучшения веб-сервисов . Он также предоставил JDBC 4.0 поддержку SQL XML.
Java 5 была значительным выпуском, который включал Generics , Enhanced for Loop , Autoboxing/Unboxing , Static Import , Varargs , Enumerations и Annotations .
В Java 4 появились регулярные выражения , цепочка исключений и новый набор API-интерфейсов ввода-вывода, известный как NIO (новый ввод-вывод). Он также включал новый API ведения журналов .
Java 3 включала новую JVM от Sun, известную как HotSpot . Он также представил интерфейс именования и каталогов Java (JNDI) и архитектуру отладчика платформы Java (JPDA).
В Java 2 представлены Collections Framework , строковая карта памяти Java для констант , JIT-компилятор и Swing API для графических интерфейсов .
В Java 1.1 появились внутренние классы , отражение , Java Beans и API JDBC для доступа к базе данных.
Java 1.0 была первой версией языка программирования Java. Он представил объектно-ориентированное программирование и байт-код, которые сделали Java независимым от платформы.
Платформа и язык Java начались как внутренний проект Sun Microsystems в декабре 1990 года и стали альтернативой языкам программирования C++/ C . Инженер Патрик Нотон все больше разочаровывался в состоянии интерфейсов и инструментов прикладного программирования (API) C++ и C компании Sun, а также в том, как организация реализовала проект NeWS . Нотон сообщил Скотту МакНили о своем плане покинуть Sun и перейти в NeXT ; Макнили попросил его притвориться Богом и отправить ему электронное письмо с объяснением, как исправить ситуацию в компании. Нотон предполагал создать небольшую команду, которая могла бы работать автономно, без бюрократии, которая тормозила другие проекты Sun. Макнили переслал сообщение другим важным людям в Sun, и проект «Стелс» начался. [44]
Проект «Стелс» вскоре был переименован в «Зеленый проект» , и к Нотону присоединились Джеймс Гослинг и Майк Шеридан. Вместе с другими инженерами они начали работу в небольшом офисе на Сэнд-Хилл-роуд в Менло-Парке, Калифорния . Они стремились разработать новую технологию программирования интеллектуальных устройств следующего поколения, которая, как ожидала Sun, откроет новые большие возможности. [45]
Первоначально команда рассматривала возможность использования C++, но отказалась от этого по нескольким причинам. Поскольку они разрабатывали встраиваемую систему с ограниченными ресурсами, они решили, что C++ требует слишком много памяти и что ее сложность приводит к ошибкам разработчиков. Отсутствие в языке сборки мусора означало, что программистам приходилось вручную управлять системной памятью — сложная задача, подверженная ошибкам. Команду также беспокоило отсутствие в языке C++ переносимых средств обеспечения безопасности, распределенного программирования и многопоточности . Наконец, им нужна была платформа, которую можно было бы легко портировать на все типы устройств.
Билл Джой задумал новый язык, сочетающий Mesa и C. В статье под названием « Далее » он предложил компании Sun, чтобы ее инженеры создали объектно-ориентированную среду на основе C++. Первоначально Гослинг пытался модифицировать и расширить C++ (предложенную разработку, которую он называл «C++++-»), но вскоре отказался от этого в пользу создания нового языка, который он назвал Oak , в честь дерева, стоявшего сразу за ним. его офис. [46]
К лету 1992 года команда смогла продемонстрировать части новой платформы, включая Green OS , язык Oak, библиотеки и аппаратное обеспечение. Их первая демонстрация, состоявшаяся 3 сентября 1992 года, была посвящена созданию персонального цифрового помощника (КПК) под названием Star7 [1] , который имел графический интерфейс и интеллектуальный агент под названием «Дюк», помогающий пользователю. В ноябре того же года Green Project был выделен в Firstperson , дочернюю компанию Sun Microsystems, и команда переехала в Пало-Альто, Калифорния . [47] Команда Firstperson была заинтересована в создании высокоинтерактивных устройств, и когда Time Warner опубликовала запрос предложений (RFP) на приставку , Firstperson изменила свою цель и ответила предложением по платформе для приставки. . Однако представители кабельной индустрии посчитали, что их платформа дает пользователю слишком много контроля, поэтому Firstperson проиграла свою заявку SGI . Дополнительная сделка с The 3DO Company на приставку также не состоялась. Не имея возможности вызвать интерес в телеиндустрии, компания снова была переведена в Sun.
В июне и июле 1994 года – после трех дней мозгового штурма с Джоном Гейджем (директором по науке Sun), Гослингом, Джой, Нотоном, Уэйном Розингом и Эриком Шмидтом – команда переориентировала платформу на Всемирную паутину . Они чувствовали, что с появлением графических веб-браузеров, таких как Mosaic , Интернет может превратиться в ту же высокоинтерактивную среду, которую они представляли для кабельного телевидения. В качестве прототипа Нотон написал небольшой браузер WebRunner (названный в честь фильма « Бегущий по лезвию »), переименованный в HotJava [45] в 1995 году.
Sun переименовала язык Oak в Java после того, как поиск товарных знаков показал, что Oak Technology использовала название Oak . [48] Sun установила цены на лицензии Java ниже себестоимости, чтобы завоевать долю рынка. [49] Хотя Java 1.0a стала доступна для загрузки в 1994 году, первая публичная версия Java, Java 1.0a2 с браузером HotJava, вышла 23 мая 1995 года, о чем Гейдж объявил на конференции SunWorld . Сопровождая заявление Гейджа, Марк Андриссен , исполнительный вице-президент Netscape Communications Corporation , неожиданно объявил, что браузеры Netscape будут включать поддержку Java. 9 января 1996 года Sun Microsystems сформировала группу JavaSoft для разработки этой технологии. [50]
Хотя так называемые Java-апплеты для веб-браузеров больше не являются наиболее популярным использованием Java (например, на стороне сервера) или самым популярным способом запуска кода на стороне клиента (JavaScript стал более популярным), он по-прежнему можно запускать Java (или другие языки JVM, такие как Kotlin) в веб-браузерах, даже после того, как в них была прекращена поддержка JVM, используя, например, TeaVM .
13 ноября 2006 г. компания Sun Microsystems предоставила большую часть своей реализации Java под лицензией GNU General Public License (GPL). [51] [52]
Язык Java претерпел несколько изменений с момента выпуска JDK ( Java Development Kit ) 1.0 23 января 1996 года, а также многочисленных добавлений классов и пакетов в стандартную библиотеку . Начиная с J2SE 1.4, развитие языка Java определял процесс сообщества Java (JCP). JCP использует запросы спецификации Java (JSR) для предложения и указания дополнений и изменений в платформе Java. Спецификация языка Java (JLS) определяет язык; изменения в JLS управляются согласно JSR 901. [53]
Sun выпустила JDK 1.1 19 февраля 1997 года. Основные дополнения включали обширную переработку модели событий AWT , добавление внутренних классов в язык, JavaBeans и JDBC .
J2SE 1.2 (8 декабря 1998 г.) — Codename Playground . Этот и последующие выпуски J2SE 5.0 были переименованы в Java 2 , а название версии «J2SE» ( платформа Java 2, Standard Edition ) заменило JDK, чтобы отличать базовую платформу от J2EE ( платформа Java 2, Enterprise Edition ) и J2ME ( платформа Java 2, Enterprise Edition). Микроиздание ). Основные дополнения включали в себя отражение , структуру коллекций , Java IDL ( реализация языка описания интерфейса для совместимости CORBA ) и интеграцию графического API Swing в основные классы. Был выпущен подключаемый модуль Java , и JVM Sun впервые была оснащена JIT-компилятором .
J2SE 1.3 (8 мая 2000 г.) — кодовое имя Kestrel . Заметные изменения включали в себя объединение HotSpot JVM (HotSpot JVM был впервые выпущен в апреле 1999 года для J2SE 1.2 JVM), JavaSound, интерфейса именования и каталогов Java (JNDI) и архитектуры отладчика платформы Java (JPDA).
J2SE 1.4 (6 февраля 2002 г.) — кодовое имя «Мерлин» . Это стал первый выпуск платформы Java, разработанной в рамках процесса сообщества Java под названием JSR 59. [54] Основные изменения включали регулярные выражения, смоделированные по образцу Perl , цепочку исключений , интегрированный анализатор XML и процессор XSLT ( JAXP ), а также Java Web Start .
J2SE 5.0 (30 сентября 2004 г.) — кодовое имя Tiger . Первоначально он имел номер 1.5, который до сих пор используется в качестве внутреннего номера версии. [55] Разработанный в рамках JSR 176, Tiger добавил несколько важных новых функций языка, включая цикл for-each , дженерики , автобокс и var-args . [56]
Java SE 6 (11 декабря 2006 г.) — кодовое имя Mustang . Он поставлялся в комплекте с менеджером баз данных и облегчает использование языков сценариев с JVM (например, JavaScript с использованием движка Rhino от Mozilla ). В этой версии Sun заменила имя «J2SE» на Java SE и исключила «.0» из номера версии. [57] Другие важные изменения включают поддержку подключаемых аннотаций ( JSR 269 ), множество улучшений графического пользовательского интерфейса , включая собственные улучшения пользовательского интерфейса для поддержки внешнего вида Windows Vista , а также улучшения архитектуры отладчика платформы Java (JPDA) и интерфейса инструментов JVM для лучший мониторинг и устранение неполадок.
Java SE 7 (28 июля 2011 г.) — кодовое имя Dolphin . Эта версия разработана в рамках JSR 336. [58] В нее добавлено множество небольших языковых изменений, включая строки в переключателе, попытку с ресурсами и вывод типа для создания общего экземпляра. JVM была расширена за счет поддержки динамических языков, а библиотека классов была расширена, среди прочего, за счет структуры соединения/разветвления, [59] улучшенной новой библиотеки файлового ввода-вывода и поддержки новых сетевых протоколов, таких как SCTP . Обновление Java 7 Update 76 было выпущено в январе 2015 г., срок действия истекает 14 апреля 2015 г. [60]
В июне 2016 года, после последнего публичного обновления Java 7, было объявлено [61] об « удаленно эксплуатируемых » ошибках безопасности в Java 6, 7 и 8. [13]
Java SE 8 (18 марта 2014 г.) — кодовое имя Kenai . Заметные изменения включают поддержку на уровне языка лямбда-выражений ( замыканий ) и методов по умолчанию, среду выполнения JavaScript Project Nashorn, новый API даты и времени, вдохновленный Joda Time, и удаление PermGen. Эта версия официально не поддерживается на платформе Windows XP . [62] Однако в связи с окончанием жизненного цикла Java 7 эта версия рекомендуется для пользователей XP. Ранее для Windows XP SP3 был описан только неофициальный метод ручной установки. Это относится к JDK8, платформе разработки Java, которая также включает в себя полнофункциональную среду выполнения Java . [63] Java 8 поддерживается в Windows Server 2008 R2 SP1, Windows Vista SP2 и Windows 7 SP1, Ubuntu 12.04 LTS и более поздних версиях (и некоторых других ОС). [64]
Java SE 9 и 10 имели более высокие системные требования, т. е. Windows 7 или Server 2012 (и минимальный сертифицированный веб-браузер повышен до Internet Explorer 11 или других веб-браузеров), а Oracle отказалась от 32-разрядной совместимости для всех платформ, т. е. только для Oracle " 64 -битные виртуальные машины Java (JVM) сертифицированы». [65]
Java SE 11 была выпущена в сентябре 2018 года. Это первая версия LTS с момента принятия модели быстрого выпуска , начиная с версии 9. Впервые OpenJDK 11 представляет полный исходный код для платформы Java под лицензией GNU General Public License, и хотя Oracle по-прежнему использует двойную лицензию с дополнительной проприетарной лицензией, нет никаких различий в коде или модулей, уникальных для версии с проприетарной лицензией. [66] Функции Java 11 включают две новые реализации сборщика мусора, Flight Recorder для устранения серьезных проблем, новый HTTP-клиент, включающий поддержку WebSocket . [67]
Java SE 12 была выпущена в марте 2019 года. [68]
Java SE 13 была выпущена в сентябре 2019 года. [69]
Java SE 14 была выпущена в марте 2020 года. [70]
Java SE 15 была выпущена в сентябре 2020 года.
Java SE 16 была выпущена в марте 2021 года.
Java SE 17 была выпущена в сентябре 2021 года.
Java SE 18 была выпущена в марте 2022 года.
Java SE 19 была выпущена в сентябре 2022 года.
Java SE 20 была выпущена в марте 2023 года.
Помимо языковых изменений, за прошедшие годы значительные изменения были внесены в библиотеку классов Java, которая выросла с нескольких сотен классов в JDK 1.0 до более трех тысяч в J2SE 5.0. Были разработаны целые новые API, такие как Swing и Java 2D , а многие исходные классы и методы JDK 1.0 устарели .
По данным Oracle, в 2010 году среда выполнения Java была обнаружена на более чем 850 миллионах компьютеров. [71] Microsoft не включила среду выполнения Java (JRE) в свои операционные системы с тех пор, как Sun Microsystems подала в суд на Microsoft за добавление классов, специфичных для Windows, в связанную среду выполнения Java, а также за обеспечение доступности новых классов через Visual J++ . [ необходима цитация ] Apple больше не включает среду выполнения Java в OS X начиная с версии 10.7 , но система предлагает пользователю загрузить и установить ее при первом запуске приложения, требующего JRE. [ нужна цитация ] Многие дистрибутивы Linux включают среду выполнения OpenJDK в качестве виртуальной машины по умолчанию, что исключает необходимость загрузки проприетарной Oracle JRE. [72]
Некоторые Java-приложения довольно широко используются на настольных компьютерах, включая интегрированные среды разработки NetBeans и Eclipse , а также клиенты для обмена файлами, такие как LimeWire и Vuze . Java также используется в среде математического программирования MATLAB как для визуализации пользовательского интерфейса , так и как часть базовой системы. Java предоставляет кросс-платформенный пользовательский интерфейс для некоторых высокопроизводительных приложений для совместной работы, таких как Lotus Notes .
Oracle планирует сначала объявить устаревшим отдельно устанавливаемый плагин браузера Java из среды выполнения Java в JDK 9, а затем полностью удалить его из будущего выпуска, что вынудит веб-разработчиков использовать альтернативную технологию. [73]
Герцог — талисман Явы . [74]
Когда Sun объявила, что Java SE и Java ME будут выпущены под лицензией свободного программного обеспечения ( GNU General Public License ), они одновременно выпустили графику Duke под свободной лицензией BSD . [75] Каждый год создается новая личность герцога. [76] Например, в июле 2011 года «Future Tech Duke» имел нос большего размера, реактивный ранец и синие крылья. [77]
Исходный код для реализаций Java от Sun (т.е. де-факто эталонная реализация) был доступен в течение некоторого времени, но до недавнего времени [78] условия лицензии строго ограничивали то, что можно было сделать с ним без подписания (и, как правило, оплаты) контракт с компанией Sun. Как таковые, эти условия не удовлетворяли требованиям ни Open Source Initiative , ни Free Software Foundation , чтобы считаться программным обеспечением с открытым исходным кодом или свободным, и поэтому Sun Java была проприетарной платформой. [79]
В то время как несколько сторонних проектов (например, GNU Classpath и Apache Harmony ) создали частичные реализации Java бесплатного программного обеспечения , большой размер библиотек Sun в сочетании с использованием методов «чистой комнаты » означал, что их реализации библиотек Java (компилятор и виртуальная машина) сравнительно небольшие и четко определенные) были неполными и не полностью совместимыми. Эти реализации также имели тенденцию быть гораздо менее оптимизированными, чем у Sun. [ нужна цитата ]
На конференции JavaOne 2006 компания Sun объявила , что Java станет бесплатным программным обеспечением с открытым исходным кодом , [80] а 25 октября 2006 года на конференции Oracle OpenWorld Джонатан И. Шварц заявил, что компания собирается объявить о выпуске базовой версии Java. Платформа как бесплатное программное обеспечение с открытым исходным кодом в течение 30–60 дней. [81]
13 ноября 2006 г. компания Sun выпустила виртуальную машину и компилятор Java HotSpot как бесплатное программное обеспечение под лицензией GNU General Public License , пообещав, что остальная часть JDK (включая JRE) будет переведена под лицензию GPL к марту 2007 г. (« за исключением нескольких компонентов, которые Sun не имеет права публиковать в виде распространяемого исходного кода под лицензией GPL»). [82] По мнению Ричарда Столлмана , это означало бы конец «ловушки Java». [83] Марк Шаттлворт назвал первое заявление для прессы «настоящей вехой для сообщества свободного программного обеспечения ». [84]
Sun выпустила исходный код библиотеки классов под лицензией GPL 8 мая 2007 года, за исключением некоторых ограниченных частей, которые были лицензированы Sun у третьих сторон, которые не хотели, чтобы их код выпускался под лицензией свободного программного обеспечения и открытого исходного кода. [85] Некоторые из обремененных частей оказались довольно ключевыми частями платформы, такими как рендеринг шрифтов и 2D-растрирование, но позже Sun выпустила их с открытым исходным кодом (см. Библиотеку классов OpenJDK ).
Целью Sun было заменить части, которые остаются проприетарными и закрытыми, альтернативными реализациями и сделать библиотеку классов полностью бесплатной и с открытым исходным кодом. Тем временем сторонний проект под названием IcedTea создал совершенно бесплатный и очень удобный JDK, заменив обремененный код либо заглушками, либо кодом из GNU Classpath . Однако с тех пор OpenJDK можно собирать без обременительных частей (начиная с OpenJDK 6 b10 [86] ) и он стал средой выполнения по умолчанию для большинства дистрибутивов Linux. [87] [88] [89] [90]
В июне 2008 года было объявлено, что IcedTea 6 (как упакованная версия OpenJDK в Fedora 9 ) прошла тесты Technology Compatibility Kit и может претендовать на звание полностью совместимой реализации Java 6. [91]
Поскольку OpenJDK находится под лицензией GPL, можно распространять пользовательскую версию JRE непосредственно с программными приложениями [92] [93] вместо того, чтобы требовать от конечного пользователя (или его системного администратора) загрузки и установки правильной версии проприетарного Oracle. JRE на каждую из своих систем.
В большинстве случаев поддержка Java в веб-браузерах не требуется, и эксперты по безопасности рекомендуют не запускать ее в браузере без крайней необходимости. [94] Это было предложено [ кем? ] что, если Java требуется для нескольких веб-сайтов, пользователям следует установить отдельный браузер специально для этих сайтов. [ нужна цитата ]
Когда дженерики были добавлены в Java 5.0, уже существовала большая структура классов (многие из которых уже устарели ), поэтому дженерики были выбраны для реализации с использованием стирания , чтобы обеспечить совместимость миграции и повторное использование этих существующих классов. Это ограничивало возможности, которые могло быть предоставлено этим дополнением по сравнению с некоторыми другими языками. [95] [96] Добавление подстановочных знаков типов сделало Java неработоспособной. [97]
В Java отсутствуют собственные целочисленные типы без знака. Беззнаковые данные часто генерируются из программ, написанных на C , и отсутствие этих типов препятствует прямому обмену данными между C и Java. Большие числа без знака также используются во многих областях числовой обработки, включая криптографию, что может сделать Java менее удобным для использования для этих задач. [98] Хотя эту проблему можно частично обойти с помощью кода преобразования и использования более крупных типов данных, это делает использование Java громоздким для обработки беззнаковых данных. Хотя 32-битное целое число со знаком можно относительно легко использовать для хранения 16-битного значения без знака, для 32-битного значения без знака потребуется 64-битное целое число со знаком. Кроме того, 64-битное беззнаковое значение не может быть сохранено с использованием любого целочисленного типа в Java, поскольку в языке Java не существует типов размером более 64 бит. Если абстрагироваться с помощью функций, вызовы функций становятся необходимыми для многих операций, которые являются родными для некоторых других языков. В качестве альтернативы можно использовать целые числа со знаком Java для эмуляции целых чисел без знака того же размера, но это требует детальных знаний сложных побитовых операций. [99]
Хотя арифметика с плавающей запятой в Java в значительной степени основана на IEEE 754 ( стандарт для двоичной арифметики с плавающей запятой ), некоторые функции не поддерживаются даже при использовании strictfp
модификатора, такие как флаги исключений и направленные округления – возможности, предусмотренные стандартом IEEE 754. Кроме того, Типы с плавающей запятой расширенной точности, разрешенные в 754 и присутствующие во многих процессорах, не разрешены в Java. [100] [101]
На заре развития Java (до того, как HotSpot VM была реализована в Java 1.3 в 2000 году) существовала некоторая критика в отношении производительности. Тесты обычно сообщали, что Java примерно на 50% медленнее, чем C (язык, который компилируется в собственный код). [102] [103] [104]
Производительность Java существенно улучшилась по сравнению с ранними версиями. [23] В некоторых оптимизированных тестах производительность JIT-компиляторов по сравнению с собственными компиляторами оказалась весьма схожей. [23] [24] [25]
Байт-код Java может либо интерпретироваться во время выполнения виртуальной машиной, либо скомпилироваться во время загрузки или во время выполнения в собственный код, который запускается непосредственно на оборудовании компьютера. Интерпретация медленнее, чем собственное выполнение, а компиляция во время загрузки или во время выполнения имеет начальное снижение производительности компиляции. Все современные высокопроизводительные реализации JVM используют подход компиляции, поэтому после начального запуска производительность эквивалентна машинному коду.
Платформа Java обеспечивает архитектуру безопасности [105] , которая позволяет пользователю запускать ненадежный байт-код в «песочнице» для защиты от вредоносного или плохо написанного программного обеспечения. Эта функция «песочницы» предназначена для защиты пользователя путем ограничения доступа к определенным функциям платформы и API, которые могут быть использованы вредоносными программами , например, доступ к локальной файловой системе, выполнение произвольных команд или доступ к сетям связи.
В последние годы исследователи обнаружили многочисленные недостатки безопасности в некоторых широко используемых реализациях Java, в том числе в Oracle, которые позволяют ненадежному коду обходить механизм «песочницы», подвергая пользователей вредоносным атакам. Эти недостатки затрагивают только приложения Java, которые выполняют произвольный ненадежный байт-код, например плагины веб-браузера, которые запускают апплеты Java, загруженные с общедоступных веб-сайтов. Приложения, которым пользователь доверяет и имеет полный контроль над всем выполняемым кодом, не затрагиваются.
31 августа 2012 года было обнаружено, что Java 6 и 7 (обе поддерживались на тот момент) в Microsoft Windows, OS X и Linux имеют серьезный недостаток безопасности, который позволял использовать удаленный эксплойт путем простой загрузки вредоносной веб-страницы. [106] Позже выяснилось, что Java 5 также имеет недостатки. [107]
10 января 2013 года трое компьютерных специалистов выступили против Java, заявив Reuters , что она небезопасна и что людям следует отключать Java. Хайме Бласко, менеджер лаборатории AlienVault Labs, заявил, что «Java — это бардак. Она небезопасна. Вам придется ее отключить». [108] Эта уязвимость затрагивает Java 7 , но неясно, влияет ли она на Java 6 , поэтому потребителям предлагается отключить ее. [109] [110] В предупреждениях безопасности от Oracle объявляются графики выхода критических обновлений, связанных с безопасностью, для Java. [111]
14 января 2013 г. эксперты по безопасности заявили, что обновление по-прежнему не смогло защитить компьютеры от атак. [112] Эта дыра вызвала реакцию Министерства внутренней безопасности США , призывающую пользователей отключить или удалить Java. [14] Apple внесла Java в черный список в ограниченном порядке для всех компьютеров под управлением операционной системы OS X с помощью программы защиты от вирусов. [113]
В 2014 году, отвечая на недавние проблемы безопасности и уязвимости Java, блоггер по безопасности Брайан Кребс призвал пользователей удалить как минимум плагин браузера Java, а также все программное обеспечение. «Я с нетерпением жду мира без плагина Java (и отсутствия необходимости напоминать читателям о ежеквартальных обновлениях обновлений), но, вероятно, пройдут годы, прежде чем различные версии этого плагина будут в основном удалены из систем конечных пользователей по всему миру». [114] «Когда-то многообещающий, он изжил себя в браузере и превратился в кошмар, который радует киберпреступников за счет пользователей компьютеров». [115] «Я думаю, что каждый должен удалить Java со всех своих ПК и Mac, а затем тщательно подумать, нужно ли добавлять ее обратно. Если вы типичный домашний пользователь, вы, вероятно, можете обойтись без нее. Если вы представляете бизнес пользователь, у тебя может не быть выбора». [116]
Распределенная Oracle среда выполнения Java имеет историю объединения спонсируемого программного обеспечения, которое устанавливается по умолчанию во время установки и во время обновлений, которые выпускаются примерно раз в месяц. Сюда входит « панель инструментов Ask.com », которая перенаправляет поисковые запросы браузера на рекламу, и «McAfee Security Scan Plus». [117] Эти предложения можно заблокировать с помощью настройки панели управления Java, хотя это неочевидно. Этот параметр находится на вкладке «Дополнительно» панели управления Java под заголовком «Разное», где этот параметр помечен как параметр для подавления «спонсорских предложений».
Java еще не выпустила средство автоматического обновления, не требующее вмешательства пользователя и прав администратора [118] в отличие от Google Chrome [119] и Flash player. [120]
{{cite web}}
: CS1 maint: archived copy as title (link){{cite web}}
: CS1 maint: archived copy as title (link)«Юристы сказали нам, что мы не можем использовать название «OAK», потому что [оно уже было торговой маркой] Oak Technologies», — сказал Фрэнк Йеллин, старший инженер Sun. «Итак, был проведен мозговой штурм, чтобы придумать идеи для нового названия».
«Цена ниже нашей себестоимости», — говорит Шмидт. «Это приведет к потере денег в лицензионном бизнесе в обозримом будущем. Это стратегическая инвестиция в долю рынка».
Поддерживается только режим X.org. Режим
Wayland
не поддерживается.
Java работает на более чем 850 миллионах персональных компьютеров по всему миру и на миллиардах устройств по всему миру, включая мобильные и телевизионные устройства.