Команда Spring АйО подготовила перевод статьи, посвящённой истории Java — одного из самых популярных языков программирования.
В статье вы найдёте не только краткую историю языка, но и его ключевые характеристики, которые сделали этот язык программирования таким востребованным.
1. Обзор
Java — один из самых популярных языков программирования в мире. Он был создан Джеймсом Гослингом и Патриком Ноттоном, сотрудниками компании Sun Microsystems, при поддержке Билла Джоя, сооснователя Sun Microsystems.
Компания Sun официально представила язык Java на конференции SunWorld 23 мая 1995 года. Затем, в 2009 году, компания Oracle купила компанию Sun, что объясняет, почему сейчас язык принадлежит Oracle.
В этой статье мы рассмотрим историю языка программирования Java.
2. Что такое Java
Java описывается как многоцелевой, строго типизированный, объектно-ориентированный язык программирования. По замыслу, Java обладает минимальным количеством зависимостей от конкретных реализаций.
Этот язык программирования позволяет создавать приложения на множестве устройств. Его применение очень широкое, включая разработку программного обеспечения для мобильных устройств, POS-терминалов, банкоматов, Интернета вещей (IoT), а также веб-страниц.
Несмотря на то, что Kotlin стал предпочтительным языком для разработки Android-приложений в 2021 году, Java по-прежнему остается основным языком для разработки приложений под Android. Это связано с тесной интеграцией Android с Java. В частности, части операционной системы, такие как пользовательский интерфейс и некоторые основные библиотеки, написаны на Java.
3. Краткая история
Давайте погрузимся в историю проекта Java и посмотрим, как он начался и развивался с течением времени.
3.1 Начало
Проект Java зародился в 1991 году в недрах компании Sun Microsystems, когда трое инженеров — Джеймс Гослинг, Майк Шеридан и Патрик Ноттон — стремились создать язык, работающий на небольших электронных устройствах.
Вскоре они запустили проект под названием Green Project для изучения влияния конвергенции между цифрово управляемыми бытовыми приборами и компьютерами.
Используя синтаксис, похожий на C++, они создали цифровой пульт дистанционного управления, оснащенный графическим и анимированным сенсорным экраном. Пульт, результат нескольких месяцев интенсивных исследований, обладал удивительной возможностью управления всем оборудованием в гостиной. Он был запрограммирован на новом языке, полностью независимом от процессора, на котором работал, что делало его уникальным.
В конечном итоге Джеймс Гослинг, один из участников Green Project, разработавший этот язык, назвал его Oak.
Проект получил развитие, когда к нему присоединились американские кабельные операторы. Oak был переименован в FirstPerson. Однако проект FirstPerson не имел коммерческого успеха, вероятно, из-за того, что опередил своё время в индустрии, где основным приоритетом была прибыльность.
3.2 Появление протокола HTTP и браузера Mosaic
В 1993 году появление протокола HTTP и браузера Mosaic стало ключевым событием для проекта Java. В этот период команда осознала, что интернет станет идеальным каналом для продвижения их продукта.
В 1995 году Джеймс Гослинг представил браузер под названием WebRunner, который был способен отображать HTML-контент, смешанный с апплетами Java. Этот момент стал отправной точкой для дальнейшего развития проекта. Вскоре WebRunner был переименован в HotJava, а сайт java.sun.com был официально открыт для публики.
Со временем технология получила название "Java" (что в американском сленге означает "кофе") в честь любимого напитка программистов. Частично производство этого напитка осуществляется на острове Ява, откуда и происходит название.
После этого компании Sun и Netscape объявили о своем намерении интегрировать новую технологию в свои браузеры, что окончательно запустило язык в массовое использование. Версии Java стали выпускаться последовательно: от версии 1 в 1996 году до версии 17 в 2021 году.
Скрытый текст
На данный момент, последняя версия JDK - 22, а последняя LTS версия - 21, выпущенная в сентябре 2023.
4. Характеристики
Благодаря своим отличным характеристикам, Java стала популярным и полезным языком программирования. Компания Sun охарактеризовала его как:
Компилируемый и интерпретируемый
Платформонезависимый и переносимый
Объектно-ориентированный
Надежный и безопасный
Распределенный
Знакомый, простой и компактный
Многопоточный и интерактивный
Высокопроизводительный
Динамичный и расширяемый
Источник: “Programming with Java” – E Balagurusamy.
Далее мы подробно рассмотрим каждую из этих характеристик.
4.1. Компилируемый и интерпретируемый
Java объединяет мощь компилируемых языков и гибкость интерпретируемых языков.
Компилятор (javac) компилирует исходный код в байт-код, затем Виртуальная Машина (JVM) выполняет этот байт-код, преобразуя его в код, понятный машине.
4.2. Платформонезависимый и переносимый
Двухступенчатый процесс компиляции лежит в основе самой значимой особенности Java: независимости от платформы, что обеспечивает переносимость.
Независимость от платформы означает, что программа, скомпилированная на одной машине, может быть выполнена на любой другой машине, независимо от операционной системы, при условии наличия установленной JVM.
Переносимость является способностью запускать программу на различных машинах. На самом деле, один и тот же код будет работать идентично на разных платформах, независимо от аппаратной совместимости или операционных систем, без необходимости в изменениях, таких как повторная компиляция или модификация исходного кода.
4.3. Объектно-Ориентированный
Java поддерживает концепции объектно-ориентированного программирования, такие как инкапсуляция, абстракция и наследование.
Все инструкции и данные в программе на Java должны быть организованы внутри класса или объекта.
4.4. Надежный и Безопасный
Java включает в себя несколько полезных функций, которые помогают создавать надежные и безопасные приложения.
Одна из самых важных — это система управления памятью вместе с автоматическим сборщиком мусора (Garbage Collector, GC). В отличие от языков, таких как C/C++, Java избегает использования явных указателей и не требует от программистов ручного управления выделенной памятью.
Вместо этого сборщик мусора берет на себя заботу о удалении неиспользуемых объектов для освобождения памяти.
Кроме того, Java является строго типизированным языком, что помогает уменьшить количество ошибок в приложении, а также предоставляет механизмы обработки исключительных ситуаций.
4.5. Распределенный
Эта функция полезна при разработке крупных проектов. Мы можем разделить программу на несколько частей и хранить эти части на разных компьютерах. В результате, мы можем легко создавать распределенные и масштабируемые приложения, которые работают на нескольких узлах.
Этого можно достичь с помощью концепций RMI (Remote Method Invocation — удаленный вызов методов) и EJB (Enterprise JavaBeans).
4.6. Простой и Знакомый
Во-первых, Java прост благодаря своему стилю кодирования, который очень чистый и легкий для понимания. Кроме того, Java не использует сложные и трудные для освоения функции других языков, такие как явные указатели.
Наконец, Java знакомый, поскольку его синтаксис основан на существующих языках, таких как C++, и включает многие функции этих языков.
4.7. Многопоточный и Интерактивный
Многопоточность, известная также как многозадачность на основе потоков, — это характеристика, позволяющая выполнять несколько потоков одновременно.
Короче говоря, мы можем писать программы на Java, которые выполняют множество задач одновременно, определяя несколько потоков. Преимущество многопоточности заключается в том, что она не занимает отдельную память для каждого потока — все потоки используют общую область памяти.
4.8. Высокопроизводительный
Байт-код, генерируемый компилятором, высоко оптимизирован, поэтому виртуальная машина может выполнять его намного быстрее. Вот почему Java быстрее, чем другие традиционные интерпретируемые языки программирования.
4.9. Динамический и Расширяемый
Эта функция предоставляет возможность динамически подключать новые библиотеки классов, методы и объекты. Java высоко динамична, так как может адаптироваться к изменяющейся среде.
5. Важность JRE
Чтобы программа могла работать, ей необходимо окружение, которое позволяет ей функционировать — обычно это операционная система, такая как Linux, Unix, Microsoft Windows или macOS. В отсутствие других поддерживающих окружений программы ограничены возможностями операционной системы и её ресурсами.
Среда Выполнения Java (JRE) действует как переводчик и посредник между программой и операционной системой. Она работает поверх операционной системы, предоставляя дополнительные ресурсы, специфичные для Java.
6. Заключение
Благодаря своим особенностям язык Java получает значительную часть возможностей других существующих языков, одновременно устраняя некоторые из их основных недостатков.
Таким образом, Java является языком, общепризнанно считающимся относительно современным, с хорошо установленным потенциалом.
![](https://habrastorage.org/getpro/habr/upload_files/346/a1a/239/346a1a23911d387cf0993eb019cf90e7.png)
Присоединяйтесь к русскоязычному сообществу разработчиков на Spring Boot в телеграм - Spring АйО, чтобы быть в курсе последних новостей из мира разработки на Spring Boot и всего, что с ним связано.
Ждем всех, присоединяйтесь!
Комментарии (22)
Deadgods
02.09.2024 15:37+1Ну очень краткая история. :-(
nespressopixie
02.09.2024 15:37руквики прдругому рассказывает почему стал называться ява © мопед не мой я просто из-за того что в статье сначала упустили а потом разъяснили почему ява между успел глянуть wiki
nespressopixie
02.09.2024 15:37из-за android вспомнил (по памяти:) если у ява программиста вытащить половину (оперативной) памяти то ява программы будут работать быстрее
nespressopixie
02.09.2024 15:37решил глянуть (webarchive) одну популярную ява прогу (2006 ver 0.1.0 и 2010 ver 1.0) - нашёл в итоге roadmap 2005 по которому смогли всё допилить к версии 1.0 (удивляло что смогли и вроде с 0.7.6 сразу зарелизили поняв что год без проблем) и узнал что она иранская (никогда не интересовался чья) да из-за качественного исполнения для неё остальные страны собрали/напили контента и до сих пор работает хотя рессурс давно в webarchive (ушёл туда когда стало oracle хотя .org домену 20+ лет)
nespressopixie
02.09.2024 15:37может в конец статьи добавить
Кик Рэдек из Microsoft считает С# более сложным языком, чем Java. По его мнению, «язык Java был построен таким образом, чтобы уберечь разработчика от стрельбы себе в ногу» (англ. «Java was built to keep a developer from shooting himself in the foot»), а «С# был построен так, чтобы дать разработчику пистолет, но оставить его на предохранителе» (англ. «C# was built to give the developer a gun but leave the safety turned on»).
ris58h
02.09.2024 15:37+2Один экран текста по заявленой теме и "вода". Уж лучше статью на Википедии почитать.
Презентация Star7 ("пульт" из статьи) от Джеймса Гослинга прямиком из 1992-го.
Throwable
02.09.2024 15:37Если углубиться в тему и отбросить ваниль, то получится сказ о том как "просрать все полимеры". Неплохая и перспективная технология благодаря бездарной политике была сначала выпилена из винды, затем снесена с десктопа, смыта с клиентского веба, практически были просраны все мобильные платформы (только Гугл на свою задницу взял джаву и сильно пожалел потом). На сервере благодаря энтерпрайзному булшиту, веб разработка практически была утрачена в угоду легковесным решениями типа ruby on rails. Все эти JSR спецификации были дорогим и факультативным процессом, и реально никому особо и не впились. Фактически все это время один Spring тащил на себе всю джаву, новый клал по большей части на весь JEE. Около 7 лет застоя языка вызвали отток девелоперов из экосистемы и создание стопицот альтернативных мертворожденных JVM языков. Сегодня джава зацепилась за клауд, но и здесь не все гладко: внезапно оказалось, что она долго стартует, что сильно мешает технологиям с динамическими инстансами, а также не позволяет быть лекговесным языком для написания утилит и скриптов, как Пайтон или JS. ML и AI опять же...
Вообщем, история джавы -- это нифига не история успеха. Скорей вопреки стараниям менеджеров, над все ещё ее использует.
rsashka
Забыли написать, что раньше он был свободный для скачивания и коммерческого использования, что и позволило ему широко распространиться, но после покупки Oracle изменился подход к его лицензированию и теперь есть сложности с использованием последних версий языка, поэтому многие коммерческие продукты либо делают свои или используют чужие кастомные сборки, либо используют старые версии Java.
v7878
Помимо реализации oracle, имеющией перечисленные вами проблемы, есть полностью открытые реализации openjdk и openj9
rsashka
Так я про это и говорю. Раньше была одна Java, а теперь экосистема фрагментирована.
BugM
Сможете показать пару несовместимостей между парой любых сертифицированных ванильных JDK?
rsashka
Что конкретно вы подразумеваете под ограничениями "ванильное" и "сертифицированное"?
Насколько я помню, как раз ограничения на сертификационные тесты, это одна из особенностей новой лицензионной политики.
BugM
Именно это и подразумеваю. Те которые прошли TCK и сказали что изменений не вносили. Вы говорите что экосистема фрагментирована, значит эти сборки как-то отличаются. Так покажите пару различий.
Ограничение нормальное вообще. Неплохо разделяет сборки от Васяна от сборок от больших ребят.
Исходники есть, собирайте и пользуйтесь на здоровье. Это полностью законно. JDK собирается не так сложно вообще. А есть сборки от серьезных ребят которые заплатили нормально денег и прошли все тесты от Оракла. Их много бесплатных, берите любую и пользуйтесь на здоровье.
rsashka
Вы реально не понимаете в чем проблема или только делаете вид, что с экосистемой Java все хорошо? Представьте, что вместо какого нибудь GCC или LLVM будет существовать два десятка разных брендированных компиляторов. Все они собраны из одни и тех же исходников и какие-то из них даже прошли тесты, но настоящие GCC или LLVM использовать нельзя, так как это не позволяет их лицензия.
Кроме Orace JDK и Open JDK существует еще куева туча сборок:
AdoptOpenJDK
Amazon Corretto
Azul Zulu
Bck2Brwsr
CACAO
Codename One
DoppioJVM
Eclipse OpenJ9
GraalVM CE
HaikuVM
HotSpot
Jamiga
JamVM
Jelatine JVM
Jikes RVM (Jikes Research Virtual Machine)
JVM.go
Liberica JDK
leJOS
Maxine
Multi-OS Engine
RopeVM
uJVM
Azul Zing JVM
CEE-J
Excelsior JET
GraalVM EE
Imsys AB
JamaicaVM (aicas)
JBlend (Aplix)
MicroJvm (IS2T – Industrial Smart Software Technology)
OJVM
PTC Perc
SAP JVM
Waratek CloudVM for Java
И это далеко не полный список и вы будете настаивать, что между ними нет никаких различий?
BugM
Так покажите эти различия. Я прошу всего парочку. Только не между любыми, а между теми которые соответствуют критериям которые я чуть выше описал. Это вроде немного. Между gcc и clang я вам легко покажу больше чем два различия.
Пока вся разница это минус два в мою карму. Этот аргумент я вижу и понимаю. Убедительно. Еще чуть-чуть и вы будете правы, а я буду молчать.
rsashka
Я вас просил уточнить, что вы имеете ввиду под термином "ванильное", но ответа так и не получил. Наверно для того, чтобы у вас была возможность сказать "что я не это имел ввиду"? Я не хочу тратить время на пустую переписку. Если вы считаете, что с экосистемой Java все в порядке, ну и пусть, я не буду вас переубеждать, это ваши проблемы, тем более я на ней уже не пишу и теперь этот бардак меня не касается
Это такой стеб или вам нравится изображать из себя недалекого человека?
Естественно gcc и clang полностью различаются.
BugM
Ванильная сборка это сборка авторы которой не написали в ридми что они внесли вот такие-то изменения. Внести изменения и по прежнему проходить TCK нетривиально, но возможно.
Вам надо просто написать или найти в интернете программу которая ведет себя по разному на разных ванильных JDK для доказательства вашего тезиса о проблемах в джава экосистеме. Судя по вашим комментариям это несложно.
На моей стороне TCK. Мой тезис: Все кто TCK походит и сознательно не ломает совместимость одинаковые и между ними нет разницы.
Переход на личности, минусы в карму. Хабр2024 стал странным.
rsashka
Мне это не нужно, это ваше желание, которое я удовлетворять не нанимался.
Изначально я озвучил тезис, что с началом эпохи коммерциализации Java, и сменой лицензии на не свободную, её экосистема стала очень фрагментирована. И в качестве доказательства этого факта привел неполный список сборок JDK. Может какие-то из них совместимы полностью, может быть нет, мне это не интересно, так как подтверждает мой тезис просто сам факт их наличия.
Как контр аргумент (и проверку на фальсифицируемость), я упомянул проекты GCC и LLVM (clang). Пока их лицензии свободные, то и нет необходимости всем и каждому собираться кастомные сборки компиляторов (хоть ванильные, хоть нет).
И да, согласен, Хабр уже давно странный.
BugM
То есть вы принесли тезис о фрагментированности, а пруфов на фрагментированнность, кроме плевков в карму и перехода на мою личность, не будет. Ну окей.
Про наличие TCK я подозреваю вы узнали от меня.
rsashka
Вы уже не первый раз высказываете недовольство оппонентом в споре, требуя от него (т.е. от меня), что-то сделать для вас, что по вашему мнению, сможет вас убедить. Но почему то не хотите ни слушать, ни замечать другие аргументы, да и сами не чураетесь переходов на личности.
Я вам уже объяснил свое мнение насчет фрагментированности Java после смены лицензии. Допускаю, что может быть для вас наличие десятков разных сборок JDK подобным аргументом не являются, но это ваше мнение, которое я уважаю и не собираюсь вас в этом переубеждать.
А минус в карму за "Неконструктивное общение" я вам поставил после того, как вы начали что-то требовать, вместо того, что бы аргументировано обосновать свое мнение насчет изначально озвученных фактов и аргументов.
BugM
Обоснование приносит тот кто принёс какой-то тезис.
Откройте любую статью про джаву. Видите там упоминание на каких idk оно работает? Откройте Гитхаб любой крупной библиотеки. В том числе сложной как Спринг или насквозь пропитанной хаками как Нетти. Там видите упоминание про поддерживаемые idk? Вот, я тоже не вижу.
Вывод: тезис о фрагментированности вам надо как-то серьезно обосновывать. Не обосновывать такое можно если вас зовут Алексей, например. Тогда все сами побегут разбираться и доказывать его.
rsashka
Ну вот опять. Сами придумываете аргументы, сами их пытаетесь опровергнуть.
Если библиотека частично поддерживает какой-то компилятор или платформу, это не говорит о фрагментированости платформы разработки.
Например, clang ведет себя по разному при работе под Linux и Windows. (наткнулся на особенность случайно, из-за чего пришлось использовать библиотеку libffi). Но является ли это фактом, указывающим на фрагментированность экосистемы clang или С++ в целом? Вряд ли.
Другое дело, если бы существовал бы десяток (условно) сборок clang на базе одного и того же исходного кода, причем не важно, что большинство из них будет вели бы себя одинаково.