Павел Храмцов
Начало 1996 года было ознаменовано появлением нового языка программирования Java. Если быть более точным, то компьютерное сообщество могло "пощупать" это новое произведение компании Sun Microsystems еще весной 1995 года, когда впервые на компьютерах этой фирмы появилась программа просмотра страниц WWW - HotJava. На домашней странице WWW Consortium технология Java была внесена в список так называемых "мобильных кодов" - одного из перспективных направлений развития WWW. И вот в конце 1995 года начался бум технологии Java, который к моменту проведения выставки Unix-Expo`96 докатился и до России. На этой выставке Sun устроила действо под девизом "Java - революция на Internet". Не менее впечатляющая компания по пропаганде Java была развернута и в печати. При этом популяризацией возможностей этого языка сегодня занимаются уже не только специализированные компьютерные издания, но и, подражая таким солидным изданиям как "The Economist" и "The New York Times", статьи на тему Java разместили даже "Коммерсант Дейли" и "Известия". И это при том, что ничего в действительности существенного еще не произошло, если не считать, что новую технологию лицензировали с десяток компаний. Речь теперь ведется не просто о языке, а о технологии Java, которая призвана осуществить революционный прорыв в реализации распределенной обработки данных на сети Internet. Не впадая в эйфорию от возможностей новой технологии, но и не отметая сразу этих возможностей как обычный маркетинговый ход, попробуем разобраться в том, что такое Java-технология, в чем ее сила, какие существуют проблемы и сможет ли она стать столь же популярной, как и World Wide Web.
Исторический экскурс
Вынесенное в заголовок название было навеяно историей появления Java, приведенной в материалах, любезно подготовленных Sun для выставки Unix-Expo`96. Согласно этой истории, технология Java (сорт кофе) родилась из проекта Oak, или Дуб, основной целью которого была разработка объектно-ориентированных средств описания и коммуникации различного рода электронных устройств. Из-за неудачи этого проекта в 1994 году опыт, накопленный в рамках его реализации, решено было применить к продуктам, ориентированным на Internet. В апреле 1995 года по сети стала свободно распространяться HotJava - интерфейс просмотра страниц WWW для платформ Sun. Буквально через месяц компания Netscape Communication, законодатель мод в области разработки программ-интерфейсов для Internet, покупает лицензию на Java. Сегодня HotJava реализована не только для среды Solaris, но и для других Unix-платформ и NT. Кроме HotJava мобильный код Java может интерпретироваться и второй версией программы Netscape Navigator для всех систем, кроме Windows 3.x. Посмотрим, на фоне каких событий разворачивается внедрение новой технологии.
Главным событием 1995 года стал бурный рост применения глобальной сети Internet для бизнеса в его самых различных проявлениях. Этот бум был вызван, во-первых, наличием хороших сетевых интерфейсных программ, первое место среди которых занимает Netscape Navigator, а во-вторых, наличием развитой системы телекоммуникаций, обеспечивающей доступ в Internet большого количества потенциальных потребителей. Как известно, Internet имеет несколько слабых мест, сдерживающих его применение в серьезных коммерческих приложениях: безопасность и недостатки технологий работы с WWW. Протокол TCP/IP не имеет встроенных механизмов обеспечения безопасности, следовательно для организации виртуальных защищенных сетей на основе Internet необходимы дополнительные программные средства. Есть целый букет проблем, связанных с технологией World Wide Web: отсутствие возможности организации виртуального канала связи, для удаленных и распределенных вычислений; отсутствие поддержки средств мультимедиа; большая нагрузка на сеть при реализации интерактивных приложений в случае организации доступа к ресурсу по принципу "каждый с каждым". Именно на решение некоторых из этих задач и была ориентирована Java-технология.
Java-технология
Пришло время сказать о том, что понимается под словосочетанием "Java-технология". Java-технология состоит из трех основных систем: программирования на объектно-ориентированном языке Java в классическом смысле этого слова, разработки мобильных Java байт-кодов и программирования JavaScript. Первые две системы были предложены Sun, а JavaScript - это творение Netscape. Рассмотрим сначала общие свойства каждого компонента этой триады, а затем посмотрим на их место в сложившейся технологии World Wide Web.
Система программирования в среде Java позволяет компилировать программы для компьютерной платформы, на которой она стоит в том же ключе, как и любая другая, например, Си или С++. В этом случае главным отличием Java-программ, или Java-applications, является использование библиотеки Java-классов, обеспечивающей разработку безопасных, распределенных систем. При этом утверждается, что язык позволяет делать гораздо меньше ошибок при разработке программ, главным образом вследствие отсутствия в Java адресной арифметики. Анализировать возможности "проколов" в компиляторе Java пока представляется крайне затруднительным - язык широко не применяется и хакеры еще не приступили к его пристальному изучению, в отличии от других компонентов Java-технологии, где "дырочки" обнаружились незамедлительно. А вот по поводу отсутствия адресной арифметики можно сказать, что у дедушки языков программирования - Фортран ее тоже не было, но затем в других языках программирования она появилась и стала чрезвычайно мощным средством повышения эффективности программных кодов. Понятно, что ни о какой мобильности откомпилированного приложения говорить не приходится, а для его переноса необходим соответствующий компилятор и библиотеки. По сравнению с существующими средствами построения распределенных систем Java - это большой шаг вперед, но многие ли разработчики страниц Web воспользуются этой возможностью?
Гораздо более интересной является разработка мобильных Java байт-кодов, которые в терминах Java-технологии называются апплеты (applets). Концепция была специально разработана для использования в World Wide Web. Задача апплетов - "оживить" Web. Типичный пример такого применения апплетов - приветствующий пользователя симпатичный человечек из документации по программе HotJava. Для использования апплетов в язык гипертекстовой разметки HTML был введен специальный тег APPLET, указывающий имя апплета и параметры его вызова. При этом обработка HTML-документа программой-интерфейсом происходит также, как и при обработке встроенной в документ графики. Сначала запрашивается документ, анализируется его содержание, а потом, если имеются теги APP, подгружаются апплеты. После получения всех апплетов они могут быть выполнены. Из этой схемы ясно, что программа интерфейс является одновременно и интерпретатором байт-кода Java. Используя библиотеку классов Java, можно разработать довольно эффектные динамические мультимедийные страницы. Кроме этого, применение байт-кода позволяет организовать распределенные процедуры вычислений с использованием различных серверов, с которыми можно взаимодействовать по разным протоколам.
Проблема безопасности
Возможность подключения новых протоколов обмена декларируется в Java как одно из достоинств нового подхода. Но даже у неискушенного пользователя сразу возникает закономерный вопрос о безопасности машины, на которой запускается приложение. Как быть с традиционным девизом "доверяй, но проверяй", незаменимым при копировании неизвестного программного обеспечения? Не надо быть семи пядей во лбу, чтобы понять - при использовании HotJava или Navigator пользователь вольно или невольно запускает на своей машине чужие программы, которые могут не только "оживить" HTML-страницы, но и несколько "встряхнуть" владельца компьютера, где эти страницы "оживают". Ведь в принципе, апплеты могут выполняться и незаметно для пользователя в фоновом режиме. Ответ на этот вопрос прост: при разработке апплетов используется компилятор байт-кода, который имеет встроенную систему безопасности, а сама программа просмотра также анализирует получаемый байт-код на наличие в нем запрещенных операций. Однако, если отбросить детали механизмов защиты HotJava и Navigator, все сводится к запретам записи информации на диск и по адресам оперативной памяти с использованием адресной арифметики. Совершенно очевидно, что этого явно недостаточно для построения надежно защищенной системы. Существует масса способов внедрения в систему и без указанных действий, не говоря уже о весьма непроизводительном использовании ресурсов компьютера.
Первая ласточка уже появилась. Речь идет о сообщении CERT о возможности разработки апплетов, использующих брешь в системе DNS и подменяющих IP-адреса. Правда эта "дырочка" была обнаружена в Navigator, а не в HotJava, но и популярность первой программы не идет ни в какое сравнение с популярностью продукта Sun. Netscape уже объявила о том, что в систему защиты будут внесены изменения и программа будет проверять IP-адреса, с которыми работает апплет на идентичность с IP-адресом HTTP-сервера, где апплет получен. Но естественно возникает вопрос: как же быть в этом случае с распределенными вычислениями, которые, как декларируется, должны произвести революцию на Internet? В принципе существует пока два способа защиты: запрет выполнения Java байт-кода программой-интерфейсом и использование проверенных страниц. Запретить выполнение можно, включив специальный режим настройки программ HotJava и Navigator. Вообще же говоря, в телеконференции comp.lang.java энтузиасты новой технологии на проблему безопасности реагируют примерно так - "мы же честные люди и не собираемся писать всякие пакости". Для реальной же защиты в программу-интерфейс придется вставить полноценный firewall с возможностями конфигурирования портов и анализа содержания пакетов, однако и это, как показывает практика, еще не гарантирует к стопроцентной безопасности.
Третьей составляющей Java-технологии является язык сценариев управления просмотра гипертекстовых страниц JavaScript. Этот язык - в девичестве "LiveWare" - разрабатывался компанией Netscape Communication еще до анонсирования Java. Для специалистов в области теории и практики гипертекстовых систем появление этого языка было давно ожидаемым событием. Практически любая локальная система имеет средство описания сценариев просмотра своих информационных страниц - появление такого механизма в World Wide Web было делом времени. При этом и теория и практика реализации языка были достаточно хорошо изучены, начиная от демонстраций Дуга Энжельбарда и кончая системами типа Hyper Card, Hyper Note, KMS и т.п.. Кроме этого, появление фреймов, многооконность, динамическая загрузка страниц и ряд других расширений, предложенных компанией Netscape, явно указывали направление развития Navigator. Надо сказать, что технология Java по своей архитектуре очень напоминает LiveWare - та же возможность разработки приложений для сервера HTTP, мобильный код, исполняемый Navigator. Но, кроме этого, в HTML-страницы можно встраивать еще и исходные тексты программ, что превращает Navigator в полноценную среду программирования, которую можно применять не только при путешествиях по Internet, но и в локальных системах. Используя JavaScript, можно организовать многооконный интерфейс с локальной контекстной справочной системой и встроенной графикой, возложив при этом многие вопросы проверки вводимых пользователем данных на JavaScript. По своим функциональным возможностям JavaScript довольно сильно уступает Java, по крайней мере пока. Можно организовать открытие нового окна, прокрутку текста, запрограммировать калькулятор, которых на сети уже более двух десятков, проверку ввода, но не более того.
Работа с объектами
Объектно-ориентированный характер JavaScript - это отдельная интересная тема. Если с Java более или менее все понятно (имеется декларация объектов, наследование свойств объектов и т.п.), то с JavaScript все несколько иначе. В целом язык ориентирован на встроенные объекты Netscape Navigator: окна, формы, поля форм, элементы рабочих областей Navigator и т.п. Это сильно облегчает обучение языку и позволяет сразу писать интересные и полезные программы. Но вот с наследованием свойств объектов и обменом данными между различными объектами, например двумя окнами Navigator, дела обстоят из рук вон плохо. Эти возможности вообще никак не реализованы. Правда имеется, например подкласс parent класса window, но пока JavaScript - это просто обычный язык сценариев просмотра HTML-страниц.
Справедливости ради надо сказать, что Navigator из-за JavaScript стал довольно тяжелой программой для ПК. При организации HTML-страниц со встроенной графикой и JavaScript-функциями открытия/закрытия окон с проверкой ввода ресурсов 486-го компьютера с 8 Мбайт памяти и средой Windows 3.x хватает едва-едва. Аналогичная ситуация происходит и при использовании NT c 16 Мбайт памяти. Вообще говоря, пользоваться JavaScript следует аккуратно, думая о потенциальных пользователях. Так, например, на выставке UnixExpo была продемонстрирована возможность размещения на Web-странице бегущей строки рекламы. Однако ее положение в status bar при переходе к другой странице довольно сильно мешает пользователям, которые используют медленные линии для подключения к сети - именно в этом поле отображается статистика переданных байтов от сервера клиенту. К тому же бегущая строка, особенно для пользователей Windows 3.x, хороша только в том случае, если на ней не задерживаться. Функция setTimeout, выполняющая отложенный вызов прокрутки текста, приводит к отъеданию ресурсов системы, что часто приводит к зависанию машины, если оставить ПК со страницей, имеющей бегущую строку, без присмотра. Из разъяснений, полученных в телеконференции comp.lang.javascript списка javascropt@oberon.org, следовало, что отложенное выполнение порождает новый поток, если речь идет о многопотоковых операционных средах, а так как Windows 3.x таковой не является, то функция реализуется путем рекурсии, что и приводит к "поеданию" ресурсов. Наиболее логичным выходом в этой ситуации принято считать установку 32-разрядной ОС Windows`95 или NT. Однако и переход на NT не решает этой проблемы - сама ОС требует гораздо больше ресурсов. Кроме того довольно часто и при использовании HotJava, и при использовании Navigator в среде NT появляется сообщение "protection violation" с последующим аварийным завершением программы.
Место новой технологии в WWW
Какаво же место Java-технологии в среде World Wide Web, где собственно ей и прочат прорыв к новым высотам. Рассмотрим схему взаимодействия программ в рамках Web приведенную на рисунке.
Схема взаимодействия программ в WWW
Как видно из приведенной схемы, при использовании обычных программ-интерфейсов Java-приложения могут быть использованы только в качестве API-модулей сервера или CGI-скриптов, что не выделяет их из общего набора других программ, написанных для использования в World Wide Web. Область применения Java расширяется только в случае применения Navigator - здесь уже можно создать набор applet-ов, которые будут выполняться при помощи Navigator, а также страницы с кодом JavaScript. При использовании HotJava и JDK 1.0 (Java Development Kit) можно расширить возможности интерфейсной программы за счет разработки новых модулей.
Резюме
Теперь, опираясь на изложенные замечания, обсудим некоторые высказывания о Java-технологии, которые можно встретить в рекламных листках и прессе.
"Java - это современный язык для разработки приложений, созданный компанией Sun Microsystems, специально для распределенных сред. Архитектура языка снимает бремя вычислений с настольных станций, перекладывая его на серверы, которые собственно и доставляют приложения пользователям."
В этом сообщении следует обратить внимание на второе предложение. Если речь идет о сервер-приложениях, то здесь нет ничего нового относительно обычной Web-технологии, представленной на рисунке. Приложения Java, как и любое другое, выполняется сервером в качестве API-приложения или CGI-скрипта. А вот в случае Java байт-кода приведенное высказывание просто ошибочно - байт-код выполняется именно на рабочей станции пользователя, а не на компьютере сервера.
"Истинная значительность Java заключается в том, что это первый язык, который позволяет разрабатывать программное обеспечение для Internet, независящее от аппаратной платформы".
Здесь все правильно, с одной только оговоркой - для любой аппаратной платформы должен существовать интерпретатор Java, как существует, например, интерпретатор Basic или Tcl/Tk для X Window, скрипты которого можно также передавать по сети, если использовать Tk-интерфейс для World Wide Web, разработанный гораздо раньше Java.
"Язык Java может быть использован для создания двух различных типов программного обеспечения: автономного, которое может выполняться на машине без операционной системы и работает непосредственно на Вашей настольной станции, а также для миниатюрных приложений (апплетов), которые запускаются с помощью написанного на Java Web-броузера, например Netscape Navigator 2.0".
Во-первых, о работе без операционной системы - это что-то уж больно круто. Скорее всего предполагается, что ОС все же будет иметь место, но будет также написана на Java или станет использовать аппаратные реализации Java. В этом случае, естественно, предполагается наличие возможности записи на диск. О бездисковых Internet-терминалах вообще не хочется говорить. Иметь компьютер, который полностью зависит от линий связи в нашей действительности, просто непозволительная роскошь.
Во-вторых, о том что Netscape Navigator 2.0 был написан на Java, кроме как в рекламе Sun, нигде больше не упоминается. Кроме того, любой, кто запускал HotJava и Navigator, может воочию убедится, что программа, созданная обычным способом работает гораздо быстрее, чем HotJava, да и вообще все это очень сильно смахивает на японские компьютеры пятого поколения, аппаратно реализующие Prolog.
У физиков существует негласное правило - не принимать к рассмотрению работы, противоречащие фундаментальным законам природы. Так же и в случае с "желудевым кофе" - наивно ожидать от интерпретатора эффективности выше чем от программы, сгенерированной компилятором, или уповать на то, что чужая программа, допущенная на ваш компьютер обязана всегда быть абсолютно чистой, как в смысле вирусов, так и в смысле случайных ошибок. К тому же пока неясно, чем, например, новая технология Java лучше любого из многочисленных брандмауэра.