Начало разработке языка Java было положено в 1991 г. Джеймсом Гослингом (James Gosling), Патриком Нотоном (Patrick Naughton), Крисом Уартом (Chris Warth), Эдом Франком (Ed Frank) и Майком Шериданом (Mike Sheridan), работавшими в компании Sun Microsystems, Inc. Разработка первой рабочей версии заняла 18 месяцев. Вначале язык получил название “Oak” (Дуб), но в 1995 г. он был переименован в "Java”. Между первой реализацией языка Oak в конце 1992 г. и публичным объявлением о создании Java весной 1995 г. в разработке и развитии этого языка приняли участие немало других специалистов. В частности, Билл Джой (Bill Joy), Артур ван Хофф (Arthur van Hoff), Джонатан Пэйн (Jonathan Payne), Франк Йеллин (Frank Yellin) и Тим Линдхольм (Tim Lindholm) внесли основной вклад в развитие исходного прототипа Java.
Как ни странно, первоначальной побудительной причиной для создания языка Java послужил совсем не Интернет, а потребность в независящем от конкретной платформы (т.е. архитектурно нейтральном) языке, который можно было бы использовать для создания программного обеспечения, встраиваемого в различные бытовые электронные устройства, в том числе микроволновые печи и устройства дистанционного управления. Не трудно догадаться, что в контроллерах таких устройств применяются разнотипные процессоры. Но трудность применения С и C++ (как и большинства других языков) состоит в том, что написанные на них программы должны компилироваться для конкретной платформы. И хотя программы на C++ могут быть скомпилированы практически для любого типа процессора, тем не менее, для этого потребуется наличие полного компилятора C++, предназначенного для данного конкретного процессора. Но дело в том, что создание компиляторов обходится дорого и отнимает немало времени. Поэтому требовалось более простое и экономически выгодное решение. Пытаясь найти такое решение, Гослинг и другие разработчики начали работу над переносимым, не зависящим от конкретной платформы языком, который можно было бы использовать для создания кода, пригодного для выполнения на разнотипных процессорах в различных средах. И в конечном итоге их усилия привели к созданию языка Java.
Примерно в то время, когда определялись основные характеристики языка Java, появился второй, еще более важный фактор, который должен был сыграть решающую роль в судьбе этого языка. И этим вторым фактором, конечно же, стала Всемирная паутина (веб). Если бы формирование веб не происходило почти одновременно с реализацией языка Java, он мог бы остаться полезным, но незамеченным языком программирования бытовых электронных устройств. По с появлением веб язык Java вышел на передний край разработки языков программирования, поскольку среда веб также нуждалась в переносимых программах.
С самых первых шагов своей карьеры большинству программистов приходится твердо усваивать, что переносимость программ столь же недостижима, сколь и желательна. Несмотря на то что потребность в средствах для создания эффективных, переносимых (не зависящих от конкретной платформы) программ существовала в программировании с самого начала, она отодвигалась на задний план другими, более насущными, задачами. Более того, большая часть отрасли вычислительной техники была разделена на три конкурирующих лагеря (Intel, Macintosh и UNIX), и поэтому большинство программистов оставались на своих закрепленных аппаратно-программных рубежах, что несколько снижало потребность в переносимом коде. Тем не менее с появлением Интернета и веб старая проблема переносимости возникла снова, а ее решение стало еще более актуальным. Ведь Интернет представляет собой разнообразную и распределенную сетевую среду с разнотипными компьютерами, операционными системами и процессорами. Несмотря на то что к Интернету подключены разнотипные платформы, пользователям желательно, чтобы на всех этих платформах можно было выполнять одинаковые программы. То, что в начале было неприятной, но не слишком насущной задачей, стало потребностью первостепенной важности.
К 1993 г. членам группы разработчиков Java стало очевидно, что проблемы переносимости, часто возникающие при создании кода, предназначенного для встраивания в контроллеры, возникают также и при попытках создания кода для Интернета. Фактически та же проблема, для решения которой в мелком масштабе предназначался язык Java, была актуальна в большем масштабе и в среде Интернета. Понимание этого обстоятельства вынудило разработчиков Java перенести свое внимание с бытовой электроники на программирование для Интернета. Таким образом, Интернет обеспечил крупномасштабный успех Java, несмотря на то, что потребность в архитектурно нейтральном языке программирования послужила для этого своего рода “первоначальной искрой”.
Как упоминалось ранее, язык Java наследует многие изсвоих характеристик от языков С и C++. Это сделано намеренно. Разработчики Java знали, что использование знакомого синтаксиса С и повторение объектноориентированных свойств C++ должно было сделать их язык привлекательным для миллионов, имеющих опыт программирования на C/C++. Помимо внешнего сходства, в Java используется ряд других характерных особенностей, которые способствовали успеху языков С и C++. Во-первых, язык Java был разработан, проверен и усовершенствован людьми, имевшими солидный практический опыт программирования. Этот язык разработан с учетом потребностей и опыта его создателей. Таким образом, Java — это язык для программистов. Во-вторых, Java целостен и логически непротиворечив. В-третьих, Java предоставляет программисту полный контроль над программой, если не учитывать ограничения, накладываемые средой Интернета. Если программирование выполняется грамотно, это непосредственно отражается на самих программах. В равной степени справедливо и обратное. Иначе говоря, Java — это язык не для обучающихся программированию, а для тех, кто занимается им профессионально.
Из-за сходства характеристик языков Java и С некоторые склонны считать Java просто “версией языка C++ для Интернета”. Но это серьезное заблуждение. Языку Java присущи значительные практические и концептуальные отличия. Язык C++ действительно оказал влияние на характеристики Java, но Java не является усовершенствованной версией C++. Например, Java несовместим с языком C++. Разумеется, у него немало сходств с языком C++, и в исходном коде программы на Java программирующий на C++ будет чувствовать себя почти как дома. Вместе с тем язык Java предназначен не для замены C++, а для решения одних задач, тогда как язык C++ — для решения других. Оба этих языка будут еще долго сосуществовать.
Как отмечалось в начале главы, развитие языков программирования обусловлено двумя причинами: адаптацией к изменениям в среде и реализацией новых идей в области программирования. Изменения в среде, которые побудили к разработке языка, подобного Java, вызвали потребность в независящих от платформы программах, предназначенных для распространения в Интернете. Но язык Java изменяет также подход к написанию программ. В частности, язык Java углубил и усовершенствовал объектно-ориентированный подход, использованный в C++, добавил в него поддержку многопоточной обработки и предоставил библиотеку, которая упростила доступ к Интернету. Но столь поразительный успех Java обусловлен не отдельными его особенностями, а их совокупностью как языка в целом. Он явился прекрасным ответом на потребности в то время лишь зарождающейся среды в высшей степени распределенных вычислительных систем. В области разработки программ для Интернета язык Java стал тем, чем язык С стал для системного программирования: революционной силой, которая изменила мир.
Связь с языком C#
Многообразие и большие возможности языка Java продолжают оказывать влияние на всю разработку языков программирования. Многие из его новаторских характеристик, конструкций и концепций становятся неотъемлемой частью основы любого нового языка. Успех Java слишком значителен, чтобы его можно было игнорировать.
Вероятно, наиболее наглядным примером влияния языка Java на программирование служит язык С#. Он создан в корпорации Microsoft для поддержки платформы .NET Framework и тесно связан ejava. В частности, в обоих этих языках используется один и тот же общий синтаксис, поддерживается распределенное программирование и применяется одна и та же объектная модель. Разумеется, у Java и C# имеется целый ряд отличий, но в целом они внешне очень похожи. Ныне такое “перекрестное опыление” Java и C# служит наилучшим доказательством того, что язык Java коренным образом изменил представление о языках программирования и их применении.