Главная страница
Навигация по странице:

  • 3 6 Часть I. Язык Зарождение современного программирования язык С

  • Как язык Java изменил Интернет

  • Магия Java: код виртуальной машины

  • Объектная ориентированность

  • Архитектурная нейтральность

  • Интерпретируемость и высокая производительность

  • Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция


    Скачать 25.04 Mb.
    НазваниеС. Н. Тригуб Перевод с английского и редакция
    АнкорJava. Полное руководство. 8-е издание.pdf
    Дата28.02.2017
    Размер25.04 Mb.
    Формат файлаpdf
    Имя файлаJava. Полное руководство. 8-е издание.pdf
    ТипДокументы
    #3236
    страница3 из 90
    1   2   3   4   5   6   7   8   9   ...   90
    ГЛАВА
    История и развитие языка Чтобы досконально изучить язык Java, необходимо понять причины, которые привели к его созданию, факторы, повлиявшие наконечную архитектуру, и унаследованные им особенности. Подобно удачным компьютерным языкам, появившимся до него, Java объединяет в себе лучшие элементы из своего богатого наследия и новаторские концепции, применение которых обусловлено его уникальным положением. В то время как остальные главы этой книги посвящены практическим аспектам Java — в том числе его синтаксису, библиотеками приложениям, — в настоящей главе описано, как и почему был разработан этот язык, что делает его столь важными как он развился за годы своего существования.
    Хотя язык Java неразрывно связан с Интернетом, важно помнить, что, прежде всего, это язык программирования. Модернизация и разработка компьютерных языков обусловлены двумя основными причинами:
    • необходимостью адаптации к изменяющимся средами областям применения;
    • необходимостью реализации улучшений и усовершенствований в области программирования.
    Как будет показано в этой главе, разработка языка Java почтив равной мере была обусловлена обеими этими причинами.
    Происхождение языка Язык Java тесно связан с языком C++, который, в свою очередь, является прямым наследником языка С. Многие особенности языка Java унаследованы от обоих этих языков. От С язык Java унаследовал свой синтаксиса многие его объектно- ориентированные свойства были перенесены из C++. Собственно говоря, ряд определяющих характеристик Java был перенесен — или разработан в ответ на возникшие потребности — из его предшественников. Более того, создание языка
    Java своими корнями уходит глубоко в процесс усовершенствования и адаптации, который происходит в языках компьютерного программирования на протяжении нескольких последних десятилетий. Поэтому в данном разделе мы рассмотрим последовательность событий и факторы, которые привели к появлению языка Java. Как вы убедитесь, каждое новшество в архитектуре языка было обусловлено необходимостью решения той или иной фундаментальной проблемы, которую не могли решить существовавшие до этого языки. И Java — не исключение в этом отношении

    3 6 Часть I. Язык Зарождение современного программирования язык С
    Язык С буквально потряс компьютерный мир. Его влияние нельзя недооценивать, поскольку он полностью изменил подход к программированию. Создание языка Сбыло прямым следствием потребности в структурированном, эффективном и высокоуровневом языке, который мог бы заменить код ассемблера в процессе создания системных программ. Как вы, вероятно, знаете, при проектировании компьютерного языка часто приходится находить компромиссы
    • между простотой использования и предоставляемыми возможностями;
    • между безопасностью и эффективностью;
    • между устойчивостью и расширяемостью.
    До появления языка С программистам, как правило, приходилось выбирать между языками, которые позволяли оптимизировать тот или иной набор характеристик. Например, хотя FORTRAN можно было использовать при написании достаточно эффективных программ для научных приложений, он не очень подходил для создания системного кода. Аналогично, в то время как язык BASIC был очень прост в изучении, он предоставлял не очень многофункциональных возможностей, а его недостаточная структурированность ставила под сомнение его полезность при создании крупных программ. Язык ассемблера можно использовать для создания очень эффективных программно его трудно изучать и эффективно использовать. Более того, отладка ассемблерного кода может оказаться весьма сложно задачей.
    Еще одной сыгравшей свою роль проблемой было то, что ранние языки программирования, такие как BASIC, COBOL и FORTRAN, были спроектированы без учета принципов структурирования. Вместо этого в них основными средствами управления программой были операторы безусловного перехода
    GOTO. В результате программы, созданные с применением этих языков, тяготели к созданию так называемого макаронного кода — множества запутанных переходов и условных ветвей, которые делали программу буквально недоступной для понимания. Хотя такие языки как Pascal и структурированы, они небыли предназначены для создания максимально эффективных программ и были лишены рада важных функций, необходимых для применения этих языков к написанию широкого круга программ. В частности, учитывая существование нескольких стандартных диалектов Pascal, было нецелесообразно применять этот язык для создания кода системного уровня.)
    Таким образом, непосредственно накануне изобретения языка С, несмотря на затраченные усилия, ни одному языку не удалось решить существующие конфликты. Вместе стем потребность в таком языке становилась все более насущной. Вначале х гг. началась компьютерная революция, и потребность в программном обеспечении быстро превысила возможности программистов по его созданию. В академических кругах большие усилия были приложены к созданию более совершенного языка программирования. Однако, и это наиболее важно, все больше стало ощущаться влияние еще одного фактора. Компьютеры, наконец, получили достаточно широкое распространение, чтобы была достигнута критическая масса. Компьютеры больше не находились за запертыми дверями. Впервые программисты получили буквально неограниченный доступ к своим компьютерам. Это дало свободу экспериментам. Программисты смогли также приступить к созданию своих собственных программных средств. Накануне создания языка С произошел качественный скачок в области компьютерных языков.
    Изобретенный и впервые реализованный Деннисом Ритчи на компьютере
    DEC PDP-11, работающем под управлением операционной системы UNIX, язык С явился результатом процесса разработки, начавшегося с предшествующего языка
    Глава 1. История и развитие языка Java
    3 7
    BCPL, разработанного Мартином Ричардсом. BCPL повлиял на язык, получивший название В, который был изобретен Кеном Томпсоном ив начале х гг. привел к появлению языка СВ течение долгих лет фактическим стандартом языка Сбыла его версия, которая поставлялась с операционной системой UNIX (описана в книге Язык программирования С Брайана Кернигана и Денниса Ритчи (е издание,
    И.Д. “Вилямс”, 2007 г. Язык Сбыл формально стандартизован в декабре 1989 г, когда Национальный институт стандартизации США (American National Standards
    Institute — ANSI) принял стандарт С.
    Многие считают создание языка С началом современного этапа развития компьютерных языков. Он успешно объединил конфликтующие компоненты, которые доставляли столько неприятностей в предшествующих языках. Результатом явился мощный, эффективный, структурированный язык, изучение которого было сравнительно простым. Кроме того, ему была присуща еще одна, почти непостижимая особенность он был языком программиста. До появления С языки программирования проектировались, в основном, либо в качестве академических упражнений, либо бюрократическими организациями. Язык С — иное дело. Он был спроектирован, реализован и разработан действительно работающими программистами и отражал их подход к программированию. Его функции были отлажены, проверены и многократно переработаны людьми, которые действительно использовали этот язык. В результате появился язык, который нравилось использовать программистам. Действительно С быстро приобрел много приверженцев, которые почти молились на него. Поэтому язык С получил быстрое и широкое признание в программистском сообществе. Короче говоря, С — это язык, разработанный программистами и для программистов. Как вы вскоре убедитесь, язык Java унаследовал эту особенность.
    Следующий шаг язык В конце 70-х-начале х гг. язык С стал превалирующим компьютерным языком программирования, ион продолжает широко применяться ив настоящее время. Поскольку С — удачный и удобный язык, может возникнуть вопрос, чем обусловлена потребность в чем-либо еще. Ответ растущей сложностью На протяжении всей истории развития программирования всевозрастающая сложность программ порождала потребность в более совершенных способах преодоления этой сложности. Язык C++ явился ответом на эту потребность. Чтобы лучше понять, почему потребность преодоления сложности программ является главной побудительной причиной создания языка C++, рассмотрим следующие факторы.
    С момента изобретения компьютеров подходы к программированию коренным образом изменились. Например, когда компьютеры только появились, программирование осуществлялось изменением двоичных машинных инструкций вручную с панели управления компьютера. До тех пор, пока длина программ не превышала нескольких сотен инструкций, этот подход был вполне приемлем. С увеличением программ был изобретен язык ассемблера, который позволил программисту работать с большими, все более сложными программами, используя при этом символьные представления машинных инструкций. По мере того, как программы продолжали увеличиваться в объеме, появились языки высокого уровня, которые предоставили программисту дополнительные средства преодоления сложности программ.
    Первым языком программирования, который получил широкое распространение, был, конечно же, FORTRAN. Хотя этот языки явился первым впечатляющим шагом, его вряд ли можно считать языком, который способствует созданию четких и легких для понимания программе гг. знаменовались рождением структурного программирования Этот метод программирования наиболее ярко проявился в таких языках, как С. Использование структурированных языков впервые

    3 Часть I. Язык предоставило программистам возможность достаточно легко создавать программы средней сложности. Однако даже при использовании методов структурного программирования по достижении проектом определенного размера его сложность начинала превышать ту, с которой программист мог справиться. К началу х гг. сложность многих проектов начала превышать ту, с которой можно было справиться с использованием структурного подхода. Для решения этой проблемы был изобретен новый способ программирования, получивший название объектно ориентированного программирования (ООП). Объектно-ориентированное программирование подробно рассматривается в последующих главах этой книги, номы все же приведем краткое определение ООП — это методология программирования, которая помогает организовывать сложные программы за счет использования наследования, инкапсуляции и полиморфизма.
    Подведем итоги сказанному. Хотя С — один из основных мировых языков программирования, существует предел его способности справляться со сложностью программ. Как только размеры программы превышают определенное значение, она становится слишком сложной, чтобы ее можно было охватить как единое целое. Хотя точное значение этого предела зависит как от структуры самой программы, таки от подходов, используемых программистом, начиная с определенного момента любая программа становится слишком сложной для понимания и внесения изменений. Язык C++ предоставил возможности, которые позволили программисту преодолевать этот барьер, чтобы контролировать большие по размеру программы и управлять ими.
    Язык C++ был изобретен Бьярне Страуструпом в 1979 г. вовремя его работы в компании Bell Laboratories в городе Мюррей-Хилл, шт. Нью-Джерси. Вначале Страуструп назвал новый язык С with Classes” (С с классами. Однако в 1983 г. это название было изменено на C++. Язык C++ расширяет функциональные возможности языка С, добавляя в него объектно-ориентированные свойства. Поскольку язык C++ построен на основе Сон поддерживает все его возможности, атрибуты и преимущества. Это обстоятельство явилось главной причиной успешного распространения C++ в качестве языка программирования. Изобретение языка C++ не было попыткой создания совершенно нового языка программирования. Напротив, все усилия были направлены на усовершенствование уже существующего очень удачного языка.
    Предпосылки создания языка К концу 80-х-началу х гг. объектно-ориентированное программирование с применением языка C++ стало основным методом программирования. Действительно, в течение некоторого непродолжительного времени казалось, что программисты, наконец, изобрели идеальный язык. Поскольку язык C++ сочетал в себе высокую эффективность и стилистические элементы языка С с объектно- ориентированным подходом, этот язык можно было использовать для создания самого широкого круга программ. Однако, как ив прошлом, уже вызревали факторы, которые должны были, в который раз, стимулировать развитие компьютерных языков. Пройдет еще несколько лети и Интернет достигнут критической массы. Это приведет к еще одной революции в программировании.
    Создание языка Начало разработке языка Java было положено в 1991 г. Джеймсом Гослингом
    (James Gosling), Патриком Нотоном (Patrick N aughton), Крисом Вартом (Chris
    Глава 1. История и развитие языка Java
    3 9
    W arth), Эдом Франком (Ed Frank) и Майком Ш ериданом (Mike Sheridan), работавшими в компании Sun Microsystems, Inc. Разработка первой работающей версии заняла 18 месяцев. Вначале язык получил название “Oak” (Дуб, нов гон был переименован в “Java”. Между первой реализацией языка Oak в конце 1992 г. и публичным объявлением о создании Java весной 1995 г. множество других людей приняли участие в проектировании и развитии этого языка. Билл Джой (Bill
    Joy), Артур ван Хофф (Arthur van Hoff), Джонатан Пэйн (Jonathan Payne), Франк
    Иеллин (Frank Yellin) и Тим Линдхольм (Tim Lindholm ) внесли основной вклад в развитие исходного прототипа.
    Как ни странно, первоначальной побудительной причиной создания языка Java послужил вовсе не Интернет Основная причина — потребность в независящем от платформы (те. архитектурно нейтральном) языке, который можно было бы использовать для создания программного обеспечения, встраиваемого в различные бытовые электронные устройства, такие как микроволновые печи и устройства дистанционного управления. Как ни трудно догадаться, в качестве контроллеров используется множество различных типов процессоров. Проблема применения языков Си+ (как и большинства других языков) состоит в том, что написанные на них программы должны компилироваться для конкретной платформы. Хотя программы C++ могут быть скомпилированы практически для любого типа процессора, для этого требуется наличие полного компилятора C++, предназначенного для данного процессора. Проблема в том, что создание компиляторов обходится дорого и требует значительного времени. Поэтому требовалось более простое и экономически выгодное решение. Пытаясь найти такое решение, Гослинг и другие начали работу над переносимым, независящим от платформы языком, который можно было бы использовать для создания кода, пригодного для выполнения на различных процессорах в различных средах. Вскоре эти усилия привели к созданию языка Примерно в тоже время, когда определялись основные характеристики языка
    Java, на сцену выступил второй, несомненно, более важный фактор, который должен был сыграть решающую роль в судьбе этого языка. Конечно же, этим вторым фактором была World Wide Web. Если бы формирование веб не происходило почти одновременно с реализацией Java, этот язык мог бы остаться полезным, но незамеченным языком программирования бытовых электронных устройств. Нос появлением World Wide Web язык Java вышел на передний рубеж проектирования компьютерных языков, поскольку веб также нуждался в переносимых программах.
    Еще на заре своей карьеры большинство программистов твердо усвоили, что переносимые программы столь же недостижимы, сколь и желанны. В то время как потребность в средстве создания эффективных, переносимых (независящих от платформы) программ была почти столь же стара, как и сама отрасль программирования, она отодвигалась на задний план другими, более насущными, проблемами. Более того, поскольку большая часть самого мира компьютеров была разделена натри конкурирующих лагеря Intel, Microsoft и UNIX, большинство программистов оставались запертыми в своих аппаратно-программных твердынях, что несколько снижало потребность в переносимом коде. Тем не менее с появлением Интернета и веб старая проблема переносимости снова возникла с еще большей актуальностью. В конце концов, Интернет представляет собой разнообразную и распределенную вселенную, заполненную множеством различных типов компьютеров, операционных систем и процессоров. Несмотря на то что к Интернету подключено множество типов платформ, пользователям желательно, чтобы все они могли выполнять одинаковые программы. То, что вначале было неприятной, ноне слишком насущной проблемой, превратилось в потребность первостепенной важности
    до Часть I. Язык Кг. членам группы проектирования Java стало очевидно, что проблемы переносимости, часто возникающие при создании кода, предназначенного для встраивания в контроллеры, возникают также и при попытках создания кода для Интернета. Фактически та же проблема, для решения которой в малом масштабе предназначался язык Java, в большем масштабе была актуальна ив среде Интернета. Понимание этого обстоятельства вынудило разработчиков языка
    Java перенести свое внимание сбытовой электроники на программирование для Интернета. Таким образом, хотя потребность в архитектурно нейтральном языке программирования послужила своего рода начальной искрой, Интернет обеспечил крупномасштабный успех Как уже упоминалось, язык Java наследует многие из своих характеристик от языков Си. Это сделано намеренно. Разработчики Java знали, что использование знакомого синтаксиса Си повторение объектно-ориентированных свойств C++ должно было сделать их язык привлекательным для миллионов опытных программистов на С / C++. Помимо внешнего сходства, язык Java использует ряд других атрибутов, которые способствовали успеху языков Си. Во-первых, язык Java был спроектирован, проверен и усовершенствован настоящими работающими программистами. Этот язык построен с учетом потребностей и опыта людей, которые его создали. Таким образом, Java — это язык программистов. Во-вторых, Java целостен и логически непротиворечив. В-третьих, если не учитывать ограничения, накладываемые средой Интернета, Java предоставляет программисту полный контроль над программой. Если программирование выполняется правильно, это непосредственно отражается в программах. В равной степени справедливо и обратное. Иначе говоря, Java не является языком тренажера. Это язык профессиональных программистов.
    Из-за сходства характеристик языков Java и С, кое-кто склонен считать Java просто версией языка C++ для Интернета. Однако это серьезное заблуждение. Язык присущи значительные практические и концептуальные отличия. Хотя и верно, что язык C++ оказал влияние на характеристики языка Java, последний не является усовершенствованной версией C++. Например, Java не обладает совместимостью с C++. Конечно, сходство с языком C++ значительно, ив программе
    Java программист C++ будет чувствовать себя как дома. Вместе стем не предназначен служить заменой C++. Язык Java предназначен для решения одного набора проблема для решения другого. Еще длительное время оба эти языка неизбежно будут сосуществовать.
    Как было отмечено вначале этой главы, развитие компьютерных языков обусловлено двумя причинами необходимостью адаптации к изменениям в среде и необходимостью реализации новых идей в области программирования. Изменением среды, которое обусловило потребность в языке, подобном Java, была потребность в независящих от платформы программах, предназначенных для распространения в Интернете. Однако Java изменяет также подход к написанию программ. В частности, Java углубили усовершенствовал объектно-ориентированный подход, использованный в C++, добавил в него поддержку многопоточной обработки и предоставил библиотеку, которая упростила доступ к Интернету. Однако столь поразительный успех Java обусловлен не теми или иными его отдельными особенностями, а их совокупностью как языка в целом. Он явился прекрасным ответом на потребности в то время лишь зарождающейся среды в высшей степени распределенных компьютерных систем. В области разработки программ для Интернета язык Java стал тем, чем язык Сбыл для системного программирования революционной силой, которая изменила мир
    Глава 1. История и развитие языка Java
    4 Связь с языком C Многообразие и большие возможности языка Java продолжают оказывать влияние на всю разработку компьютерных языков. Многие из его новаторских характеристик, конструкций и концепций становятся неотъемлемой частью фундамента любого нового языка. Просто успех Java слишком значителен, чтобы его можно было игнорировать.
    Вероятно, наиболее наглядным примером влияния языка Java на программирование служит язык С. Созданный в компании Microsoft для поддержки инфраструктуры .NET Framework, язык C# тесно связан с Java. Например, оба эти языка используют одинаковый общий синтаксис, поддерживают распределенное программирование и работают с одной и той же объектной моделью. Конечно, между
    Java и C# существует рад различий, нов целом эти языки выглядят очень похожими. На сегодняшний день это перекрестное опыление между Java и C# — наилучшее доказательство того, что язык Java коренным образом изменил представление о компьютерных языках и их применении.
    Как язык Java изменил Интернет
    И нтернет способствовал выдвижению языка Java на передовые рубежи программирования, а язык Java, в свою очередь, оказал сильнейшее влияние на Интернет. Кроме того, что язык Java упростил создание программ для Интернета в целом, он привел к появлению нового типа предназначенных для работы все тях программ, получивших название аплетов, которые изменили понятие содержимого для сетевой среды. Кроме того, язык Java позволил решить две наиболее острые проблемы программирования, связанные с Интернетом, — переносимость и безопасность. Рассмотрим каждую из этих проблем.
    Аплеты Java
    Аплет — это особый вид программы Java, предназначенный для передачи по Интернету и автоматического выполнения совместимым с Java веб-браузером. Более того, аплет загружается по требованию, без необходимости дальнейшего взаимодействия с пользователем. Если пользователь щелкает на ссылке, которая содержит аплет, он автоматически загружается и запускается в браузере. Аплеты создаются в виде небольших программ. Как правило, они используются для отображения данных, предоставляемых сервером, обработки действий пользователя или выполнения простых функций, таких как вычисление процентов по кредитам, которые выполняются локально, а не на сервере. По сути, аплет позволяет перенести ряд функций с сервера на клиент.
    Появление аплетов изменило программирование приложений Интернета, поскольку они расширили совокупность объектов, которые можно свободно перемещать по киберпространству. Если говорить в целом, между сервером и клиентом передаются две большие категории объектов пассивная информация иди намические, активные, программы. Например, чтение сообщений электронной почты подразумевает просмотр пассивных данных. Даже при загрузке программы ее код — пассивные данные, которые остаются таковыми, вплоть до момента выполнения. И напротив, аплет представляет собой динамическую, автоматически выполняющуюся программу. Такая программа является активным агентом на клиентском компьютере, хотя она и инициируется сервером

    4 2 Часть I. Язык Насколько желательно, чтобы программы были динамическими, как это имеет место при использовании сетевых программ, настолько же они представляют серьезные проблемы сточки зрения безопасности и переносимости. Очевидно, что компьютер клиента необходимо обезопасить от нанесения ему ущерба программой, которая загружается в него, а затем автоматически запускается. Кроме того, такая программа должна быть способна выполняться в различных аппаратных средах и под управлением различных операционных систем. Как читатели вскоре убедятся, язык Java решает эти проблемы эффективно и элегантно. Рассмотрим их под­
    робнее.
    Безопасность
    Как, вероятно, известно читателям, каждая загрузка обычной программы сопряжена с риском, поскольку загружаемый код может содержать вирус, троянского коня или вредоносный код. Корень проблемы в том, что вредоносный код может выполнить свое черное дело, поскольку получает несанкционированный доступ к системным ресурсам. Например, просматривая содержимое локальной файловой системы компьютера, программа вируса может собирать конфиденциальную информацию, такую как номера кредитных карточек, сведения о состоянии банковских счетов и пароли. Для обеспечения безопасности загрузки ивы полнения аплетов Java на компьютере клиента было необходимо воспрепятствовать аплетам предпринимать подобные атаки обеспечивает эту защиту, заключая аплет в среду исполнения Java и не предоставляя ему доступ к другим частям операционной системы компьютера. (Способы достижения этого рассматриваются в последующих разделах) Возможность загрузки аплетов с сохранением при этом уверенности в невозможности нанесения вреда системе и нарушения системы безопасности многие эксперты и пользователи считают наиболее новаторским аспектом Java.
    Переносимость
    Переносимость — основная особенность Интернета, поскольку эта глобальная сеть соединяет множество различных типов компьютеров и операционных систем. Чтобы программа Java могла выполняться буквально на любом компьютере, подключенном к Интернету, требовался метод обеспечения выполнения этой программы в различных системах. Например, применительно к аплету это означает, что один и тот же аплет должен иметь возможность загружаться и выполняться наши роком множестве процессоров, операционных систем и браузеров, подключенных к Интернету. Создание различных версий аплетов для различных компьютеров совершенно нерационально. Один и тот же код должен работать на всех компьютерах. Поэтому требовался какой-то механизм для создания переносимого выполняемого кода. Как вы вскоре убедитесь, тот же механизм, который способствует обеспечению безопасности, способствует также созданию переносимых программ.
    Магия Java: код виртуальной машины
    Основная особенность, которая позволяет языку Java решать описанные проблемы обеспечения безопасности и переносимости программ, состоит в том, что вывод компилятора Java не является исполняемым кодом. Скорее, он представляет собой так называемый код виртуальной машины. Код виртуальной машины (by­
    Глава 1. История и развитие языка Java
    4 3
    tecode) — это в высшей степени оптимизированный набор инструкций, предназначенных для исполнения системой времени выполнения Java, называемой виртуальной машиной Java
    (Java Virtual Machine — JVM). Собственно говоря, первоначальная версия JVM разрабатывалась в качестве интерпретатора кода виртуальной машины Это может вызывать определенное удивление, поскольку по соображениям обеспечения максимальной производительности многие современные языки призваны создавать исполняемый код.
    Однако то, что программа Java интерпретируется машиной JVM, помогает решать основные проблемы, связанные с программами, предназначенными для веб. И вот почему.
    Трансляция программы Java в код виртуальной машины значительно упрощает ее выполнение в широком множестве сред, поскольку на каждой платформе необходимо реализовать только JVM. Как только в данной системе появляется пакет времени выполнения, в ней можно исполнять любую программу Java. Следует помнить, что хотя на разных платформах особенности реализации машины JVM могут быть различными, все они могут выполнять обработку одного итого же кода виртуальной машины. Если бы программа Java компилировалась в машинозави­
    симый код, для каждого типа процессоров, подключенных к Интернету, должны были бы существовать отдельные версии одной и той же программы. Понятно, что такое решение неприемлемо. Таким образом, выполнение кода виртуальной машины машиной JVM — простейший способ создания действительно переносимых программ.
    То, что программа Java выполняется машиной JVM, способствует также повышению ее безопасности. Поскольку машина управляет выполнением программы, она может изолировать программу и воспрепятствовать порождению ею побочных эффектов вне данной системы. Как вы убедитесь, ряд ограничений, существующих в языке Java, также способствует повышению безопасности.
    В общем случае, когда программа компилируется в промежуточную форму, а затем интерпретируется виртуальной машиной, она выполняется медленнее, чем если бы она была скомпилирована в исполняемый код. Однако при использовании языка Java различие в производительности не слишком велико. Поскольку код виртуальной машины в высокой степени оптимизирован, его применение позволяет машине JVM выполнять программы значительно быстрее, чем можно было ожидать.
    Хотя язык Java был задуман в качестве интерпретируемого языка, ничто не препятствует ему выполнять компиляцию кода виртуальной машины в машинозави­
    симый код налету для повышения производительности. Поэтому вскоре после выпуска Java появилась технология HotSpot. Эта технология предоставляет оперативный компилятор (Justin-Time — JIT) кода виртуальной машины. Когда JIT - компилятор является составной частью машины JVM, избранные фрагменты кода виртуальной машины один за другим компилируются в исполняемый код в реальном времени, по соответствующим запросам. Важно понимать, что одновременная компиляция всей программы Java в исполняемый код нецелесообразна, поскольку Java выполняет различные проверки, которые могут быть осуществлены только вовремя выполнения. Вместо этого вовремя работы JIT -компилятор компилирует код по мере необходимости. Более того, компилируются не все фрагменты кода виртуальной машины, а только те, которым компиляция принесет выгоду. Остальной код просто интерпретируется. Однако подход JIT -компиляции все же обеспечивает значительное повышение производительности. Даже в случае применения к коду виртуальной машины динамической компиляции, характеристики переносимости и безопасности сохраняются, поскольку машина по-прежнему отвечает за целостность среды исполнения

    4 4 Часть I. Язык Java
    Сервлеты: серверные программы Как ни полезны аплеты, они — всего лишь половина системы клиент сервер. Вскоре после появления языка Java стало очевидно, что он может пригодиться и на серверах. В результате появились сервлеты (servlet). Сервлет — это небольшая программа, выполняемая на сервере. Подобно тому как аплеты динамически расширяют функциональные возможности веб-браузера, сервлеты динамически расширяют функциональные возможности веб-сервера. Таким образом, с появлением сервлетов язык Java распространился на оба конца соединения клиент сер в ер ”.
    Сервлеты служат для создания динамически генерируемого содержимого, которое затем обслуживает клиента. Например, интерактивный склад может использовать сервлет для поиска стоимости товара в базе данных. Затем информация о цене используется для динамического создания веб-страницы, отправляемой браузеру. Хотя динамически создаваемое содержимое доступно также при помощи таких механизмов, как CGI (Common Gateway Interface — общий шлюзовой интерфейс, серв­
    лет обеспечивает ряд преимуществ, в том числе — повышение производительности.
    Поскольку сервлеты (подобно всем программам Java) компилируются в код виртуальной машины и выполняются машиной JVM, они в высшей степени переносимы. Следовательно, один и тот же сервлет может применяться в различных серверных средах. Единственные необходимые условия для этого — поддержка сервером машины JVM и контейнера сервлета.
    Терминология, связанная с Рассмотрение истории создания и развития языка Java было бы неполным без описания специфичной терминологии Java. Основные факторы, обусловившие изобретение Java, — необходимость обеспечения переносимости и безопасности, однако другие факторы также сыграли свою роль в формировании окончательной версии языка. Группа разработки Java обобщила основные понятия в следующем перечне терминов:
    • простота;
    • безопасность;
    • переносимость;
    • объектная ориентированность;
    • устойчивость;
    • многопоточность;
    • архитектурная нейтральность;
    • интерпретируемость;
    • высокая производительность;
    • распределенный характер;
    • динамический характер.
    Мы уже рассмотрели такие термины, как безопасность и переносимость. А теперь представим значения остальных терминов
    Глава 1. История и развитие языка Java
    4 Простота был задуман в качестве простого в изучении и эффективного в использовании профессиональными программистами языка. Для тех, кто обладает определенным опытом программирования, овладение языком Java не представит особой сложности. Если же вы уже знакомы с базовыми концепциями объектно-ориентированного программирования, изучение Java будет еще проще. А для опытного программиста на
    C++ переход к Java вообще потребует минимум усилий. Поскольку Java наследует синтаксис C/C++ и многие объектно-ориентированные свойства C++, для большинства программистов изучение Java не представит сложности.
    Объектная ориентированность
    Хотя предшественники языка Java и оказали влияние на его архитектуру и синтаксис, при его проектировании не ставилась задача совместимости по исходному коду с каким-либо другим языком. Это позволило группе разработки Java выполнять проектирование, что называется, с чистого листа. Одним из следствий этого явился четкий, практичный, прагматичный подход к объектам. Притом что Java позаимствовал свойства многих удачных объектно-программных сред, разработанных на протяжении нескольких последних десятилетий, в нем удалось достичь баланса между строгим соблюдением концепции все компоненты программы — объекты и более прагматичной моделью прочь с дороги. Объектная модель Java проста и легко расширяема. В тоже время элементарные типы, такие как целые числа, сохраняются в виде высокопроизводительных компонентов, не являющихся объектами.
    Устойчивость
    Многоплатформенная среда веб предъявляет к программам повышенные требования, поскольку они должны надежно выполняться в разнообразных системах. Поэтому способность создавать устойчивые программы была одним из главных приоритетов при проектировании Java. Для обеспечения надежности Java накладывает ряд ограничений в нескольких наиболее важных областях, что вынуждает программиста выявлять ошибки на ранних этапах разработки программы. В тоже время Java избавляет от беспокойства по поводу многих наиболее часто встречающихся ошибок программирования. Поскольку Java — строго типизированный язык, проверка кода выполняется вовремя компиляции. Однако проверка кода осуществляется и вовремя выполнения. В результате многие трудно обнаруживаемые программные ошибки, которые часто ведут к возникновению трудно воспроизводимых ситуаций времени выполнения, в программе Java попросту невозможны. Предсказуемость кода в различных ситуациях — одна из основных особенностей Чтобы понять, как достигается устойчивость программ Java, рассмотрим две основные причины программных сбоев ошибки управления памятью и неправильная обработка исключений (те. ошибки времени выполнения. В традиционных средах создания программ управление памятью — сложная и трудоемкая задача. Например, в среде C/C++ программист должен вручную резервировать и освобождать всю динамически распределяемую память. Иногда это ведет к возникновению проблем, поскольку программисты либо забывают освободить ранее зарезервированную память, либо, что еще хуже, пытаются освободить участок памяти, все еще используемый другой частью кода. Java полностью исключает такие ситуации, автоматически управляя резервированием и освобождением памяти. Фактически освобождение выполняется полностью автоматически, поскольку

    4 6 Часть I. Язык Java
    Java предоставляет функцию сбора мусора в отношении неиспользуемых объектов) В традиционных средах условия исключений часто возникают в таких ситуациях, как деление на нуль или файл не найден, и управление ими должно осуществляться с помощью громоздких и трудных для понимания конструкций. Java облегчает выполнение этой задачи, предлагая объектно-ориентированный механизм обработки исключений. В хорошо написанной программе Java все ошибки времени выполнения могут — и должны — управляться самой программой.
    Многопоточность
    Язык Java был разработан в ответ на потребность создания интерактивных сетевых программ. Для достижения этой цели Java поддерживает написание много­
    поточных программ, которые могут одновременно выполнять много действий. Система времени выполнения Java содержит изящное, но вместе стем сложное решение задачи синхронизации множества процессов, которое позволяет создавать действующие без перебоев интерактивные системы. Простой в применении подход к организации многопоточной обработки, реализованный в Java, позволяет программисту сосредоточивать свое внимание на конкретном поведении программы, а не на создании многозадачной подсистемы.
    Архитектурная нейтральность
    Основной задачей, которую ставили перед собой разработчики Java, было обеспечение долговечности и переносимости кода. Одной из главных проблем, стоявших перед программистами вовремя создания языка Java, было отсутствие гарантий того, что код, созданный сегодня, будет успешно выполняться завтра, даже на том же самом компьютере. Операционные системы и процессоры модернизируются, а все изменения в основных системных ресурсах могут приводить к неработоспособности программ. Пытаясь изменить эту ситуацию, проектировщики приняли ряд жестких решений в языке Java и виртуальной машине Java. Они поставили перед собой цель, чтобы программы создавались лишь однажды, в любой среде, в любое время и навсегда. В значительной степени эта цель была достигнута.
    Интерпретируемость и высокая производительность
    Как уже говорилось, выполняя компиляцию программ в промежуточное представление, называемое кодом виртуальной машины, Java позволяет создавать мно­
    гоплатформенные программы. Этот код может выполняться в любой системе, которая реализует виртуальную машину Java. Самые первые попытки получения много­
    платформенных решений привели к достижению поставленной цели за счет снижения производительности. Как пояснялось ранее, код виртуальной машины Java был тщательно спроектирован так, чтобы за счет использования JIT -компиляции его можно было с высокой производительностью легко преобразовывать в маши­
    нозависимый код. Системы времени выполнения Java, которые предоставляют эту функцию, сохраняют все преимущества кода, независящего от платформы.
    Распределенный характер
    Язык Java предназначен для распределенной среды Интернет, поскольку он поддерживает протоколы семейства TC P/IP. Фактически обращение к ресурсу че­
    Глава 1. История и развитие языка Java
    4 рез адрес URL не очень отличается от обращения к файлу. Java поддерживает также дистанционный вызов методов (Remote M ethod Invocation — RMI). Это свойство позволяет программам вызывать методы по сети.
    Динам ический характер
    Программы Java содержат значительный объем информации времени выполнения, которая используется для проверки полномочий и предоставления доступа к объектам вовремя выполнения. Это позволяет выполнять безопасное и технически оправданное динамическое связывание кода. Это обстоятельство исключительно важно для устойчивости среды Java, в которой небольшие фрагменты кода виртуальной машины могут динамически обновляться в действующей системе.
    Эволюция языка Первоначальная версия Java не содержала никаких особо революционных решений, но она не ознаменовала собой завершение эры быстрого совершенствования этого языка.
    В отличие от большинства других систем программирования, совершенствование которых происходило небольшими, последовательными шагами, язык Java продолжает стремительно развиваться. Уже вскоре после выпуска версии Java 1.0 разработчики создали версию Java 1.1. Добавленные в эту версию функциональные возможности значительно превосходили те, которые можно было ожидать, судя по изменению младшего номера версии. Разработчики добавили много новых библиотечных элементов, переопределили способ обработки событий и изменили конфигурацию многих свойств библиотеки версии 1.0. Кроме того, они отказались от нескольких свойств (признанных устаревшими, которые первоначально были определены в Java 1.0. Таким образом, в версии Java 1.1 были как добавлены новые атрибуты, таки удалены некоторые, определенные в первоначальной спецификации.
    Следующей базовой версией Java стала версия Java 2, где “2” означает второе поколение. Создание Java 2 явилось знаменательным событием, означавшим начало современной эры ” Java. Первой версии Java 2 был присвоен номер 1.2. Это может казаться несколько странным. Дело в том, что вначале номер относился к внутреннему номеру версии библиотек Java, но затем он был распространен на всю версию в целом. С появлением версии Java 2 компания Sun начала выпускать программное обеспечение Java в виде пакета J2SE (Java 2 Platform Standard Edition — Стандартная версия платформы Java 2), и теперь номера версий применяются к этому продукту.
    В Java 2 была добавлена поддержка ряда новых средств, таких как Swing и Collections Framework. Кроме того, были усовершенствованы виртуальная ма- iimHaJava и различные средства программирования. Из Java 2 был исключен также ряд свойств. Наибольшие изменения претерпел класс потока
    Thread, в котором методы suspend (), resume (
    ) и stop (
    ) были представлены как устаревшие.
    Версия J2SE 1.3 была первой серьезной модернизацией первоначальной версии Java J2SE. В основном, модернизация заключалась в расширении существующих функциональных возможностей и уплотнении среды разработки. В общем случае программы, написанные для версий 1.2 и 1.3, совместимы по исходному коду. Хотя версия 1.3 содержала меньший набор изменений, чем три предшествующие базовые версии, это не делало ее менее важной.
    Версия J2SE 1.4 продолжила совершенствование языка Java. Эта версия содержала несколько важных модернизаций, усовершенствований и добавлений

    4 8 Часть I. Язык Например, в нее было добавлено новое ключевое слово a s s e r t , цепочки исключений и подсистема ввода-вывода на основе каналов. Изменения были внесены ив инфраструктуру Collections Framework, и сетевые классы. Эта версия содержала также множество небольших изменений. Несмотря на значительное количество новых функциональных возможностей, версия 1.4 сохранила почти стопроцентную совместимость по исходному коду с предшествующими версиями.
    В следующей версии Java, именуемой J2SE 5, был внесен ряд революционных изменений. В отличие от большинства предшествующих модернизаций Java, которые предоставляли важные, но постепенные усовершенствования, J2SE 5 коренным образом расширяет область применения, возможности и диапазон языка. Чтобы оценить объем изменений, внесенных в язык Java в версии J2SE 5, ознакомьтесь с перечнем основных новых функциональных возможностей:
    • обобщения;
    • аннотации;
    • автоупаковка и автораспаковка;
    • перечисления;
    • усовершенствованный, поддерживающий стиль f o r - e a c h , цикл f o r список аргументов переменной длины (статический импорт;
    • форматированный ввод-вывод;
    • утилиты параллельной обработки.
    В этом перечне не указаны незначительные изменения или постепенные усовершенствования. Каждый пункт перечня представлял значительное добавление в языке Java. Одни из них, такие как обобщения, усовершенствованный цикли список аргументов переменной длины, представляли новые синтаксические элементы. Другие, такие как автоупаковка и автораспаковка, изменяли семантику языка. Аннотации внесли в программирование совершенно новое измерение. В любом случае влияние всех этих добавлений вышло за рамки их прямого эффекта. Они полностью изменили сам характер языка Важность новых функциональных возможностей нашла отражение в примененном номере версии — “5”. Если следовать привычной логике, следующим номером версии Java должен был быть 1.5. Однако новые свойства столь значительны, что переход от версии 1.4 к версии 1.5 не отражал бы масштаб внесенных изменений. Поэтому, чтобы подчеркнуть значимость этого события, в компании Sun решили присвоить новой версии номер 5. Поэтому версия продукта была названа
    J2SE 5, а комплект разработчика — JDK 5. Тем не менее для сохранения единообразия в компании Sun решили использовать номер 1.5 в качестве внутреннего номера версии, называемого также номером версии разработки.
    Цифру 5 в обозначении версии называют номером версии продукта

    Следующая версия Java получила название SE 6. С выходом этой версии компания Sun решила в очередной раз изменить название платформы Java. В названии была опущена цифра. Таким образом, теперь платформа называется Java
    SE, а официальное название продукта —Java Platform, Standard Edition 6 (Платформа
    Java, стандартная версия 6). Комплект разработчика Java был назван JDK 6. Как ив обозначении версии J2SE 5, цифра в названии Java SE 6 означает номер версии продукта. Внутренним номером разработки этой версии является 1.6.
    Глава 1. История и развитие языка Д Версия Java SE 6 была построена на основе версии J2SE 5 с рядом дальнейших усовершенствований. Она не содержала дополнений к числу основных функций языка Java, но расширяла библиотеки API, добавляя несколько новых пакетов и предоставляя рад усовершенствований времени выполнения. Было сделано еще несколько модификаций и внесено несколько дополнений. В целом версия Java SE
    6 призвана закрепить достижения, полученные в J2SE 5.
    Java SE Новейший выпуск Java, Java SE 7, с комплектом разработчика Java JDK 7 и внутренним номером версии 1.7 — первый главный выпуск Java от Sun Microsystems, который был приобретен Oracle (процесс начался в апреле 2009 года и завершился в январе 2010 года. Java SE 7 содержит много новых средств, включая существенные дополнения языка и библиотек API. Усовершенствована система исполнения программ Java, включена также поддержка языков, отличных от Java, но программистам Java больше интересны дополнения в области языка и библиотек.
    П роект Project Coin должен объединить множество небольших изменений языка Java, которые будут включены в JDK 7. Хотя все эти новые средства вместе называют небольшими, эффект этих изменений весьма велик сточки зрения кода, на который они воздействуют. Фактически для большинства программистов эти изменения могут стать самой важной новой возможностью Java SE 7. Вот список новых средств языка.
    • Тип
    String теперь может контролировать оператор Бинарные целочисленные литералы.
    • Символы подчеркивания в числовых литералах.
    • Расширенный оператор try, называемый try
    - с - ресурсами обеспечивающий автоматическое управление ресурсами. (Например, потоки теперь могут быть закрыты автоматически, когда они больше не нужны.)
    • Выведение типов (при помощи оператора о ) при создании экземпляра обобщения.
    • Улучшенная обработка исключений, при которой два или больше исключений могут быть обработаны одним блоком catch
    (мультиобработчиком), и лучший контроль соответствия типов повторно передаваемых исключений.
    • Хотя синтаксис не изменился, предупреждения компилятора, связанные сне которыми типами методов и переменным количеством аргументов, были улучшены. Кроме того, вы получаете больше контроля над предупреждениями.
    Как можно заметить, даже притом что средства Project Coin считаются небольшими изменениями языка, их преимуществ, в целом, намного больше, чем подразумевает слово небольшой. В частности оператор try-с-ресурсами существенно влияет на способ создания кода, ориентированного на потоки. Кроме того, способность использовать строки в операторе switch является долгожданным усовершенствованием, которое упростит код во многих ситуациях.
    В Java SE 7 внесено несколько дополнений в библиотеку API Java. Важнейшими из них являются усовершенствования NIO Framework и дополнения для F o rk /
    Join Framework. NIO (первоначально именуемый как New I/O ) был добавлен кв версии 1.4. Однако изменения, предложенные в Java SE 7, существенно увеличили его возможности. Причем настолько существенно, что зачастую используется термин N10.2.

    5 0 Часть I. Язык Инфраструктура F o rk /Jo in Framework оказывает существенную поддержку для параллельного программирования (parallel program m ing). Параллельное программирование — это термин, используемый обычно для описания технологий, повышающих эффективность использования компьютеров с несколькими процессорами, включая многоядерные системы. Преимущества, предлагаемые многоядерными системами, способны в перспективе существенно увеличить производительность программ. Инфраструктура F o rk /Jo in Framework обеспечивает параллельное Программирование в таких областях, как
    • упрощение создания и использования задач, способных выполняться одно­
    временно;
    • автоматическое использование нескольких процессоров.
    Следовательно, используя инфраструктуру F o rk /Jo in Framework, вы можете создавать приложения, которые автоматически используют процессоры, доступные в среде исполнения. Конечно, не все алгоритмы являются параллельными, но для остальных может быть получено существенное преимущество вскорости выполнения.
    Материал этой книги был изменен так, чтобы отразить возможности Java SE 7 со всеми новыми средствами, модификациями и дополнениями, обозначенными повсюду.
    Культура инновации
    С самого начала язык Java оказался в центре культуры инновации. Его первоначальная версия изменила подход к программированию для Интернета. Виртуальная машина Java (JVM) и код виртуальной машины изменили представление о безопасности и переносимости. Аллет (а затем и сервлет) вдохнули жизнь в веб. Процесс Java Community Process (JCP) изменил способ ассимиляции новых идей в языке. Поскольку язык Java используется для программного обеспечения
    Android, он стал частью революции смартфонов. Никогда мир языка Java не оставался неизменным в течение длительного времени. На момент подготовки этого издания версия Java SE 7 являлась самой новой в непрекращающемся динамичном развитии языка Java.

    1   2   3   4   5   6   7   8   9   ...   90


    написать администратору сайта