Чтобы досконально изучить язык программирования Java, следует понять причины его создания, факторы, обусловившие его формирование, а также унаследованные им особенности. Подобно другим удачным языкам программирования, предшествовавшим Java, этот язык сочетает в себе лучшие элементы из своего богатого наследия и новаторские концепции, применение которых обусловлено его особым положением. В этой статье поясняется, как и почему был разработан этот язык, что делает его столь важным и как он развивался за годы своего существования.
Несмотря на то что язык Java неразрывно связан с Интернетом, важно помнить, что это, прежде всего, язык программирования. Разработка и усовершенствование языков программирования обусловлены двумя основными причинами:
- адаптация к изменяющимся средам и областям применения;
- реализация улучшений и усовершенствований в области программирования.
Как будет показано в этой статье, разработка языка Java почти в равной мере была обусловлена обеими этими причинами.
Язык Java тесно связан с языком C++, который, в свою очередь, является прямым наследником языка С. Многие особенности Java унаследованы от обоих этих языков. От С язык Java унаследовал свой синтаксис, а многие его объектно-ориентированные свойства были перенесены из C++. Собственно говоря, ряд определяющих характеристик языка Java был перенесен — или разработан в ответ на возникшие потребности — из его предшественников. Более того, создание Java своими корнями уходит глубоко в процесс усовершенствования и адаптации, который происходит в языках программирования на протяжении нескольких последних десятилетий. Поэтому в этом разделе рассматривается последовательность событий и факторов, приведших к появлению Java. Как станет ясно в дальнейшем, каждое новшество в архитектуре языка, как правило, было обусловлено необходимостью найти решение той или иной основной проблемы, которую не могли разрешить существовавшие до этого языки. И Java не является исключением из этого правила.
Зарождение современного программирования: язык С
Язык С буквально потряс компьютерный мир. Его влияние нельзя недооценивать, поскольку он полностью изменил подход к программированию. Создание языка С было прямым следствием потребности в структурированном, эффективном и высокоуровневом языке, который мог бы заменить код ассемблера в процессе создания системных программ. Как вы, вероятно, знаете, при проектировании языка программирования часто приходится находить компромиссы между:
- простотой использования и предоставляемыми возможностями;
- безопасностью и эффективностью;
- устойчивостью и расширяемостью.
До появления языка С программистам, как правило, приходилось выбирать между языками, которые позволяли оптимизировать тот или иной ряд характеристик. Так, на языке FORTRAN можно было писать достаточно эффективные программы для научных вычислений, но он не очень подходил для написания системного кода. Аналогично язык BASIC был очень прост в изучении, но у него было не очень много функциональных возможностей, а недостаточная структурированность ставила под сомнение его полезность для написания крупных программ. На языке ассемблера можно писать очень эффективные программы, но его трудно изучать и эффективно использовать. Более того, отладка ассемблерного кода может оказаться весьма сложной задачей.
Еще одна усложнявшая дело проблема состояла в том, что первые языки программирования вроде BASIC, COBOL и FORTRAN были разработаны без учета принципов структурирования. Вместо этого основными средствами управления программой в них были операторы безусловного перехода GOTO. В результате программы, написанные на этих языках, проявляли тенденцию к появлению так называемого “макаронного кода” — множества запутанных переходов и условных ветвей, которые делали программу едва ли доступной для понимания. И хотя языки наподобие Pascal структурированы, они не были предназначены для написания эффективных программ и лишены ряда важных средств, необходимых для написания разнообразных программ. (В частности, применять Pascal для написания системного кода было нецелесообразно, принимая во внимание наличие нескольких стандартных диалектов этого языка.)
Таким образом, до изобретения языка С, несмотря на затраченные усилия, ни одному языку не удавалось разрешить существовавшие в то время противоречия в программировании. Вместе с тем потребность в таком языке становилась все более насущной. В начале 1970-х годов началась компьютерная революция, и потребность в программном обеспечении быстро превысила возможности программистов по его созданию. В академических кругах большие усилия были приложены к созданию более совершенного языка программирования. Но в то же время стало все больше ощущаться влияние еще одного, очень важного фактора. Компьютеры, наконец, получили достаточно широкое распространение, чтобы была достигнута “критическая масса”. Компьютерное оборудование больше не находилось за закрытыми дверями. Впервые программисты получили буквально неограниченный доступ к своим вычислительным машинам. Это дало свободу для экспериментирования. Программисты смогли также приступить к созданию своих собственных инструментальных средств. Накануне создания С произошел качественный скачок в области языков программирования.
Язык С, изобретенный и впервые реализованный Деннисом Ритчи на мини- ЭВМ DEC PDP-11, работавшей под управлением операционной системы UNIX, явился результатом процесса разработки, начавшегося с предшествующего ему языка BCPL, разработанного Мартином Ричардсом. BCPL оказал влияние на язык, получивший название В, который был изобретен Кеном Томпсоном и в начале 1970-х гг. привел к появлению языка С. В течение долгих лет фактическим стандартом языка С была его версия, которая поставлялась вместе с операционной системой UNIX (она описана в книге Язык программирования С Брайана Кернигана и Денниса Ритчи, 2-е издание, И.Д. “Вилямс”, 2007 г.). Язык С был формально стандартизован в декабре 1989 г„ когда Национальный институт стандартизации США (American National Standards Institute — ANSI) принял стандарт на С.
Многие считают создание С началом современного этапа развития языков программирования. Этот язык успешно соединил противоречивые свойства, которые доставляли столько неприятностей в предыдущих языках. В итоге появился мощный, эффективный, структурированный язык, изучение которого было сравнительно простым. Кроме того, ему была присуща еще одна, почти непостижимая особенность: он был разработан специально для программистов. До появления С языки программирования проектировались в основном в качестве академических упражнений или бюрократическими организациями. Иное дело — язык С. Он был спроектирован, реализован и разработан практикующими программистами и отражал их подход к программированию. Его функции были отлажены, проверены и многократно переработаны людьми, которые действительно пользовались этим языком. Таким образом, получился язык, который сразу же понравился программистам. И действительно, язык С быстро приобрел много приверженцев, которые едва ли не молились на него. Благодаря этому С получил быстрое и широкое признание среди программистов. Короче говоря, С — это язык, разработанный программистами для программистов. Как станет ясно в дальнейшем, эту замечательную особенность унаследовали язык Java.
Следующий этап: язык C++
В конце 1970-х-начале 1980-х гг. язык С стал господствующим языком программирования и продолжает широко применяться до сих пор. А если С — удачный и удобный язык, то может возникнуть вопрос: чем обусловлена потребность в каком-то другом языке? Ответ состоит в постоянно растущей сложности программ. На протяжении всей истории развития программирования постоянно растущая сложность программ порождала потребность в более совершенных способах преодоления их сложности. Язык C++ явился ответом на эту потребность. Чтобы лучше понять, почему потребность преодоления сложности программ является главной побудительной причиной создания языка C++, рассмотрим следующие факторы.
С момента изобретения компьютеров подходы к программированию коренным образом изменились. Когда компьютеры только появились, программирование осуществлялось изменением двоичных машинных инструкций вручную с панели управления компьютера. До тех пор, пока длина программ не превышала нескольких сотен инструкций, этот подход был вполне приемлем. В связи с разрастанием программ был изобретен язык ассемблера, который позволил программистам работать с более крупными и все более сложными программами, используя символьные представления машинных инструкций. По мере того как программы продолжали увеличиваться в объеме, появились языки высокого уровня, которые предоставили программистам дополнительные средства для преодоления сложности программ.
Первым языком программирования, который получил широкое распространение, был, конечно же, FORTRAN. Хотя он и стал первым впечатляющим этапом в программировании, его вряд ли можно считать языком, который способствует созданию ясных и простых для понимания программ. 1960-е годы ознаменовались зарождением структурного программирования. Эта методика программирования наиболее ярко проявилась в таких языках, как С. Пользуясь структурированными языками, программисты впервые получили возможность без особых затруднений создавать программы средней сложности. Но и методика структурного программирования уже не позволяла программистам справиться со сложными проектами, когда они достигали определенных масштабов. К началу 1980-х. сложность многих проектов начала превышать предел, позволявший справиться с ними, применяя структурный подход. Для решения этой проблемы была изобретена новая методика программирования, получившая название объектно-ориентированного программирования (ООП). Объектноориентированное программирование подробно рассматривает^ ся в последующих главах, а здесь приводится лишь краткое его определение: ООП — это методика программирования, которая помогает организовывать сложные программы, применяя принципы наследования, инкапсуляции и полиморфизма.
Из всего сказанного выше можно сделать следующий вывод: несмотря на то, что С является одним из лучших в мире языков программирования, существует предел его способности справляться со сложностью программ. Как только размеры программы превышают определенную величину, она становится слишком сложной, чтобы ее можно было охватить как единое целое. Точная величина этого предела зависит как от структуры самой программы, так и от подходов, используемых программистом, но начиная с определенного момента любая программа становится слишком сложной для понимания и внесения изменений, а следовательно, неуправляемой. Язык C++ предоставил возможности, которые позволили программистам преодолеть этот порог сложности, чтобы понимать крупные программы и управлять ими.
Язык C++ был изобретен Бьярне Страуструпом (Bjarne Stroustrup) в 1979 г., когда он работал в компании Bell Laboratories в городе Мюррей-Хилл, шт. Нью-Джерси. Вначале Страуструп назвал новый язык “С with Classes” (С с классами). Но в 1983 г. это название было изменено на C++. Язык C++ расширяет функциональные возможности языка С, добавляя в него объектно-ориентированные свойства. А поскольку язык C++ построен на основе С, то в нем поддерживаются все функциональные возможности, свойства и преимущества С. Это обстоятельство явилось главной причиной успешного распространения C++ в качестве языка программирования. Изобретение языка C++ не было попыткой создать совершенно новый язык программирования. Напротив, все усилия были направлены на усовершенствование уже существующего очень удачного языка.
Предпосылки к созданию Java
К концу 1980-х и в начале 1990-х гг. объектно-ориентированное программирование на C++ стало основной методикой программирования. И в течение некоторого, хотя и непродолжительного периода времени казалось, что программисты наконец изобрели идеальный язык. Ведь язык C++ сочетал в себе высокую эффективность и стилистические элементы языка С наряду с объектно-ориентированным подходом, и поэтому его можно было использовать для создания самых разных программ. Но, как и прежде, уже вызревали факторы, которые должны были в очередной раз стимулировать развитие языков программирования. Прошло еще несколько лет, и развитие Всемирной паутины и Интернета достигло “критической массы”, что и привело к еще одной революции в программировании.