Java

Продукт
Разработчики: Oracle
Дата последнего релиза: 2021/09/16
Технологии: Средства разработки приложений

Содержание

Основные статьи:

Javaобъектно-ориентированный язык программирования, разработанный компанией Sun Microsystems и официально выпущенный 23 мая 1995 года. Иногда на русском языке неправильно произносят название как «Ява», по аналогии с названием острова Ява.

Java — так называют не только сам язык, но и платформу для создания приложений уровня предприятий на основе данного языка.

Основные особенности языка

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

Программы на Java транслируются в байт-код, выполняемый виртуальной java-машиной (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор, но с тем отличием, что байтовый код, в отличие от текста, обрабатывается значительно быстрее.Банковская цифровизация: ускоренное импортозамещение и переход на инновации. Обзор и рейтинг TAdviser 11.9 т

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

Часто к недостаткам концепции виртуальной машины относят то, что исполнение байт-кода виртуальной машиной может снижать производительность программ и алгоритмов, реализованных на языке Java. Данное утверждение было справедливо для первых версий виртуальной машины Java, однако в последнее время оно практически потеряло актуальность. Этому способствовал ряд усовершенствований: применение технологии JIT (Just-In-Time compilation), позволяющей переводить байт-код в машинный код во время исполнения программы с возможностью сохранения версий класса в машинном коде, широкое использование native-кода в стандартных библиотеках, а также аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).

Идеи, заложенные в концепцию и различные реализации JVM, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых в среде JVM[1]. Эта идея перекликается с концепцией CLI, заложенной в основу платформы .NET компании Microsoft.

Контроль за разработкой и права на Java

2019

Oracle: мы остались без рынка смартфонов из-за кражи Java-технологий для Android

В конце марта 2019 года Oracle попросила Верховный суд США не удовлетворять апелляцию на ранее вынесенное судебное решение, согласно которому Google нарушила авторские права Oracle при использовании компонентов из Java в операционной системе Android.

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

В Oracle считают, что нарушение авторского права компанией Google не позволило Oracle выйти на рынок смартфонов

Oracle утверждает, что Google разрушила ее надежды выйти на рынок смартфонов в качестве разработчика с платформой Java, которая дает возможность разработки запуска программ, написанных на языке Java, в том числе через API-интерфейсы. В иске указывается, что Google скопировала эти API без надлежащей лицензии.

«
Теория Google заключается в том, что, вложив все эти ресурсы в создание программы, популярной среди разработчиков платформ и приложений, Oracle должна быть обязана дать конкуренту возможность скопировать свой код, чтобы помочь фанатам создавать свои собственные бестселлеры, — заявили в Oracle.
»

Google неоднократно заявляла, что если разрешить компаниям владеть авторским правом на программные интерфейсы, то это будет оказывать отрицательное воздействие влияние. Однако Oracle заявила суду, что разработка ПО «не испытала на себе разрушительные последствия, которые предсказывала Google; отрасль чувствует себя лучше, чем когда-либо».

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

Google отказалась заключать соглашение о лицензировании с Oracle, поскольку не хотела, чтобы Android-приложения могли работать на других платформах. В результате этого Oracle не получила возможность для конкуренции на рынке смартфонов, передает издание CRN.[2]

Google: победа Oracle в споре об использовании Java в Android убьет разработку ПО

В конце января 2019 года Google обратилась в Верховный суд США с заявлением пересмотреть 9-летнее разбирательство с Oracle по поводу законности использования программных интерфейсов (API) Java в операционной системе Android. В Google считают, что победа Oracle убьет разработку ПО.

Google просит высшую судебную инстанцию США поддержать компанию по двум ранее отмененным судебным решениям. В одном из них интернет-гигант говорил, что API не защищены авторским правом, а в другом — Google «законно» использует программные интерфейсы Java.

Google не сдается в споре с Oracle об использовании Java в Android

В своем блоге главный юрисконсульт Google Кент Уолкер (Kent Walker) сравнивает API-интерфейсы, защищенные авторским правом, с «утверждением, что горячие клавиши могут работать только с одним типом компьютера».

«
Мы создали Android в соответствии с давно принятой в компьютерной индустрии практикой повторного использования программных интерфейсов, которые предоставляют наборы команд, облегчающие реализацию общих функций. Это похоже на горячие клавиши на компьютерной клавиатуре, когда вы нажимаете Ctrl + P для быстрой печати, — пишет Уолкер.
»

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

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

«
Если Верховный суд не отменит эти два решения, данное дело положит конец традиционной способности разработчиков свободно использовать существующие программные интерфейсы для создания новых поколений компьютерных программ для потребителей, — заявил Кент Уолкер.[3]
»

2018: Победа над Google в суде по делу о Java

27 марта 2018 года Апелляционный суд США по федеральному округу вынес положительное для Oracle решение по разбирательству, в котором компания обвиняла Google в незаконном использовании Java API в платформе Android. Подробнее здесь

2012: Oracle приобрела разработчика Java

Oracle получила контроль над Java в ходе покупки Sun Microsystems.

25 января 2012 года Oracle представила JCP предложение, согласно которому предполагается некоторое сокращение количества членов исполнительного комитета.

«Представляется, что в ожидании конвергенции Java ME и Java SE нынешнее разделение на два отдельных исполнительных комитета не имеет смысла. Поскольку Java является одной платформой, она и должна находиться под контролем одного исполнительного комитета», - говорится в тексте рекомендации.

Это - второе предложение Oracle.

Согласно записям 2011 года в блоге председателя JCP Патрика Каррана (Patrick Curran), первое и уже принятое было нацелено на повышение прозрачности процессов спецификации.

Третье, которое ещё только должно быть представлено, будет касаться «более комплексных перемен», включающих возможные изменения в соглашении об участии в разработке спецификации Java (Java Specification Participation Agreement), юридического соглашения, согласно которому действует JCP.

2010: Отец Java требует для своего детища "свободы от Oracle"

Создатель языка Java Джеймс Гослинг, ушедший из Sun Microsystems после поглощения ее корпорацией Oracle, ведет пропагандистскую кампанию под девизом "Свободу Java!". Гослинг ставит своей целью добиться от главы Oracle Ларри Эллисона преобразования организации Java Community Process в независимую, не подверженную влиянию отдельных компаний. Создать такое независимое объединение сам Эллисон предложил еще в 2007 году.

В преддверии конференций JavaOne и Oracle OpenWorld 2010 Гослинг выпустил серию пропагандистских материалов в поддержку своей борьбы: футболок, значков, кружек с надписями "Освободите Java!", "Oracle, выполни обещание!", а также с портретом Эллисона и подписью "На дворе уже давно не 1984-й!". Создатель Java призывает приходить в его футболках на упомянутые конференции, чтобы продемонстрировать свое неравнодушие к судьбе платформы.

2010: Oracle начинает суд с Google по теме Java

В октябре 2010 года компания Oracle уточнила формулировки иска против Google по поводу нарушения патентов и авторских прав на технологии Java, реализованные в мобильной операционной системе Android. В первом варианте иска, направленном в суд в августе 2010 года, содержалось мало технических подробностей, но теперь компания прилагает к иску даже выдержки из исходных текстов программ.

Oracle утверждает, что примерно треть пакетов в программном интерфейсе (API) Android являются производными от пакетов Java, авторские права на которые принадлежат Oracle. Это касается, помимо прочего, названий классов и методов, параметров, определений и общей организации кода и документации. Часть исходного кода была непосредственно взята из защищенных авторскими правами текстов программ Oracle. Лицензии на использование Java сами по себе бесплатны, но в системе Android вместо виртуальной машины Java применяется машина Dalvik собственной разработки Google, программы для которой, однако, пишутся на языке Java. В Google считают, что претензии Oracle к ней и к сообществу разработчиков программ с открытым кодом в целом необоснованны.

2011: Выборы в комитет Java Community Process

C 3 ноября 2011 года VMware больше не является членом исполнительного комитета Java Community Process SE/EE[4], но в его состав вошла компания Twitter, согласно результатам выборов.

В состав исполнительного комитета по контролю над разработкой будущих версий спецификаций платформ языка Java, в частности для настольных компьютеров и серверов, вошла компания Azul Systems, производитель виртуальной Java-машины Zing. Ericsson, Intel и SAP повторно избраны в состав комитета. Кроме того, IBM, Nokia и SK Telecom сохранили за собой места в комитете по мобильным технологиям (Java ME), ARM Limited и Werner Keil получили места открытого членства.

Несмотря на выход из состава исполнительного комитета, VMware остается важным инвестором в разработку платформ Java посредством участия своего подразделения SpringSource, которое реализует широкий ассортимент продуктов для разработки и развертывания Java-приложений.

Согласно сообщению в официальном блоге компании Oracle, почти четверть (около 23%) правомочных членов голосовали на выборах.

«Это гораздо больше, чем 11% принявших участие во внеочередных выборах исполнительного комитета в 2011 году, но меньше, чем ожидалось», - говорится в сообщении.

Oracle имеет постоянное членство в комитете, но согласно регулирующим документам сообщества, не имеет возможности доминирования в JCP. В документе говорится, в частности, что Oracle и другие члены исполнительного комитета осуществляют функции групп технологического надзора за работой экспертных групп. «Исполнительные комитеты не осуществляют ежедневное непосредственное управление работой экспертных групп. У исполкомов существует возможность контроля работы каждой группы экспертов, в четко обозначенных интервалах, по мере того, как спецификации проходят через JCP», - отмечается в документе.

Тем не менее, Oracle агрессивно защищает свою долю в Java. Свидетельством чего служит судебный процесс против Google за предполагаемые нарушения интеллектуальной собственности в части применения Java в мобильной ОС Android. Имеются подозрения, что в прошлом Oracle пыталась оказать кулуарное влияние на выборы членов JCP.

Сообщество JCP лишилось такого авторитетного участника как Apache Software Foundation, которая отказалась от членства в связи с теми признаками, которые охарактеризовала как чрезмерный контроль Oracle над Java.

[4] Java Community Process (JCP) — официальное сообщество, организованное в 1998 году для участия заинтересованных компаний в формировании спецификаций платформ языка Java.

SE/EE занимается платформами для настольных компьютеров (Java Platform, Standard Edition) и для серверов (Java Platform, Enterprise Edition)

2012: Победа Google

В мае 2012 года Федеральный суд Калифорнии не усмотрел нарушений со стороны Google и не признал интеллектуальной собственностью Oracle интерфейсы программирования и строки исходного кода Java. Oracle подала апелляцию.

2014: Верховный суд рассматривает спор Oracle и Google

В мае 2014 года Федеральный апелляционный суд США отменил вынесенное в пользу Google решение. За обжалованием этого постановления Google обратилась в Верховный суд США. [5]

В начале декабря 2014 года Oracle направила в Верховный суд США обращение, в котором попросила оставить в силе решение апелляционного суда. Одновременно американский представитель Фемиды получил документ, в котором видные деятели компьютерных наук поддерживают Google.

«Оставить незащищенными тысячи строчек кода, скопированные Google, означало бы лишение защиты авторских прав в отношении всего кода», — говорится в заявлении Oracle.

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

Патентная тяжба Oracle и Google отразится на софтверном рынке

Патентная тяжба Oracle и Google отразится на софтверном рынке

На сторону Google встал ряд видных специалистов по компьютерным наукам. Один из создателей интернета Винтон Серф (Vinton Cerf), разработчик операционной системы Unix Кен Томпсон (Ken Thompson) и еще несколько десятков известных ветеранов ПК-отрасли направили в Верховный суд письмо, в котором попросили пересмотреть решение апелляционного суда и признать, что программные интерфейсы не являются объектом авторского права.

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

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

Вердикт Верховного суда может оказаться определяющим для развития всей софтверной отрасли. Если решения API будут признаны интеллектуальной собственностью, то пострадает совместимость и переносимость продуктов, поскольку под вопросом окажется легальность создания функциональных аналогов программных платформ путем разработки собственных совместимых API.

1998-2007

В 2017 г. нынешний владелец Java — компания Oracle — объявила об изменениях условий лицензии и окончании поддержки версии Java 8.

В 2007 г. стартовал процесс раскрытия исходных кодов в рамках проекта OpenJDK, инициированный тогдашним владельцем Java — компанией Sun Microsystems.

В 1998 г. стандарт Java стал открытым, и появился Java Community Process, определяющий принципы дальнейшей эволюции данной технологии.

Классификация платформ Java

Внутри Java существуют три основных семейства технологий:

  • J2EE или Java EE (начиная с v1.5) — Java Enterprise Editon, для создания программного обеспечения уровня предприятия;
  • J2SE или Java SE (начиная с v1.5) — Java Standard Editon, для создания пользовательских приложений, в первую очередь — для настольных систем;
  • J2ME, Java ME или Java Micro Edition, для использования в устройствах, ограниченных по вычислительной мощности, в том числе мобильных телефонах, PDA, встроенных системах

Самыми популярными считаются серверные технологии семейства J2EE.

Последним релизом является версия 1.6, в которой было произведено улучшение системы безопасности, улучшение поддержки XML, а также добавлена поддержка скриптового языка JavaScript на основе механизма Mozilla, улучшена интеграция с рабочим столом, добавлены некоторые новые возможности в создании графических интерфейсов.

История версий

Java 1.0

Разработка Java началась в 1990 году, первая официальная версия — Java 1.0, — была выпущена только в 1995 году.

Java 2.0

К 1998 году была разработана обновлённая спецификация JDK 1.2, вышедшая под наименованием Java 2. Собственно языковых изменений в данной версии не появилось. Платформа получила следующие дополнения:

  • Набор средств для создания визуального интерфейса пользователя Swing.
  • Коллекции.
  • Поддержка файлов Policy и цифровых сертификатов пользователя.
  • Библиотека Accessibility.
  • Java 2D.
  • Поддержка технологии drag-and-drop.
  • Полная поддержка Unicode, включая поддержку ввода на японском, китайском и корейском языках.
  • Поддержка воспроизведения аудио-файлов нескольких популярных форматов.
  • Полная поддержка технологии CORBA.
  • JIT-компилятор, улучшенная производительность.
  • Усовершенствования инструментальных средств JDK, в том числе поддержка профилирования Java-программ

Java 5

Спецификация Java 5 была выпущена в сентябре 2004 года. В данной версии разработчики внесли в язык целый ряд принципиальных дополнений:

  • Перечислимые типы (enum). Ранее отсутствовавшие в Java типы оформлены по аналогии с C++, но при этом имеют ряд дополнительных возможностей.
    • Перечислимый тип является полноценным классом Java, то есть может иметь конструктор, поля, методы, в том числе скрытые и абстрактные.
    • Перечисление может реализовывать интерфейсы.
    • Для перечислений имеются встроенные методы, дающие возможность получения значений типа по имени, символьных значений, соответствующих именам, преобразования между номером и значением, проверки типа на то, что он является перечислимым.

  • Аннотации — возможность добавления в текст программы метаданных, не влияющих на выполнение кода, но допускающих использование для получения различных сведений о коде и его исполнении. Одновременно выпущен инструментарий для использования аннотированного кода. Одно из применений аннотаций — упрощение создания тестовых модулей для Java-кода.
  • Средства обобщённого программирования (generics) — механизм, аналогичный шаблонам в C++ или C#, дающий возможность создавать классы и методы с полями и параметрами произвольного типа. С использованием данного механизма реализованы новые версии коллекций стандартной библиотеки Java.
  • Методы с неопределённым числом параметров.
  • Autoboxing/Unboxing — автоматическое преобразование между скалярными типами Java и соответствующими типами-врапперами (например, между int — Integer). Наличие такой возможности упрощает код, поскольку исключает необходимость в выполнении явных преобразований типов в очевидных случаях.
  • Разрешён импорт статических переменных.
  • В язык введён цикл по коллекции объектов (итератор).

Java 7

  • В июне 2011 г. компания Oracle выпустила релиз-кандидат платформы Java 7. Официальный выпуск этой долгожданной новой версии должен состояться 28 июля 2011 года. После 5 лет фактического застоя, прошедших с момента выпуска Java 6, многие пользователи и разработчики Java-приложений ждут от новой платформы серьезных изменений, приближающих платформу Java к современным реалиям.

Самым заметным новшеством в Java 7, по словам самих разработчиков, должен стать набор новых программных интерфейсов API для организации ввода/вывода под общим названием JSR 203. Впервые технология Java получила настоящий доступ к реальным файловым системам – это позволяет работать с символическими ссылками и получать доступ к функциям каждой конкретной файловой системы. Новый базовый механизм для ветвления и объединения потоков JSR 166y был переработан по инициативе известного специалиста по конкурентной многозадачности Дуга Леа (Doug Lea). Обеспечивая настоящий параллелизм, технология Java теперь полностью готова к работе в многоядерных вычислительных средах. Также платформа Java 7 предлагает технологию JSR 292, которая обеспечивает поддержку динамически типизируемых языков программирования в виртуальных Java-машинах (JVM).

Релиз-кандидат Java 7 включает в себя всего 13 изменений по сравнению с последней рабочей сборкой продукта. Более половины из этих изменений – это чисто административные исправления, а вот остальные являются настоящими откровениями, исправляя такие серьезные ошибки, как сбои виртуальных машин и некорректная JIT-трансляция в среде Eclipse.

Java 9 отложена до 2017

2 декабря 2015 года разработчики из Oracle сообщили, что они не вписываются в опубликованный ранее график подготовки Java 9[6].

Согласно заявлению, им потребуется ещё около полугода чтобы довести проект Jigsaw до подобающего продукту вида, развивающего значимые для Java средства разбиения программ и JDK на модули.

На 2 декабря 2015 года для утверждения подготовлен график, в соответствии с которым релиз JDK 9 переносится с 22 сентября 2016 года на 23 марта 2017 года. Завершение разработки необходимого функционала ожидается 25 мая 2016 года, а не 10 декабря 2015 года, как планировалось изначально.

Выход Java 14

В марте 2020 года Oracle выпустила Java 14 (Oracle JDK 14) и заявила, что новая версия повышает производительность разработчиков, работающих с языком программирования Java. Основные нововведения следующие.

  • JEP 305: Pattern Matching for instanceof. Расширяет функциональность сопоставления с шаблоном для оператора instanceof. Это повышает производительность труда разработчика, устраняя необходимость в шаблонном коде, и позволяет получить более компактный и типобезопасный код.

  • JEP 343: Packaging Tool (инкубатор). Предоставляет разработчикам возможность упаковывать приложения Java для распространения в специфичных для платформ форматах. Это помогает создавать современные приложения в виде единого поставляемого пакета библиотек, в котором объединены среда исполнения и код приложения. 

  • JEP 345: NUMA-Aware Memory Allocation for G1ю Повышает общую производительность сборщика мусора G1 в системах с архитектурой памяти NUMA (Non-Uniform Memory Access).

  • JEP 349: JFR Event Streaming. Открывает данные JDK Flight Recorder (JFR) для непрерывного мониторинга. Это упростит доступ различных инструментов и приложений к данным JFR и будет стимулировать дальнейшие инновации.

  • JEP 358: Helpful NullPointerExceptions. Повышает удобство использования исключений NullPointerException, точно описывая, какая переменная была равна нулю, и предоставляя другую полезную информацию.

  • JEP 359: Records. Обеспечивает компактный синтаксис объявления классов, которые содержат поверхностные неизменяемые данные (shallowly immutable). Эта функция может значительно сократить шаблонный код в классах такого типа, но самое большое преимущество – возможность моделировать данные как данные. 

  • JEP 370: Foreign-Memory Access API. API-интерфейс, позволяющий программам Java безопасно и эффективно получать доступ к областям внешней памяти вне динамически распределяемой heap-памяти Java.[7]

Выход Java 15

В сентябре 2020 года Oracle сообщила о выходе Java 15. В этом году язык программирования отмечает 25-летний юбилей.

В качестве ознакомительной возможности Java 15 впервые добавлены запечатанные классы (Sealed Classes, JEP 360). Также в целях получения дополнительной обратной связи от сообщества в качестве ознакомительных возможностей повторно включены сопоставление с образцом для оператора instanceof (Pattern Matching, JEP 375) и записи (Records, JEP 384).

Oracle выпустила Java 15

Другие ключевые нововведения в Java 15 следующие:

  • JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA). Эта функция позволяет повысить безопасность и производительность за счет внедрения криптографических подписей с использованием алгоритма EdDSA (описание см. в RFC 8032).

  • JEP 371: Hidden Classes. Функция помогает увеличить производительность – она улучшает взаимодействие Java с фреймворками, которые генерируют классы при выполнении и используют их косвенно, через механизм рефлексии.

  • JEP 378: Text Blocks. Эта функция была ознакомительной в JDK 13 и JDK 14. Она помогает увеличить производительность разработки благодаря добавлению строковых литералов и автоматическому форматированию строк предсказуемым образом.

  • JEP 377: ZGC. Этот масштабируемый сборщик мусора с низкими показателями задержки был впервые представлен в JDK 11 для ознакомления и теперь выпущен в финальной версии.

  • JEP 384: Records. Эта ознакомительная возможность, впервые представленная в JDK 14, помогает улучшить производительность за счет более компактного синтаксиса для объявления классов, содержащих поверхностные неизменяемые данные.

  • JEP 383: Foreign-Memory Access API. Эта функция из инкубатора, впервые представленная в JDK 14, определяет API, с помощью которого программы Java могут безопасно и эффективно получать доступ к областям внешней памяти вне динамически распределяемой heap-памяти Java.[8]

Java 17

16 сентября 2021 корпорация Oracle представила Java 17, которая отличается уровнем производительности, стабильности и сопровождается множеством обновлений в области безопасности. Данный релиз также содержит 14 JEP (JDK Enhancement Proposal), которые ведут к дальнейшим улучшениям платформы и языка программирования Java и помогают повысить производительность труда разработчиков.

Java 17 представляет собой релиз из категории LTS (long-term support), который выходит в рамках стандартного шестимесячного цикла релизов Java и является результатом тесного сотрудничества инженеров Oracle и других участников сообщества Java на базе OpenJDK Community и Java Community Process (JCP). Предыдущая версия JDK 11 LTS была выпущена три года назад, и за это время система была улучшена за счет 70 JEP от членов сообщества.

Oracle JDK 17 и будущие релизы JDK попадают под действие полностью бесплатной лицензии, которая будет действовать вплоть до 2022 года после выхода следующего релиза LTS. Oracle также продолжит выпускать Oracle OpenJDK под действием открытой лицензии General Public License (GPL), на тех же условиях, которые были утверждены в 2017 году.

Oracle сотрудничает с сообществом разработчиков Java и JCP в работе над графиком выхода релизов LTS, чтобы предложить организациям больше гибкости в переходе на последние версии Java LTS. Таким образом, Oracle предполагает выпустить релиз LTS Java 21 в сентябре 2023, меняя частоту выхода LTS с трех лет до двух лет.

Пользователи с подписками Oracle LTS и Java SE могут мигрировать на Java 17 в наиболее комфортном для них режиме. Oracle продолжит предоставлять этим заказчикам обновления безопасности, гарантировать производительность и присылать исправления для Java 17 вплоть до сентября 2029.

«
За последние три года мы узнали, насколько сильно разработчики ценят дополнительные функции, а также убедились в том, что экосистема полностью приняла шестимесячный режим выпуска релизов, - сказал Джорджес Сааб said (Georges Saab), вице-президент по разработке Java Platform Group, Oracle. – И одним из вызовов для разработчиков Java является ограничение на использование только релиза LTS. Поэтому переход на выпуск LTS версий раз в два года позволит разработчикам из консервативных организаций получить больше гибкости и работать с теми функциями, которые они хотят использовать.
»

Применения платформы Java

Следующие успешные проекты реализованы с привлечением Java (J2EE) технологий: Amazon, eBay, Flickr, Google (Gmail), Yandex, LinkedIn.

Следующие компании в основном фокусируются на Java (J2EE) технологиях, а не на .NET, хотя имеют дело также и с последними: SAP, IBM, Oracle.

Основные возможности

  • автоматическое управление памятью
  • расширенные возможности обработки исключительных ситуаций;
  • богатый набор средств фильтрации ввода/вывода;
  • набор стандартных коллекций, таких как массив, список, стек и т. п.;
  • наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI);
  • наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;
  • встроенные в язык средства создания многопоточных приложений;
  • унифицированный доступ к базам данных на основе JDBC и SQLJ.
  • поддержка шаблонов (начиная с версии 1.5)

Пространство имён

Идея пространств имён воплощена в Java-пакетах.

Пример программы

Программа, выводящая «Hello, World!»: <source lang="java"> public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }</source>

Пример использования коллекции: <source lang="java"> import java.util.*; public class Sample { public static void main(String[] args) { // Создание объекта коллекции. List<String> strings = new ArrayList<String>(); strings.add("Hello"); strings.add("world"); strings.add("!"); for (String s : strings) { System.out.print(s); System.out.print(" "); } } }</source>

Основные идеи

Примитивные типы

В языке Java только 8 скалярных типов: boolean, byte, char, short, int, long, float, double.

Классы-обёртки примитивных типов
  • java.lang.Byte
  • java.lang.Short
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Float
  • java.lang.Double
  • java.lang.Boolean
  • java.lang.Character

Длины и диапазоны значений примитивных типов определяются стандартом, а не реализацией и приведены в таблице. Тип char сделали двухбайтовым для удобства локализации (один из идеологических принципов Java): когда складывался стандарт, уже существовал Unicode-16, но не Unicode-32. Поскольку в результате не осталось однобайтового типа, добавили новый тип byte. Типы float и double могут иметь специальные значения +INFINITY, -INFINITY и «не число» (NaN). Для типа double они обозначаются Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN; для типа float — так же, но с приставкой Float вместо Double. Минимальные положительные значения, принимаемые типами float и double, тоже стандартизованы.

Тип Длина (в байтах) Диапазон или набор значений
boolean не определено true, false
byte 1 −128..127
char 2 0..216-1, или 0..65535
short 2 −215..215-1, или −32768..32767
int 4 −231..231-1, или −2147483648..2147483647
long 8 −263..263-1, или примерно −9.2·1018..9.2·1018
float 4 -(2-2-23)·2127..(2-2-23)·2127, или примерно −3.4·1038..3.4·1038, а также -INFINITY, INFINITY, NaN
double 8 -(2-2-52)·21023..(2-2-52)·21023, или примерно −1.8·10308..1.8·10308, а также -INFINITY, INFINITY, NaN

Такая жёсткая стандартизация была необходима, чтобы сделать язык платформенно-независимым, что является одним из идеологических требований к Java и одной из причин её успеха. Тем не менее одна небольшая проблема с платформенной независимостью всё же осталась. Некоторые процессоры используют для промежуточного хранения результатов 10-байтовые регистры или другими способами улучшают точность вычислений. Для того, чтобы сделать Java максимально совместимой между разными системами, в ранних версиях любые способы повышения точности вычислений были запрещены. Однако это приводило к снижению быстродействия. Выяснилось, что ухудшение точности ради платформенной независимости мало кому нужно, тем более если за это приходится платить замедлением работы программ. После многочисленных протестов этот запрет отменили, но добавили ключевое слово strictfp, запрещающее повышение точности.

Преобразования при математических операциях

В языке Java действуют следующие правила:

  1. Если один операнд имеет тип double, другой тоже преобразуется к типу double.
  2. Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
  3. Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
  4. Иначе оба операнда преобразуется к типу int.

Последнее правило отличает Java от старых реализаций C и C++ и делает код более безопасным. Так, например, в языке Java после выполнения кода <source lang="java">short x = 50, y = 1000; int z = x*y; </source> переменной z присваивается значение 50000, а не −15536, как в большинстве безнадёжно устаревших реализаций C и C++. В программе, скомпилированной MS VC++, начиная с версии 7, а также многими другими современными компиляторами (gcc, Intel C++, Borland C++, Comeau и т.д.), значение будет также равно 50000.

Объектные переменные, объекты, ссылки и указатели

В языке Java имеются только динамически создаваемые объекты. Причем переменные объектного типа и объекты в Java — совершенно разные сущности. Переменные объектного типа являются ссылками, то есть неявными указателями на динамически создаваемые объекты. Это подчёркивается синтаксисом описания переменных. Так, в Java нельзя писать: <source lang="java"> double a[10][20]; Foo b(30); </source> а нужно: <source lang="java"> double[][] a = new double[10][20]; Foo b = new Foo(30); </source>

При присваиваниях, передаче в подпрограммы и сравнениях объектные переменные ведут себя как указатели, то есть присваиваются, копируются и сравниваются адреса объектов. А при доступе с помощью объектной переменной к полям данных или методам объекта не требуется никаких специальных операций разыменовывания — этот доступ осуществляется так, как если бы объектная переменная была самим объектом.

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

  • Нельзя преобразовывать объект типа int или любого другого примитивного типа в указатель или ссылку и наоборот.
  • Над ссылками запрещено выполнять операции ++, −−, +, − или любые другие арифметические операции.
  • Преобразование типов между ссылками жёстко регламентировано. За исключением ссылок на массивы, разрешено преобразовывать ссылки только между наследуемым типом и его наследником, причём преобразование наследуемого типа в наследующий должно быть явно задано и во время выполнения производится проверка его осмысленности. Преобразования ссылок на массивы разрешены лишь тогда, когда разрешены преобразования их базовых типов, а также нет конфликтов размерности.
  • В Java нет операций взятия адреса (&) или взятия объекта по адресу (*). Звёздочка в Java означает умножение, и только. Амперсанд (&) означает всего лишь «побитовое и» (двойной амперсанд — «логическое и»).

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

Дублирование ссылок и клонирование

Из-за того, что объектные переменные являются ссылочными, при присваивании не происходит копирования объекта. Так, если написать <source lang="java"> Foo foo, bar;

bar = foo; </source> то произойдет копирование адреса из переменной foo в переменную bar. То есть foo и bar будут указывать на одну и ту же область памяти, то есть на один и тот же объект; попытка изменить поля объекта, на который ссылается переменная foo, будет менять объект, с которым связана переменная bar, и наоборот. Если же необходимо получить именно ещё одну копию исходного объекта, пользуются или методом (функцией-членом, в терминологии C++) clone(), создающим копию объекта, или же копирующим конструктором.

Метод clone() требует, чтобы класс реализовывал интерфейс Cloneable (об интерфейсах см. ниже). Если класс реализует интерфейс Cloneable, по умолчанию clone() копирует все поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод clone(). Определение и использование метода clone() часто является нетривиальной задачей [1].

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

В языке Java невозможно явное удаление объекта из памяти — вместо этого реализована сборка мусора. Традиционным приёмом, дающим сборщику мусора «намёк» на освобождение памяти, является присваивание переменной пустого значения null. Это, однако, не значит, что объект, заменённый значением null, будет непременно и немедленно удалён. Данный приём всего лишь устраняет ссылку на объект, то есть отвязывает указатель от объекта в памяти. При этом следует учитывать, что объект не будет удален сборщиком мусора, пока на него указывает хотя бы одна ссылка из используемых переменных или объектов. Существуют также методы для инициации принудительной сборки мусора, но не гарантируется, что они будут вызваны исполняющей средой, и их не рекомендуется использовать для обычной работы.

Классы и функции

Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член», а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin(), а есть метод Math.sin() класса Math (содержащего, кроме sin(), методы cos(), exp(), sqrt(), abs() и многие другие).

Статические методы и поля

Для того чтобы не надо было создавать объект класса Math (и других аналогичных классов) каждый раз, когда надо вызвать sin() (и другие подобные функции), введено понятие статических методов (static method)(иногда в русском языке они называются статичными). Статический метод (отмечаемый ключевым словом static в описании) можно вызвать, не создавая объекта его класса. Поэтому можно писать <source lang="java">double x = Math.sin(1);</source> вместо <source lang="java">Math m = new Math(); double x = m.sin(1);</source> Ограничение, накладываемое на статические методы, заключается в том, что в объекте this они могут обращаться только к статическим полям и методам.

Статические поля имеют тот же смысл, что и в C++: каждое существует только в единственном экземпляре.

Финальность

Ключевое слово final (финальный) означает разные вещи при описании переменной, метода или класса. Финальная переменная инициализируется при описании и дальше не может быть изменена. Финальный метод не может быть переопределён при наследовании. Финальный класс не может иметь наследников вообще.

Абстрактность

В Java методы, не объявленные явно как final или private, являются виртуальными в терминологии C++: при вызове метода, по-разному определённого в базовом и наследующем классах, всегда производится проверка времени выполнения.

Абстрактным методом (описатель abstract) в Java называется метод, для которого заданы параметры и тип возвращаемого значения, но не тело. Абстрактный метод определяется в классах-наследниках. В C++ то же самое называется чисто виртуальной функцией. Для того чтобы в классе можно было описывать абстрактные методы, сам класс тоже должен быть описан как абстрактный. Объекты абстрактного класса создавать нельзя, потому что на не известен размер памяти, который необходимо выделить пол объект такого класса.

Интерфейсы

Высшей степенью абстрактности в Java является интерфейс (interface). Все методы интерфейса абстрактны: описатель abstract даже не требуется. Интерфейс не является классом. Класс может наследовать, или расширять (extends) другой класс или реализовывать (implements) интерфейс. Кроме того, интерфейс может наследовать, или расширять другой интерфейс.

В Java класс не может наследовать более одного класса, зато может реализовывать сколько угодно интерфейсов.

Интерфейсы можно передавать методам как параметры, но нельзя создавать объекты их типов.

Маркерные интерфейсы

В Java есть некоторые интерфейсы, которые не содержат методов для реализации, а специальным образом обрабатываются JVM. Это интерфейсы:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.rmi.Remote

Шаблоны в Java (generics)

Начиная с версии Java 5 в языке появился механизм обобщённого программирования — шаблоны, внешне близкие к шаблонам C++. С помощью специального синтаксиса в описании классов и методов можно указать параметры-типы, которые внутри описания могут использоваться в качестве типов полей, параметров и возвращаемых значений методов.

<source lang="java"> // Объявление обобщённого класса class GenericClass<E> { E getFirst() { ... } void add(E obj) { ... } }

// Использование обобщённого класса в коде GenericClass <String> var = new GenericClass<String>(); var.add("qwerty"); String p = var.getFirst(); </source>

Допускается обобщённое объявление классов, интерфейсов и методов. Кроме того, синтаксис поддерживает ограниченные объявления типов-параметров: указание в объявлении конструкции вида <T extends A & B & C...> требует, чтобы тип-параметр T реализовывал интерфейсы A, B, C и так далее, а конструкция <T super C> требует, чтобы тип-параметр T был типом C или одним из его предков.

В отличие от шаблонов C#, шаблоны Java не поддерживаются средой исполнения — компилятор просто создаёт байт-код, в котором никаких шаблонов уже нет. Реализация шаблонов в Java принципиально отличается от реализации аналогичных механизмов в C++: компилятор не порождает для каждого случая использования шаблона отдельный вариант класса или метода-шаблона, а просто создаёт одну реализацию байт-кода, содержащую необходимые проверки и преобразования типов. Это приводит к ряду ограничений использования шаблонов в программах на Java.

Проверка принадлежности к классу

В Java можно явно проверить, к какому классу принадлежит объект. Выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).

Далее, функция getClass(), определённая для всех объектов, выдаёт объект типа Class. Эти объекты можно сравнивать. Так, например, foo.getClass()==bar.getClass() будет истинно, если объекты foo и bar принадлежат в точности к одному классу (но это не означает что это два одинаковых объекта).

Кроме того, объект типа Class любого типа можно получить так: Integer.class, Object.class.

Однако прямое сравнение классов не всегда является оптимальным средством проверки на принадлежность к классу. Зачастую вместо него используют функцию isAssignableFrom(). Эта функция определена у объекта типа Class и принимает объект типа Class в качестве параметра. Таким образом, вызов Foo.class.isAssignableFrom(Bar.class) вернёт true в случае, если Foo является предком класса Bar. Так как все объекты являются потомками типа Object, вызов Object.class.isAssignableFrom()<code> всегда вернёт <code>true. В паре с упомянутыми функциями объекта типа Class используются также функции isInstance() (эквивалентно instanceof), а также cast() (преобразует параметр в объект выбранного класса).

Лицензирование

2023: Новые условия лицензирования Java вынуждают компании платить за ПО в 5 раз больше

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

В январе 2023-го Oracle заменила подписки Java SE и Java SE Desktop универсальной схемой Java SE Universal. Она распространяется на использование платформы Java SE на персональных компьютерах, серверах и облачных ресурсах. До внесения изменений стоимость подписки Java SE Desktop начиналась с $2,5 на одного именованного пользователя или рабочий стол в месяц, тогда как цена подписки Java SE на один процессор составляла от $25 в месяц. Новые правила лицензирования предполагают взимание платы с каждого сотрудника компании: при этом стоимость составляет от $15 в месяц на работника.

Новые условия лицензирования Java приведут к пятикратному росту затрат корпоративных пользователей

В Gartner приводят пример организации с 49 500 сотрудниками с лицензиями Java SE Desktop именованного пользователя (Named User Plus, NUP) и 5000 процессоров с подпиской Java SE. При старой схеме ценообразования затраты такой компании составили бы $742 500 за лицензии NUP и $900 000 за лицензии на процессоры. Новая модель универсальной подписки потребует выплаты $3 118 500, что на 90% больше.

В отчете Gartner поясняется, что переход на новую метрику может привести к увеличению затрат для предприятий в 2–5 раз, поскольку подписка Java SE Universal требует приобретения лицензий для всех сотрудников в организации — независимо от того, используют ли они Java SE, или нет. Более того, Oracle также учитывает всех временных сотрудников, подрядчиков и агентов. Аналитики Gartner подсчитали, что к 2026 году каждая пятая организация, использующая платформу Java, будет проходить аудит Oracle, что приведет к «непредусмотренным в бюджете сборам за несоблюдение лицензионных требований».[9]

Библиотеки классов

  • JDK — содержит набор базовых классов для всего ПО на платформах Java SE и Java EE
  • CDK — для создания химического ПО
  • MARF — модульная библиотека для распознавания аудио

Средства разработки ПО

  • Oracle Java Development Kit — помимо набора библиотек для платформ Java SE и Java EE содержит компилятор командной строки javac и набор утилит, также работающих в режиме командной строки.
  • NetBeans IDE — бесплатная интегрированная среда разработки для всех платформ Java — Java ME, Java SE и Java EE. Пропагандируется Sun Microsystems, разработчиком Java, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.).
  • Eclipse — бесплатная интегрированная среда разработки для Java SE и Java EE. Ведутся работы по поддержке в Eclipse платформы Java ME. Пропагандируется IBM, одним из важнейших разработчиков корпоративного ПО, как базовое средство для разработки ПО на языке Java и других языках (C, C++, Ruby, Fortran и др.)
  • IntelliJ IDEA — коммерческая среда разработки для платформ Java SE, Java EE и Java ME.

Популярность Java

2024: Java на службе у бизнеса: Об адаптации технологии к различным отраслям экономики

Статья рассматривает роль языка Java в различных сферах бизнеса: финансах, здравоохранении, телекоммуникациях, ритейле и электронной коммерции.

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

2018: Первое место в мире

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

2013: К Java вернулся статус самого популярного языка программирования

Несмот­ря на все про­бле­мы с без­опас­но­стью, об­на­ру­жен­ные в по­след­нее время, Java вер­нул себе пер­вое место в еже­ме­сяч­ном рей­тин­ге по­пу­ляр­но­сти язы­ков про­грам­ми­ро­ва­ния Tiobe Programming Community Index. До этого целых де­сять ме­ся­цев пер­вое место за­ни­мал Си. В самой ком­па­нии Tiobe счи­та­ют, что по­пу­ляр­ность Java вы­рос­ла бла­го­да­ря успе­ху Android-фонов.

Итак, у Java те­перь рей­тинг по­пу­ляр­но­сти 18,387%, а у Си — 17,080. В де­сят­ку также вошли Objective-C (9,803), C++ (8,758), C# (6,680), PHP (5,074), Python (4,949), Visual Basic (4,648), Perl (2,252) и Ruby (1,752). По­пу­ляр­ность Python среди ин­тер­пре­та­то­ров рас­тет, и вско­ре он может обой­ти PHP, по­ла­га­ют в Tiobe.

В Tiobe оце­ни­ва­ют по­пу­ляр­ность язы­ков по ко­ли­че­ству про­грам­ми­стов, кур­сов обу­че­ния и по­став­щи­ков ин­стру­мен­таль­ных средств. Пер­вое место Java под­твер­жда­ет еще один рей­тинг, PyPL Popularity of Language, со­глас­но ко­то­ро­му ре­зуль­тат языка 29%. У PyPL иная ме­то­ди­ка под­сче­та — по ко­ли­че­ству по­ис­ко­вых за­про­сов, ка­са­ю­щих­ся ру­ко­водств по язы­кам про­грам­ми­ро­ва­ния. Со­глас­но PyPL, на вто­ром месте сей­час PHP (14,6), за ним сле­ду­ют C# (10,5), Python (10,3), C++ (9,8), C (9,6), JavaScript (7,5), Visual Basic (3,8), Ruby (2,9) и Perl (1,9).

Java и Microsoft

Компанией Microsoft была разработана собственная реализация JVM (MSJVM), включавшаяся в состав различных ОС, начиная с Windows 95. MSJVM была близка к спецификации Sun Microsystems v.1.1.3, но не соответствовала ей по ряду принципиальных характеристик (в частности, по отсутствию поддержки технологий RMI и JNI и наличию нестандартных расширений). Впоследствии это явилось поводом для судебных исков со стороны Sun Microsystems к Microsoft. Суд принял сторону компании Sun Microsystems. В конечном счёте между двумя компаниями была достигнута договорённость о возможности продления срока официальной поддержки пользователей нестандартной Microsoft JVM до конца 2007 года, но не более[10]. В настоящее время компанией Microsoft для платформы .NET предлагается Java-подобный язык J#, не соответствующий официальной спецификации языка Java.

20-летний юбилей Java

23 мая 2015 года исполнилось 20 лет от дня выхода первой версии Java.

В Oracle двадцатилетнюю годовщину со времени появления Java отметили шумным маркетинговым мероприятием[11].

Когда Java был представлен компанией Sun Microsystems, купленной Oracle в 2010 году, это была еще по большей части «доинтернетовская» эпоха, и мировой ландшафт ИТ сильно отличался от нынешнего. Тем не менее Java до сих пор остается в «ящике инструментов» разработчика, а многие другие языки, широко использовавшиеся в 1990-х, такие как Delphi или Perl, остались не у дел либо применяются лишь для ограниченного круга задач.

По мнению разработчиков Oracle платформы Java, главная ценность Java — удобочитаемость и простота.

На 23 мая 2015 года с Java вряд ли сравнится хоть один язык по широте применения в компьютерной индустрии. По оценкам Oracle, Java используют более 9 млн разработчиков и он используется в 7 млрд устройств. Java работает «двигателем», как в очень малых устройствах, так и в крупных системах облачных вычислений.

Google сделала Java основным языком написания программ для Android. На другом конце спектра — фреймворк Map/Reduce для платформы Hadoop, полагающийся на Java для обработки петабайтов данных. Программисты любят Java в том числе потому, что язык легко читается по сравнению с непроходимыми «дебрями», иной раз встречающимися в коде на C++ или Perl.

Удобочитаемость — очень ценная особенность для языка программирования, особенно используемого для разработки ПО уровня предприятия, пояснил он. Когда речь идет о сложной системе, программисту нужна возможность понимать код, который был написан месяцы или годы тому назад.

В пользу Java были и другие характеристики. Одна из них — выполнение разрекламированного в свое время слогана «написано однажды, работает везде». Поскольку код выполняется на кросс-платформенной виртуальной машине Java, можно написать программу на ноутбуке с Windows, а работать она может на сервере с Linux или Solaris без перекомпиляции.

В IDC считают, благодаря долгосрочному сохранению обратной совместимости, а также «методичному развитию» языка его популярность остается высокой. Использование Java в Android и грамотные действия Oracle определенно продлили жизнь платформы, обеспечив спрос на разработчиков с соответствующими навыками.

Oracle развивает язык, поддерживая его привлекательность. В планах корпорации, в релизе Java 9, готовящийся к сентябрю 2016 года, язык будет реорганизован и приведен к модульной архитектуре.

См. также

Ссылки

Литература

Языки программирования

Примечания



ПРОЕКТЫ (8) ПРОЕКТЫ НА БАЗЕ (68) ИНТЕГРАТОРЫ (6)
РЕШЕНИЕ НА БАЗЕ (10) СМ. ТАКЖЕ (905) ОТРАСЛИ (14)


Распределение вендоров по количеству проектов внедрений (систем, проектов) с учётом партнёров

За всю историю
2021 год
2022 год
2023 год
Текущий год

  Microsoft (41, 47)
  Солар (ранее Ростелеком-Солар) (2, 46)
  Oracle (49, 26)
  Hyperledger (Open Ledger Project) (1, 23)
  IBM (33, 18)
  Другие (553, 270)