Язык Java. Введение.
Долгое время трудно было представить себе компьютерный журнал без
статьи, посвященной языку Java. О нем писали даже такие популярные
газеты и журналы, как The New York Times, The Washington Post и Business
Week.
Невозможно припомнить, чтобы национальное общественное радио
(National Public Radio) когда-либо посвящало языку программирования
десятиминутную передачу. Хорошо это или плохо, зависит от точки зрения. А
инвестиции объемом 100 миллионов долларов, вложенные в производство
программного обеспечения, создаваемого с помощью конкретного языка
программирования?! Телекомпании CNN, CNBC и другие средства массовой
информации только и говорили, да и сейчас говорят, о том, как язык Java
и то сможет, и это сделает. Однако эта книга
предназначена для серьезных программистов, а поскольку язык Java — это
серьезный язык программирования, нам есть о чем рассказать. Итак, мы не
станем погружаться в анализ рекламных обещаний и пытаться выяснить,
что в них правда, а что вымысел. Вместо этого мы достаточно подробно
опишем язык Java именно как язык программирования (включая, разумеется,
особенности, позволяющие использовать его для работы в Интернет,
которые, собственно, и вызвали столько рекламной шумихи). После этого мы
попытаемся отделить реальность от фантазий, объяснив, что язык Java
действительно может, а что — нет.
На первых порах между рекламными обещаниями и реальными
возможностями языка Java лежала пропасть. По мере его созревания
технология становилась все более стабильной и надежной, а ожидания
снизились до разумного уровня. Сейчас язык Java все шире используется
для создания "промежуточного программного обеспечения" (middleware),
поддерживающего связь между клиентами и ресурсами серверов (например,
базами данных).
Несмотря на то, что эти важные приложения не поражают воображение,
именно в этой области язык Java оказался наиболее полезным благодаря
своей машинной независимости, многопоточности и возможностям сетевого
программирования. Кроме того, язык Java захватил лидерство в области
встроенных систем (embedded systems), став фактическим стандартом
портативных устройств, виртуальных киосков, бортовых автомобильных
компьютеров и т.п. Однако первые попытки переписать на языке Java
широко распространенные программы для персональных компьютеров не
увенчались успехом — полученные приложения оказались маломощными и
медленными. С появлением новой версии некоторые из этих проблем удалось
решить, и все же нужно признать, что пользователям, в общем-то,
совершенно безразлично, на каком языке написаны купленные ими программы.
Мы полагаем, что основные преимущества языка Java проявятся при
создании новых видов устройств и приложений, а не при переписывании уже
существующих программ.
Язык Java как средство программирования
Как язык программирования Java перевыполнил свои рекламные обещания.
Несомненно, это один из лучших языков, доступных серьезным
программистам. Потенциально Java имеет все предпосылки, чтобы стать
великим языком программирования, однако, вероятно, сейчас уже слишком
поздно. Когда появляется новый язык программирования, немедленно
возникает неприятная проблема его совместимости с программным
обеспечением, созданным ранее. Более того, даже если изменения в эти
программы можно внести без вмешательства в их текст, создателям языка,
который так горячо приветствовался публикой, как, например, язык Java,
сложно прямо сказать: "Да, возможно мы ошиблись при разработке версии
X, но версия Y будет лучше". В итоге, ожидая появления дальнейших
улучшений, мы должны констатировать, что структура языка Java в
ближайшем будущем существенно не изменится.
Возникает очевидный вопрос: "Как удалось улучшить язык Java?".
Оказывается, это сделано не за счет усовершенствования собственно
языка программирования, а путем коренного изменения библиотек программ,
написанных на языке Java. Компания Sun Microsystems изменила все:
начиная с имен отдельных библиотечных функций (сделав их более
осмысленными) и методов работы графических модулей (изменив способ
обработки событий и частично переписав рабочие программы), и заканчивая
созданием новых свойств языка, например, средств вывода информации на
печать, которых не было в версии Java 1.0. В результате получилась
гораздо более полезная программная платформа, чем все предыдущие версии
языка Java.
Компания Microsoft выпустила в свет свой собственный продукт
под названием J++, имеющий отношение к языку Java. Язык J++
интерпретируется виртуальной машиной, совместимой с виртуальной машиной
языка Java (Java Virtual Machine) при выполнении байт-кода, но
интерфейсы с внешними кодами у этих языков значительно различаются.
Языки J++ и Java имеют практически одинаковый синтаксис. Однако
компания Microsoft создала дополнительные языковые конструкции. Все они
имеют довольно сомнительную ценность, за исключением интерфейса
Windows API. Помимо того, что у этих языков одинаковый синтаксис, их
основные библиотеки (строки, утилиты, средства сетевого
программирования, средства поддержки многопоточности, математические
библиотеки и т.п.), по существу, также совпадают.
Однако графические библиотеки, пользовательский интерфейс и доступ к
удаленным объектам у этих языков совершенно разные. В настоящее время
компания Microsoft больше не поддерживает язык J++, разработав новый
язык С#, имеющий много общего с Java, но использующий другую
виртуальную машину. В этой книге ни язык J++, ни язык С# не
описываются.
Преимущества языка Java
1) Одно из основных преимуществ языка Java — независимость от платформы, на которой выполняются программы: один и тот же код можно запускать под управлением операционных систем Windows, Solaris, Linux, Machintosh и др.
Это действительно необходимо, когда программы загружаются через
Интернет для последующего выполнения под управлением разных операционных
систем.
2) Другое преимущество заключается в том, что синтаксис языка Java похож на синтаксис языка C++, и программистам, знающим языки С и C++, его изучение не составляет труда. Правда, для программистов, владеющих языком Visual Basic, этот синтаксис, возможно, будет непривычен.
Если вы никогда не программировали на языке C++, некоторые термины,
использованные в этом разделе, будут вам непонятны. В этом случае
можете пропустить его. Пока вы доберетесь до конца главы 6, эти термины
станут для вас привычными.
3) Кроме того, Java — полностью объектно-ориентированный язык, даже в большей степени, чем C++.
Все сущности в языке Java являются объектами, за исключением немногих
основных типов (primitive types), например чисел. (Поскольку с помощью
объектно-ориентированного программирования легко разрабатывать сложные
проекты, оно заменило собой более древнее структурное программирование.
Если вы не знакомы с объектно-ориентированным программированием, главы
3-6 предоставят вам все необходимые сведения о нем.)
Однако разработать еще один, слегка улучшенный, диалект языка C++
недостаточно. Принципиально важно, чторазрабатывать программы, не
содержащие ошибок, наязы- ке Java легче, чем наязыке C++. Почему?
Разработчики языка Java долго размышляли о том, отчего программы,
написанные на языке C++, так подвержены ошибкам. Они снабдили язык Java
средствами, позволяющими исключить саму возможность создавать
программы, в которых были бы скрыты наиболее распространенные ошибки.
Для этого в языке Java сделано следующее.
4) Исключена возможность явного выделения и освобождения памяти.
Память в языке Java освобождается автоматически с помощью механизма
сборки мусора. Программист гарантирован от ошибок, связанных с
неправильным использованием памяти.
5) Введены истинные массивы и запрещена арифметика указателей. Теперь программисты в принципе не могут стереть данные из памяти вследствие неправильного использования указателей.
6) Исключена возможность перепутать оператор присваивания с оператором сравнения на равенство.
Теперь нельзя даже скомпилировать выражение if(ntries = 3) . . .
(программисты на языке Visual Basic могут вообще не заметить здесь
никакой проблемы, поскольку эта ошибка - источник большинства
недоразумений в языках С и C++).
7) Исключено множественное наследование. Оно заменено новым понятием — интерфейсом, позаимствованным из языка Objective С.
Интерфейс дает программисту почти все, что тот может получить от
множественного наследования, избегая при этом сложностей, возникающих
при управлении иерархиями классов.
Характерные особенности языка Java
Простой Интерпретируемый Распределенный Надежный Безопасный Машинонезависимый Объектно-ориентированный Высокопроизводительный Многопоточный Динамичный Не зависящий от архитектуры компьютера
В последнем разделе мы уже коснулись некоторых из этих пунктов. В
этом разделе мы: приведем цитаты из руководства по языку Java,
раскрывающие особенности языка; поделимся с читателями соображениями по
поводу отдельных свойств языка, основываясь на собственном опыте
работы с его последней версией.
Простой
Мы, хотели создать систему, которая легко программируется, не
требует дополнительного обучения и учитывает сложившуюся практику и
стандарты программирования. Поэтому, несмотря на то, что мы считали
язык C++ неподходящим для этих целей, язык Java был разработан
максимально похожим на него, чтобы сделать систему более доступной. В
языке Java нет многих редко используемых, малопонятных и
невразумительных средств языка C++, которые, по нашему мнению, приносят
больше вреда, чем пользы.
Синтаксис языка Java, по существу, представляет собой очищенный
вариант синтаксиса языка C++. В этом языке нет заголовочных файлов,
арифметики указателей (и самих указателей), структур, объединений,
перегрузки операторов, виртуальных базовых классов и т.п. (Различия
между языками Java и C++ описываются в замечаниях о языке C++,
разбросанных по всей книге.) Однако разработчики не стремились
исправить все недостатки языка C++.
Например, синтаксис оператора switch в языке Java остался
неизменным. Зная язык C++, перейти к синтаксису языка Java будет легко. Если обычно вы используете визуальную среду программирования (например Visual Basic), язык Java покажется вам сложным.
Его синтаксис часто выглядит довольно странным (хотя понять смысл
выражения не составляет труда). Важнее то, что при работе на языке Java
приходится намного больше программировать. Прелесть языка Visual Basic
заключается в том, что его визуальная среда программирования позволяет
почти автоматически создавать инфраструктуру приложения. Чтобы достичь
того же результата с помощью языка Java, необходимо программировать
вручную, но при этом получаются намного более короткие программы.
Существует, однако, и третья разновидность сред программирования,
позволяющих создавать программы с помощью технологии
"перетащить-и-опустить" ("drag-and-drop").
Другой аспект простоты - краткость. Одна из целей языка Java -
обеспечить разработку программ, которые можно было бы совершенно
самостоятельно выполнять на небольших машинах. Размер основного
интерпретатора и средств поддержки классов составляет около 40 Кбайт;
стандартные библиотеки и средства поддержки потоков (особенно номное
микроядро (self-contained microkernel)) занимают еще 17: Кбайт. Это
огромный успех. Заметим, однако, что библиотеки средств поддержки
графического пользовательского интерфейса значительно крупнее.
Объектно-ориентированный
Попросту говоря, объектно-ориентированное программирование - это
метод программирования, в центре внимания которого находятся данные
(т.е. объекты) и средства доступа к ним. Проводя аналогию со столярным
делом, можно сказать, что объектноориентированный мастер в основном
сосредоточен на стуле, который он изготавливает, и лишь во вторую
очередь его интересуют инструменты, необходимые для этого; в то же
время необъектноориентированный столяр думает лишь о своих
инструментах. Объектноориентированные свойства языка Java и C++, по
существу, совпадают.
Объектная ориентация за прошедшие 30 лет уже доказала свою ценность,
и без нее невозможно представить себе современный язык
программирования. Действительно, объектно-ориентированные особенности
языка Java сравнимы с языком C++. Основное различие между ними
заключается в механизме множественного наследования, для которого в
языке Java найдено лучшее решение, а также в модели метаклассов языка
Java.
Механизмы отражения (глава 5) и сериализации объектов (глава 12)
позволяют реализовать устойчивые объекты и средства для создания
графических пользовательских интерфейсов на основе готовых компонентов.
Если вы никогда не программировали на объектно-ориентированных
языках, внимательно изучите главы 4-6. В этих главах излагаются основы
объектно-ориентированного программирования и показываются его
преимущества при разработке сложных проектов над такими традиционными,
процедурно-ориентированными языками, как язык С или Basic.
Распределенный
Java обладает большой библиотекой программ для передачи данных
на основе таких протоколов TCP/IP (Transmission Control
Protocol/Internet Protocol-протокол управления
передачей/Интернет-протокол), как HTTP (Hypertext Transfer Protocol -
протокол передачи гипертекстов) или FTP (File Transfer
Protocol-протокол передачи файлов). Приложения, написанные на языке
Java, могут открывать объекты и получать к ним доступ через сеть с
помощью и URL-адресов (Uniform Resource Location - универсальный адрес ресурса) так желегко, как авлокальной сети.
Язык Java предоставляет мощные и удобные средства для работы в сети.
Каждый, кто когда-либо пытался писать программы для работы в Интернет
на других языках, будет приятно удивлен тем, как легко решаются на языке
Java самые трудные задачи, например, открытие сетевых соединений
(sockets connection). Элегантный механизм, состоящий из так называемых
сервлетов (servlets), делает работу на сервере чрезвычайно эффективной.
Сервлеты поддерживаются многими популярными Web- серверами. (Работа в
сети будет описана во втором томе.) Связь между распределенными
объектами в языке Java обеспечивается механизмом вызова удаленных
методов (эта тема также раскрывается во втором томе).
Надежный
Язык Java предназначен для создания программ, которые должны
надежно работать в любых ситуациях. Основное внимание в языке Java
уделяется раннему обнаружению возможных ошибок, динамической проверке
(во время выполнения программы), а также исключению ситуаций,
подверженных ошибкам... Единственное значительное отличие языка Java от
языка C++ заключается в модели указателей, принятой в языке Java,
которая исключает возможность перезаписи участка памяти и повреждения
данных.
Это свойство также очень полезно. Компилятор языка Java выявляет
такие ошибки, которые в других языках обнаруживаются только на этапе
выполнения программы. Кроме того, программисты, потратившие многие часы
на поиски ошибки, вызвавшей повреждение памяти из-за неверного
указателя, будут очень рады тому, что в языке Java такие проблемы
возникнуть в принципе не могут.
Если раньше вы программировали на языках Visual Basic или COBOL, в
которых указатели явно не используются, возможно, вам непонятно, почему
это настолько важно. Программистам на языке С повезло намного меньше.
Им нужны указатели для доступа к строкам, массивам, объектам и даже
файлам. При программировании на языке Visual Basic ничего этого не
требуется, и программист может не беспокоиться о распределении памяти
для этих сущностей. С другой стороны, многие структуры данных в языке,
не имеющем указателей, реализовать очень трудно. Для обычных структур,
вроде строк и массивов, указатели не нужны. Вся мощь указателей
проявляется лишь там, где без них нельзя обойтись, например, при
создании связанных списков. Программист на языке Java навсегда избавлен
от неверных указателей, неправильного распределения и утечки памяти.
Безопасный
Язык Java предназначен для использования в сетевой или
распределенной среде. По этой причине большое внимание было уделено
безопасности. Язык Java позволяет создавать системы, защищенные от
вирусов и постороннего вмешательства.
В первом издании мы написали: "Никогда не говори никогда",— и
оказались правы. Группа экспертов по вопросам безопасности из
Принстонского университета обнаружила первые ошибки в системе защиты
версии Java 1.0 вскоре после появления в продаже первой версии набора
инструментальных средств JDK. Более того, и они, и другие специалисты
продолжали и впоследствии находить все новые и новые ошибки в
механизмах безопасности всех последующих версий языка Java.
Положительной стороной этой ситуации является то, что группа
разработчиков языка Java заявила о своей полной нетерпимости к любым
ошибкам в системе защиты и немедленно приступила к исправлению всех
проблем, обнаруженных в механизме безопасности апплетов. В частности,
опубликовав внутренние спецификации интерпретатора языка Java, компания
Sun намного облегчила поиск скрытых ошибок в системе безопасности и
привлекла к их поиску независимых специалистов.
Это повысило вероятность того, что все ошибки в системе защиты будут
вскоре обнаружены. В любом случае обмануть систему защиты языка Java
чрезвычайно трудно. Обнаруженные до сих пор ошибки были почти
неуловимыми, к тому же их количество (относительно) невелико.
Web-страница компании Sun, посвященная вопросам безопасности, имеет следующий URL-адрес: http://java.sun.com/sfaq/.
Перечислим некоторые ситуации, возникновение которых предотвращает система безопасности языка Java.
1) Переполнение стека выполняемой программы, к которюму приводил печально известный "червь", распространявшийся в Интернет.
2) Повреждение участков памяти, находящихся за пределами пространства, выделенного процессу.
3) Считывание и запись локальных файлов при использовании
безопасного загрузчика классов, например Web-броузера, который
запрещает такой доступ к файлам.
Все эти меры безопасности вполне уместны и обычно работают
безупречно, однако осмотрительность никогда не повредит. Хотя
обнаруженные к данному моменту ошибки были далеко не тривиальными, и
все детали их поиска часто хранятся в секрете, следует признать, что
доказать безопасность языка Java, вероятно, псе же невозможно.
Со временем в язык были добавлены новые средства защиты. Начиная с
версии 1.1, в языке Java появилось понятие классов с цифровой подписью.
Пользуясь классом с цифровой подписью, вы можете быть уверенным в его
авторе. Если вы ему доверяете, то можете предоставить этому классу все
привилегии, доступные на вашей машине.
Альтернативный механизм доставки кода, предложенный компанией
Microsoft, опирается на технологию ActiveX и для безопасности
использует только цифровые подписи. Очевидно, что этого
недостаточно—любой пользователь программного обеспечения фирмы
Microsoft может подтвердить, что программы широко известных
производителей часто завершаются аварийно, создавая тем самым опасность
повреждения данных. Система безопасности в языке Java намного
надежнее, чем технология ActiveX, поскольку она контролирует приложение
с момента его запуска и не позволяет ему причинять ущерб.
Не зависящий от архитектуры
Компилятор генерирует объектный файл, формат которого не зависит
от архитектуры компьютера, — скомпилированная программа может
выполняться на любых процессорах под управлением системы выполнения
программ языка Java. Для этого компилятор языка Java генерирует
команды, байт-кода, не зависящие от конкретной архитектуры компьютера.
Байт- код разработан таким образом, чтобы на любой машине его можно
было легко интерпретировать либо на лету перевести в машиноза висимый
код.
Это не новая идея. Более 20 лет назад и в системе реализации языка
Pascal, разработанной Никлаусом Виртом (Niclaus Wirth), и в системе UCSD
Pascal применялась та же самая технология. Использование байт-кодов
дает большой выигрыш при выполнении программы (правда, синхронная
компиляция во многих случаях его компенсирует). Разработчики языка Java
прекрасно справились с разработкой набора команд байт-кода, которые
отлично работают на большинстве современных компьютеров, легко
транслируясь в реальные машинные команды.
Машинонезависимый
В отличие от языков С и C++, в спецификации Java нет аспектов,
зависящих от системы реализации. И размер основных типов данных, и
арифметические операции над ними точно определены.
Например, тип int в языке Java всегда означает 32-разрядное целое
число. В языках С и C++ тип int может означать как 16-разрядное, так и
32-разрядное целое число, а также целое число произвольного размера, по
выбору разработчика конкретного компилятора. Единственное ограничение
заключается в том, размер типа int не может быть меньше размера типа
short int и больше размера типа long int. Фиксированный размер числовых
типов позволяет избежать многих неприятностей, связанных с выполнением
программ на разных компьютерах. Бинарные данные хранятся и передаются в
фиксированном формате, что также позволяет избежать недоразумений,
связанных с разным порядком записи байтов на разных платформах
(конфликт "big endian/little endian"). Строки сохраняются в стандартном
формате Unicode.
Библиотеки, представляющие собой часть системы, определяют
машинонезависимый интерфейс. Например, в языке предусмотрен абстрактный
класс Window и его реализации для операционных систем Unix, Windows и
Macintosh.
Каждый, кто когда-либо пытался написать программу, которая одинаково
хорошо работала бы под управлением операционных систем Windows,
Macintosh и десяти разновидностей системы Unix, знает, что это очень
трудная задача. Версия Java предприняла героическую попытку решить эту
проблему, предоставив простой инструментальный набор, адаптирующий
обычные элементы пользовательского интерфейса к большому количеству
программных платформ. К сожалению, библиотека, на которую было
затрачено немало труда, не позволила достичь приемлемых результатов на
разных платформах. (При этом на разных платформах в графических
программах проявлялись разные ошибки.)
Однако это было лишь началом. Во многих приложениях машинная
независимость намного важнее изысканности графического пользовательского
интерфейса. Именно эти приложения выиграли от появления версии Java
1.0. Однако теперь инструментальный набор для создания графического
пользовательского интерфейса полностью переработан и больше не зависит
от интерфейса пользователя на главном компьютере. Новая версия более
осмысленна и, по нашему мнению, более привлекательна для пользователя,
чем предыдущие.
Интерпретируемый
Интерпретатор языка Java может пересылаться на любую машину и
выполнять байт-код непосредственно на ней. Поскольку редактирование
связей - более легкий процесс, разработка программ может стать намного
быстрее и эффективнее.
Возможно, это дает преимущество при разработке приложений, однако
приведенная цитата — явное преувеличение. В любом случае компилятор
языка Java, входящий в набор инструментальных средств JSDK (Java
Software Development Kit), работает довольно медленно. (Некоторые
компиляторы, принадлежащие к третьей разновидности, например,
компиляторы компании IBM, работают намного быстрее.) Скорость
перекомпиляции — это всего лишь один из факторов, характеризующих
эффективность среды программирования. Сравнив скорость работы сред
программирования на языке Java и языке Visual Basic, вы, возможно,
будете разочарованы.
Высокопроизводительный
Хотя обычно интерпретируемые байт-коды имеют более чем
достаточную производительность, бывают ситуации, в которых требуется
еще более высокая эффективность. Байт-коды можно "на лету" (во время
выполнения) транслировать в машинные коды для конкретного процессора,
на котором выполняется данное приложение.
Если для выполнения байт-кодов применяется интерпретатор, не следует
употреблять словосочетание "высокая производительность". Однако на
многих платформах возможен другой вид компиляции, обеспечиваемый
синхронными компиляторами (just-in-time compilers—JIT). Они транслируют
байт-код в машинозависимый код, сохраняют результат в памяти, а затем
вызывают его при необходимости. Поскольку при этом интерпретация
выполняется только один раз, этот подход во много раз увеличивает
скорость работы.
Несмотря на то что синхронные компиляторы все равно медлительнее,
чем машинозависимые компиляторы, они во всяком случае работают намного
быстрее интерпретаторов, обеспечивая для некоторых программ 10- и даже
20-кратное ускорение. Эта технология постоянно совершенствуется и в
конце концов может достичь той скорости, которую никогда не превзойдут
традиционные компиляторы. Например, синхронный компилятор может
определить, какой фрагмент кода выполняется чаще, и оптимизировать его
по скорости выполнения.
МНОГОПОТОЧНЫЙ
Обеспечивает лучшую интерактивность и выполнение программы.
Если вы когда-либо пытались организовать многопоточные вычисления на
каком- нибудь еще языке программирования, вы будете приятно удивлены
тем, как это легко сделать на языке Java. Потоки в языке Java могут
использовать преимущества многопроцессорных систем, если операционная
система позволяет это сделать. К сожалению, реализации потоков на
большинстве платформ сильно отличаются друг от друга, а разработчики
языка Java не предпринимают никаких попыток достичь единообразия.
Только код для вызова потоков остается одинаковым для всех машин; язык
Java перекладывает реализацию многопоточности на базовую операционную
систему или библиотеку потоков. (Потоки описываются во втором томе.)
Несмотря на это, именно легкость организации многопоточных вычислений
делает язык Java таким привлекательным для разработки программного
обеспечения серверов.
Динамичный
Во многих отношениях язык Java является более динамичным, чем
языки С или C++. Он был разработан так, чтобы легко адаптироваться к
постоянно изменяющейся среде. В библиотеки можно свободно добавлять
новые методы и объекты, не причиняя никакого вреда. Язык Java позволяет
легко получать информацию о ходе выполнения программы.
Это очень важно в тех случаях, когда требуется добавить код в уже
выполняемую программу. Ярким примером этого является код, который
загружается из Интернет для выполнения броузером. В версии Java 1.0
получить информацию о ходе выполняемой программы было совсем не легко,
однако нынешняя версия языка Java раскрывает перед программистом как
структуру, так и поведение объектов выполняемой программы. Это
весьма ценно для систем, которые должны анализировать объекты в ходе
выполнения программы. К таким системам относятся средства создания
графического пользовательского интерфейса, интеллектуальные отладчики,
сменные компоненты и объектные базы данных.
Язык Java и Интернет
Идея проста— пользователи загружают байт-коды языка Java из Интернет
и выполняют их на своих машинах. Программы Java, работающие под
управлением Web-броузеров, называются апплетами. Для использования
апплета нужен Web-броузер, поддерживающий язык Java и способный
интерпретировать байт-коды. Лицензия на исходные коды языка Java
принадлежит компании Sun, настаивающей на неизменности как самого
языка, так и структуры его основных библиотек. К сожалению, в
реальности все не так. Разные версии броузеров Netscape и Internet
Explorer поддерживают разные версии языка Java, причем некоторые из
этих версий значительно устарели. Эта достойная сожаления ситуация
создает все больше препятствий при разработке апплетов, позволяющих
использовать преимущества последней версии языка Java. Чтобы решить эту
проблему, компания Sun разработала программу Java Plug-in, позволяющую
создавать наиболее современную среду для запуска программ на языке
Java на основе броузеров Netscape и Internet Explorer.
Загрузка апплета напоминает внедрение изображения в Web-страницу.
Апплет становится частью страницы, а текст обтекает занятое им
пространство. Однако отличие заключается в том, что изображение теперь
является живым (alive). Оно реагирует на команды пользователя, изменяет
свой внешний вид и обеспечивает пересылку данных между компьютером, на
котором просматривается апплет, и компьютером, управляющим этим
апплетом.
Загрузка апплета напоминает вставку рисунка в Web-страницу. Апплет
становится частью страницы, а текст обтекает занимаемое им место. Дело в
том, что изображение является 'живым'. Оно реагирует на команды
пользователя, изменяет свой внешний вид и выполняет пересылку данных
между компьютером, на котором выполняется апплет, и компьютером,
управляющим этим апплетом.
На рис. 1.1 показан хороший пример динамической Web-страницы,
выполняющей сложные вычисления и применяющей апплет для изображения
молекул. Чтобы лучше понять структуру молекулы, можно вращать ее либо
изменять масштаб изображения, используя мышь. Такие манипуляции нельзя
реализовать на статических Web- страницах, однако апплеты делают это
возможным. (Этот апплет можно найти по адресу http :
//jmol.sourceforge.net.)
Рис. 1.1. Апплет Jmol
С помощью апплетов на Web-страницу можно добавлять новые кнопки и
текстовые поля. Однако такие апплеты медленно загружаются по телефонной
линии.
Почти то же самое можно сделать с помощью языка Dynamic HTML, форм
языка HTML (Hypertext Markup Language — язык разметки гипертекстов) или
языка сценариев, например, языка JavaScript. Разумеется, первые апплеты
предназначались для анимации: вращающиеся глобусы, танцующие персонажи
мультфильмов, вычурные тексты и т.п. Однако большинство из
перечисленного могут делать и анимированные GIF-файлы, а язык Dynamic
HTML в сочетании с разработкой сценариев делает намного больше, чем
апплеты.
В результате несовместимости броузеров и несогласованности процесса
загрузки через медленные сетевые соединения апплеты, предназначенные
для Web-страниц, не стали огромным достижением. В локальных сетях
(intranets) ситуация совершенно иная. В них обычно не возникают
проблемы, связанные с пропускной способностью канала, поэтому время
загрузки апплетов несущественно. В локальной сети можно выбирать нужный
броузер или применять программу Java Plug-In. Сотрудники не могут
переместить программу, доставленную через сеть, в неправильное место
или неверно ее установить, а системному администратору не нужно
обходить все клиентские машины и обновлять на них программы. Большое
количество программ, предназначенных для учета товаров, планирования
отпуска, возмещения транспортных расходов и тому подобного, были
разработаны многими корпорациями в виде апплетов, использующих
броузеры.
Пока мы писали книгу, маятник вновь качнулся от клиентских
программ в сторону программирования серверных приложений (server-side
programming). В частности, прикладные серверы (application servers)
могут использовать мониторинговые возможности виртуальной машины Java
для автоматического выравнивания нагрузки, объединения связей с базой
данных, синхронизации объектов, безопасного завершения работы и
повторной загрузки, а также для выполнения других процессов,
необходимых для масштабируемых серверных приложений, которые почти
невозможно корректно реализовать. Таким образом, программисты,
создающие приложения, получили возможность купить эти сложные
механизмы, вместо того, чтобы разрабатывать их самостоятельно. Это
повысило производительность труда программистов — они сосредоточились
на логике своих программ, не отвлекаясь на детали, связанные с работой
серверов.
|